diff --git a/docs/continuations/charles-downs-style-archive/workstream.json b/docs/continuations/charles-downs-style-archive/workstream.json new file mode 100644 index 000000000..5bddac0c4 --- /dev/null +++ b/docs/continuations/charles-downs-style-archive/workstream.json @@ -0,0 +1,51 @@ +{ + "branch": "docs/charles-downs-style-archive", + "contract": { + "authorization": { + "approval_mode": "never", + "mode": "full_non_destructive", + "retained_gates": [ + "destructive", + "credential", + "paid_spend", + "public_send", + "runtime_or_host_mutation" + ], + "reversible_in_scope": "proceed_without_confirmation", + "sandbox": "workspace-write" + }, + "conductor": { + "boundary_rule": "recheck_remaining_runway_before_each_packet", + "expiry_rule": "stop_or_emit_successor_before_zero", + "lane_selection": "derive_from_live_capabilities", + "mode": "route_bounded_packets", + "provider_and_model": "provider_neutral" + }, + "runway": { + "deadline_at": "2026-08-03T23:45:53+00:00", + "deadline_epoch": 1785800753, + "duration_seconds": 86400, + "requested": "1d", + "started_at": "2026-08-02T23:45:53+00:00", + "started_epoch": 1785714353 + }, + "schema": "limen.workstream.contract.v1" + }, + "private_capsule": { + "content": "redacted", + "modules": [ + "README.md", + "manifest.md", + "workstream.json", + "workstream-contract.py", + "intent.md", + "runtime.md", + "closeout.md", + "kickstart.sh", + "capsule.identity" + ] + }, + "schema": "limen.workstream.receipt.v1", + "slug": "charles-downs-style-archive", + "workstream": null +} diff --git a/docs/continuations/charles/downs-style-archive-audit.md b/docs/continuations/charles/downs-style-archive-audit.md new file mode 100644 index 000000000..6cfc63782 --- /dev/null +++ b/docs/continuations/charles/downs-style-archive-audit.md @@ -0,0 +1,85 @@ +# Downs Style public-post archive audit + +**Verified:** August 2, 2026 + +**Result:** 258 public dated posts, spanning December 4, 2017 through August 2, 2026 + +This is the complete public archive visible through Downs Style's live dated-post surfaces at the time of the audit. It is an evidence set for Charles's writing system—not a claim about private drafts, deleted pages, or sole authorship. + +## Completeness result + +- 258 unique canonical post URLs were independently enumerated across the [XML sitemap](https://www.downsstyle.com/sitemap.xml), the homepage, and all nine paginated Squarespace collection feeds. +- The sitemap exposed 257 posts. The collection feeds exposed all 258. +- The one post missing from the sitemap was the August 2, 2026 rose-water post; both its collection feed and the homepage exposed it. +- Every URL returned HTTP 200. There were no fetch or parse failures, no redirects, no empty extracted bodies, and no duplicate nonempty extracted-body SHA-256 fingerprints. +- All 258 live pages carried the author metadata `Chas Downs`. +- The smallest extracted post was 50 words; the largest was 1,195. The median across all public posts was 265 words. + +The completeness claim is deliberately bounded: it covers public dated-post pages reachable through the site's live collection architecture on the verification date. A private, draft, deleted, or completely unlinked page cannot be proven absent from public-facing evidence alone. + +## Archive by category + +| Category | Posts | Share | +| --- | ---: | ---: | +| Skincare | 112 | 43.4% | +| Masks | 51 | 19.8% | +| Look Book | 36 | 14.0% | +| Candles | 18 | 7.0% | +| Eat | 12 | 4.7% | +| Interior Design | 8 | 3.1% | +| Gift Inspo | 7 | 2.7% | +| Travel | 7 | 2.7% | +| Workouts/Diet | 7 | 2.7% | +| **Total** | **258** | **100.0%** | + +Skincare and masks together account for 163 posts, or 63.2% of the archive. Clothing is still a meaningful established lane through the 36-post Look Book collection, while the 18 candle posts give the proposed candle-care article a real historical home. + +## Archive by year + +| Year | Posts | +| --- | ---: | +| 2017 | 16 | +| 2018 | 78 | +| 2019 | 22 | +| 2020 | 54 | +| 2021 | 22 | +| 2022 | 5 | +| 2023 | 36 | +| 2024 | 24 | +| 2025 | 0 | +| 2026 | 1 | +| **Total** | **258** | + +## Evidence architecture + +The archive now feeds a three-stage system: + +1. **Corpus and provenance:** [downs-style-post-ledger.csv](downs-style-post-ledger.csv) records public metadata, discovery rails, status, word counts, and content fingerprints. +2. **Voice assembly:** [downs-style-voice-metrics.json](downs-style-voice-metrics.json) contains aggregate, non-verbatim measurements; [downs-style-natural-center.yaml](downs-style-natural-center.yaml) turns those measurements into a computable identity. +3. **Channel style sheet:** [downs-style-channel-profile.yaml](downs-style-channel-profile.yaml) translates the Natural Center into website and myth-callout rules. [downs-style-voice-evidence.md](downs-style-voice-evidence.md) keeps every major editorial decision traceable to evidence. + +The raw article-body corpus was created only as a transient local analysis input and is not tracked. No article body appears in these deliverables. Historic tags remain in the provenance ledger, but they were excluded from voice derivation because the site's tag field is noisy and often mechanically expanded. + +## Causal baseline + +The voice baseline includes 257 posts published through December 31, 2024. It intentionally excludes the August 2, 2026 rose-water post because that article was produced before this audit; including it would let newer assisted copy teach the system what it was supposed to discover from Charles's earlier history. + +The baseline contains 76,597 alphabetic tokens. Sentence and paragraph boundaries are heuristic because older pages mix prose, lists, and shopping modules. Phrase counts are literal and case-insensitive. These measurements describe the published corpus; they do not establish that every claim in it was true or that every word had one author. + +## Reproduction + +```sh +python3 scripts/audit-downs-style-archive.py \ + --output docs/continuations/charles/downs-style-post-ledger.csv \ + --corpus-json /tmp/downs-style-corpus.json + +python3 scripts/analyze-downs-style-voice.py \ + --corpus-json /tmp/downs-style-corpus.json \ + --output docs/continuations/charles/downs-style-voice-metrics.json \ + --baseline-cutoff 2024-12-31 +``` + +Current artifact fingerprints: + +- Ledger SHA-256: `00568b0f472b0e6cf7792064c40a1f8c32dde764195109e27d507684bd88dcad` +- Metrics SHA-256: `65e090919ea2eb44e3f565f09a51f1f145bc6cac99a81cd598a662c4e9bbd98e` diff --git a/docs/continuations/charles/downs-style-channel-profile.yaml b/docs/continuations/charles/downs-style-channel-profile.yaml new file mode 100644 index 000000000..b9a21e1bc --- /dev/null +++ b/docs/continuations/charles/downs-style-channel-profile.yaml @@ -0,0 +1,81 @@ +profile_id: downs-style-charles +display_name: "Downs Style — Charles" +organ: consulting +repos: [] + +voice: + tone: "warm, personal, sensory, candid, decisive" + perspective: first_person_singular + audience_relationship: "a stylish friend sharing a considered favorite" + tagline: "Personal taste, honest drawbacks, and a clear verdict." + hashtags: [] + natural_center: "./downs-style-natural-center.yaml" + evidence: "./downs-style-voice-evidence.md" + +platforms: + website: + base_url: "https://www.downsstyle.com" + cms: squarespace + workflow: draft_review_publish + +channels: + - channel_id: downs-style-blog + platform: website + enabled: true + max_length: 12000 + guidance: + title: "Lead with the product, material, question, or personal point of view; use title-case restraint." + opening: "Start with one personal discovery, desire, question, or ritual—not a search-result definition." + movement: + - "personal hook" + - "specific material or sensory evidence" + - "reaction or contrast" + - "honest qualification" + - "use-case verdict" + - "optional disclosed shopping invitation" + paragraphing: "One thought per paragraph; usually one to three sentences." + comparison_rule: "Every item reacts to the previous one; never end with a catalogue-style recap." + commerce_rule: "Verify destination, price-sensitive language, and disclosure before publication; place disclosure close to the relevant link." + + - channel_id: downs-style-myth-callout + platform: website + enabled: true + max_length: 800 + guidance: + use: "Place one small correction beside each substantive section when a real misconception or common error affects the reader's decision." + label: "Use 'Myth' only with evidence that the belief is common; otherwise use 'Common error.'" + structure: + - "mistaken idea in one sentence" + - "sourced correction in two or three sentences" + - "why the distinction matters" + - "Charles's practical takeaway" + source_rule: "Link a primary, standards, government, academic, or official source; a retailer page is not independent proof." + voice_rule: "Sound like Charles clearing up something useful, not a textbook scolding the reader." + +editorial: + article_lengths: + focused_review: "300–500 words when the evidence fits" + reported_explainer: "700–1,000 words, with no padding" + comparative_feature: "900–1,400 words when multiple use cases require it" + favored_language: + - "I love" + - "my favorite" + - "for me" + - "however" + - "overall" + restraint: + - "Do not repeat a signature phrase as a fill-in-the-blank device." + - "Keep exclamation marks rare; historical enthusiasm lives mainly in word choice." + - "Use second person to help the reader choose, not to make universal claims." + truth_gate: + - "Verify current products, names, ingredients, prices, availability, and care instructions." + - "Distinguish fiber, yarn, construction, finish, certification, and marketing name." + - "Attribute manufacturer claims and prefer primary or independent authoritative evidence." + - "No invented personal use, results, ownership, conversation, or founder motive." + - "No medical promises, universal suitability, or unsupported sustainability claims." + - "Disclose sponsorship and affiliate relationships clearly and close to the link." + +calendar: + events: [] + +rss_feed_url: "" diff --git a/docs/continuations/charles/downs-style-natural-center.yaml b/docs/continuations/charles/downs-style-natural-center.yaml new file mode 100644 index 000000000..2506a0d2a --- /dev/null +++ b/docs/continuations/charles/downs-style-natural-center.yaml @@ -0,0 +1,121 @@ +# Portable Natural Center profile derived from the public Downs Style archive. +# The embedding is intentionally empty until an embedding provider generates it. +brand_id: downs-style +version: 1 + +thematic_core: + primary: "Personal rituals of style, beauty, clothing, and home, judged through Charles's lived taste." + secondary: "Accessible luxury: the pleasure of a beautiful product balanced by use, price context, drawbacks, and a clear verdict." + +aesthetic_signature: >- + A polished but approachable editorial world built around tactile materials, + scent, skin feel, fit, atmosphere, and the small rituals that make an object + worth keeping. This is a textual signature; the archive audit did not derive + a complete visual system from photography. + +tonal_vector: >- + First-person singular, warm, openly enthusiastic, sensory, candid, and + decisive. Charles sounds like a stylish friend who has genuinely noticed the + product: he names what drew him in, lets pleasure be visible, admits the + drawback, and tells the reader where he lands without becoming clinical or + corporate. + +narrative_bias: >- + Begin with a personal discovery, desire, or familiar ritual; move into + material and sensory specifics; let each section react to the one before it; + introduce a real qualification; close with a use-case verdict and, only when + relevant, a transparent shopping invitation. + +symbolic_markers: + - "the favorite discovered through use" + - "the everyday ritual made more beautiful" + - "texture, scent, drape, fit, and atmosphere" + - "luxury compared with a practical alternative" + - "enthusiasm followed by an honest however" + - "a personal overall verdict" + - "the reader invited to inspect or shop, never pushed" + +negative_space: + - "anonymous corporate we when Charles means I" + - "catalogue copy in which every item receives the same praise" + - "generic SEO padding or a recap that merely repeats the product list" + - "invented ownership, use, results, memories, or quotations" + - "copied manufacturer claims presented as editorial fact" + - "unsupported medical, wellness, environmental, or universal-suitability claims" + - "prices, availability, ingredients, or product specifications that have not been checked live" + - "undisclosed affiliate or sponsored relationships" + - "imitated typos, run-on sentences, and oversized legacy paragraphs" + - "exclamation marks used as a substitute for an actual opinion" + +# Populated by the Natural Center runtime; never fabricate a semantic vector. +brand_embedding: [] + +confidence_scores: + thematic: 0.98 + perspective: 0.99 + tonal: 0.96 + narrative: 0.92 + lexical: 0.94 + structural: 0.90 + visual: 0.45 +overall_confidence: 0.88 + +source_asset_ids: + - "downs-style-post-ledger.csv@sha256:00568b0f472b0e6cf7792064c40a1f8c32dde764195109e27d507684bd88dcad" + - "downs-style-voice-metrics.json@sha256:65e090919ea2eb44e3f565f09a51f1f145bc6cac99a81cd598a662c4e9bbd98e" + - "public-archive:downsstyle.com:2017-12-04..2026-08-02:258-posts" + +system_prompt: |- + You write and edit Downs Style in Charles's voice. + + Use first-person singular when speaking for Charles. Historical evidence is + decisive: I/me/my/mine appears about 46 times as often as we/us/our/ours in + the causal corpus. Use "we" only when a brief explicitly identifies a real + team or shared action. Never turn Charles into an anonymous brand narrator. + + Build the article around one genuine movement: a personal discovery, desire, + question, or ritual; concrete sensory or material evidence; a reaction or + contrast; one honest drawback; then a clear use-case verdict. In a comparison, + each product or material must respond to the one before it. Do not write a + catalogue in which six items receive six disconnected compliments. + + Keep Charles's warmth and taste visible. "I love," "my favorite," and a + personal "overall" judgment are historically grounded, but they are accents, + not a template to repeat in every paragraph. Enthusiasm should come from a + specific texture, scent, fit, finish, behavior, memory, or use case. Prefer + plain language and decisive sentences over expert posturing. + + Modernize the mechanics without erasing the voice: one thought per paragraph, + clean syntax, varied transitions, restrained punctuation, and no inherited + typos or run-ons. Make headings useful. A focused review can be compact; a + reported explainer can be longer, but neither should be padded for SEO. + + Separate voice from truth. The historical corpus proves how Downs Style has + spoken, not whether its old health, sustainability, ingredient, or performance + claims were correct. Verify current factual claims against primary or official + sources. Attribute brand claims. Never invent Charles's use, results, purchase, + relationship, or personal reaction. Reject medical promises, universal + suitability, unsupported environmental claims, and unverified current prices. + + When a section corrects a misconception, use a small callout labeled "Myth" + only if the misconception is demonstrably common; otherwise label it "Common + error." State the mistaken idea, the sourced correction, why the distinction + matters, and Charles's practical takeaway. Do not invent a myth for decoration. + + End with Charles's actual conclusion. Add a shopping cue only when it serves + the reader. Put sponsorship and affiliate disclosures clearly and close to the + relevant link. + +inquiries: + - dimension: visual + blocking: false + question: "Which colors, photography treatments, and layout motifs should be canonical beyond the textual accessible-luxury signature?" + reason: "The current audit measured prose and metadata, not a controlled sample of Charles's photography." + - dimension: signoff + blocking: false + question: "Should the historical reader-thanks signoff return, or should conclusions remain more editorial and direct?" + reason: "Reader thanks appeared in 88 baseline posts but nearly disappeared after 2020." + - dimension: commerce + blocking: false + question: "How often should a modern Downs Style post end with a shop cue when there is no affiliate relationship?" + reason: "Shopping language is historically common, but channel intent and disclosure requirements now vary post by post." diff --git a/docs/continuations/charles/downs-style-post-ledger.csv b/docs/continuations/charles/downs-style-post-ledger.csv new file mode 100644 index 000000000..0e385c2f5 --- /dev/null +++ b/docs/continuations/charles/downs-style-post-ledger.csv @@ -0,0 +1,259 @@ +published_date,category,collection,title,url,discovery_sources,sitemap_lastmod,http_status,final_url,author,tags,word_count,body_blocks,content_sha256,error +2017-12-04,Candles,new-blog,My Favorite Candles of the Year,https://www.downsstyle.com/new-blog/2017/12/4/my-favorite-candles-of-the-year,collection:new-blog;sitemap,2018-03-08,200,https://www.downsstyle.com/new-blog/2017/12/4/my-favorite-candles-of-the-year,Chas Downs,candle heaven;candle junkie;candles;luxury candles;luxury scents;scents,262,3,00b12aac0ab58802cb84d7697215101e5965421fe5d9b5f6a26fd0753c0e516c, +2017-12-04,Look Book,look-book,Fall LookBook,https://www.downsstyle.com/look-book/2017/12/4/fall-lookbook,collection:look-book;sitemap,2017-12-06,200,https://www.downsstyle.com/look-book/2017/12/4/fall-lookbook,Chas Downs,,77,2,ee2ed1e0c22fddea573ce40cae0a98acbc41fc79fe2e9bc61de1747aec50dcc4, +2017-12-04,Look Book,look-book,Summer Bathing Suits Lookbook,https://www.downsstyle.com/look-book/2017/12/4/2if6pau0jpto2kiixkd3qj0y0bi83z,collection:look-book;sitemap,2018-07-15,200,https://www.downsstyle.com/look-book/2017/12/4/2if6pau0jpto2kiixkd3qj0y0bi83z,Chas Downs,,145,3,0092af1f7c4547918a5cd323c4d05f32460e44b42b6d46b571de6a119c588f06, +2017-12-04,Masks,masks,GlamGlow Masks,https://www.downsstyle.com/masks/2017/12/4/glamglow-masks,collection:masks;sitemap,2018-01-22,200,https://www.downsstyle.com/masks/2017/12/4/glamglow-masks,Chas Downs,,360,2,6b516b5428b60577be23309fd9ebe01278caf1d7d9e4555d6fecb58535c669e8, +2017-12-04,Masks,masks,Sisley Masks Review,https://www.downsstyle.com/masks/2017/12/4/sisley-masks,collection:masks;sitemap,2018-09-03,200,https://www.downsstyle.com/masks/2017/12/4/sisley-masks,Chas Downs,beauty;best luxury masks;do masks work;is sisley skincare worth it;mask;should i buy sisley skincare;should i buy the sisley tropical resins mask;sisley black rose cream mask review;sisley skincare benefits;sisley tropical resins benefits;sisley tropical resins mask review;skincare benefits from masks,410,1,f02e1b6eea8d4e3022110fc51dd1c5647f708edcb430a99bfd03f554916a2e87, +2017-12-05,Interior Design,new-blog-1,House Warming Shopping Guide,https://www.downsstyle.com/new-blog-1/2017/12/5/house-warming-shopping-guide,collection:new-blog-1;homepage;sitemap,2021-06-19,200,https://www.downsstyle.com/new-blog-1/2017/12/5/house-warming-shopping-guide,Chas Downs,cute interior design;furniture;house warming;house warming guide;interior design;interior design goals,140,3,e7de4cdbeb951c8d5f0e5c711e2e3d3698b7e10e89a269f32df3cd37f392c57d, +2017-12-05,Interior Design,new-blog-1,My Room,https://www.downsstyle.com/new-blog-1/2017/12/5/my-room,collection:new-blog-1;homepage;sitemap,2018-03-08,200,https://www.downsstyle.com/new-blog-1/2017/12/5/my-room,Chas Downs,house goals;house tour;house warming;tour of my house;tour of my room,139,1,38f1e76b8ee5d8aaad0ff434bf2bea6dfa630176ddca1ae0d87683c2fe9c90db, +2017-12-05,Look Book,look-book,Cool Outfits,https://www.downsstyle.com/look-book/2017/12/5/cool-outfits,collection:look-book;sitemap,2018-09-03,200,https://www.downsstyle.com/look-book/2017/12/5/cool-outfits,Chas Downs,cool oufits 2018;cool outfit lookbook;cool outfits for back to school;cool outfits for winter;mens currated lookbook;mens fashion haul;mens lookbook;mens lookbook haul,68,2,959ec0e403d8b213f34b78358032e8970b2ba08f557725630dd1573ce1b50009, +2017-12-06,Workouts/Diet,workoutsdiet,Buy these things to begin your cute workout routine,https://www.downsstyle.com/workoutsdiet/2017/12/6/buy-these-things-to-begin-your-cute-workout-routine,collection:workoutsdiet;sitemap,2018-01-22,200,https://www.downsstyle.com/workoutsdiet/2017/12/6/buy-these-things-to-begin-your-cute-workout-routine,Chas Downs,,303,3,1659b6611ccc2be57eb3478b11648b9ddda617ca11fe0be57cbc17552b9d5cc6, +2017-12-11,Candles,new-blog,Holiday Scents I love,https://www.downsstyle.com/new-blog/2017/12/5/holiday-scents-i-love,collection:new-blog;sitemap,2018-01-22,200,https://www.downsstyle.com/new-blog/2017/12/5/holiday-scents-i-love,Chas Downs,,184,2,47a7fcbe377c929e9acd6a76032c9333e79af89ff42e07b1d473738843628212, +2017-12-11,Skincare,skincare,Glossier Skincare as Makeup?,https://www.downsstyle.com/skincare/2017/12/11/glossier-skincare-as-makeup,collection:skincare;sitemap,2018-02-20,200,https://www.downsstyle.com/skincare/2017/12/11/glossier-skincare-as-makeup,Chas Downs,,277,2,3144e825a0d36330f8bc79f3f3c697f2b9dea87c79e71ceebdf68350dde0bc49, +2017-12-11,Skincare,skincare,Sunday Riley,https://www.downsstyle.com/skincare/2017/12/11/sunday-riley,collection:skincare;sitemap,2018-09-03,200,https://www.downsstyle.com/skincare/2017/12/11/sunday-riley,Chas Downs,,421,2,8014e8c1b29fe02b191b9394b5e3b0f855e0f5ae51fef3ecc56f9ad1788264af, +2017-12-12,Look Book,look-book,"Raf Simons, a Fashion Inspo",https://www.downsstyle.com/look-book/2017/12/12/raf-simons-a-fashion-inspo,collection:look-book;sitemap,2018-06-13,200,https://www.downsstyle.com/look-book/2017/12/12/raf-simons-a-fashion-inspo,Chas Downs,adidas ozweego 2 x raf simons;adidas raf simons;adidas raf simons спустя год;fashion;raf;raf simons;raf simons (fashion designer);raf simons adidas;raf simons clothing;raf simons jumper;raf simons ozweego;raf simons ozweego 3;raf simons ozweego iii;raf simons shoes;raf simons sneakers;raf simons stan smith;simons;паленые raf simons;подделка или оригинал adidas raf simons,205,3,c97f9ad8f3681ec05891bbbe02b33c074d5b38042e43e75ad2dcc93e5aab0a45, +2017-12-12,Skincare,skincare,Farsali Drops,https://www.downsstyle.com/skincare/2017/12/12/farsali-drops,collection:skincare;sitemap,2018-10-29,200,https://www.downsstyle.com/skincare/2017/12/12/farsali-drops,Chas Downs,beauty;best skincare products;cheap moisturizer for acne;cheap moisturizer for normal skin;farsali 24kt gold beauty elixir;farsali 24kt gold beauty elixir review;farsali drops;farsali unicorn essense review;indie brand;indie brand serum reviews;indie brand skincaere;luxury serum;makeup lover;makeup review;masks;moisturizer;morning skincare routine;normal skincare routine;serum;serum review;toner,293,2,dfa6f20aa1497dd7b09cdb6f256ef4bd27044162b5255748013b55220cfbb38d, +2017-12-14,Skincare,skincare,Caudalie,https://www.downsstyle.com/skincare/2017/12/14/caudalie,collection:skincare;sitemap,2018-06-30,200,https://www.downsstyle.com/skincare/2017/12/14/caudalie,Chas Downs,,287,2,dab55bbf8b49b2c7c9c559bcafcc9c26b11e69fc86310d3488ed8ce25935f733, +2017-12-14,Skincare,skincare,Dior Addict Lip Scrub & Reviving Balm,https://www.downsstyle.com/skincare/2017/12/14/dior-lip-scrub,collection:skincare;sitemap,2018-03-12,200,https://www.downsstyle.com/skincare/2017/12/14/dior-lip-scrub,Chas Downs,chapstick;chapstick review;drug store chapstick;luxury chapstick;luxury face products;luxury lip balm that works;makeup lover;makeup review;product junkie;Sephora addict;sephora lover,199,2,989c49e9c417427e9a0330570463dd06143bc6c17e17accda44365ba546ab759, +2018-01-17,Look Book,look-book,New York LookBook,https://www.downsstyle.com/look-book/2018/1/17/new-york-lookbook,collection:look-book;sitemap,2018-06-13,200,https://www.downsstyle.com/look-book/2018/1/17/new-york-lookbook,Chas Downs,aesthetic lookbook;beauty;bikini lookbook;chanel;cool outfits;designer fashion;designer outfits;dior;dior outfits;eid lookbook;eid lookbook 2018;fashion;fashionweek;fendi;haul;haute couture;high fashion;hijab lookbook;lookbook;lookbook 2018;lookbook spring 2018;mens outfits;Milan fashion week;my style lookbook;newyorkfashionweek;night time outfit men;ootd;ootw;outfit goals;outfits;outfits for men;parisfashionweek;retro lookbook;spring;spring lookbook;spring lookbook 2018;style;summer;summer fashion;summer lookbook;summer lookbook 2018;summer outfits;trends;try on haul;versace,273,7,91f79eea0be073b1fb583df649ca1d9747324c5d16c2cb584eff25cb697ce182, +2018-01-17,Masks,masks,Fresh Rose Hydrating Mask,https://www.downsstyle.com/masks/2018/1/17/fresh-hydrating-mask,collection:masks;sitemap,2018-09-03,200,https://www.downsstyle.com/masks/2018/1/17/fresh-hydrating-mask,Chas Downs,are fresh face masks worth it;best fresh products;best luxury masks;best skincare lines;fresh hydrating mask review;fresh mask review;should i buy the fresh rose mask;skincare lines that work,160,2,f78e52720ee1bce3dae8650fe31be32f47abb3359e5d7b50fff6e50f732a2765, +2018-01-17,Masks,masks,Laneige Sleeping Mask,https://www.downsstyle.com/masks/2018/1/17/sleeping-mask,collection:masks;sitemap,2018-06-30,200,https://www.downsstyle.com/masks/2018/1/17/sleeping-mask,Chas Downs,chanel sleeping mask review;cheap luxury masks;cheap skincare that feels luxury;cheap skincare that works;cheap sleeping masks;good cheap skincare;is Laneige worth it;Laneige skincare;Laneige Sleeping Mask;skincare that works;sleeping mask that works;tatcha skincare review;tatcha sleeping mask review,122,2,6c6afb8b2545a31c08dfc8a33e082786983c34f7b019087442f74bd3c685f103, +2018-01-19,Skincare,skincare,Tatcha,https://www.downsstyle.com/skincare/2018/1/19/tatcha,collection:skincare;sitemap,2018-09-09,200,https://www.downsstyle.com/skincare/2018/1/19/tatcha,Chas Downs,best chapstick;how to get rid of acne;how to get rid of blackheads;how to get rid of dry patches;how to hydrate skin;skincare tips;skincare tips for teens;tatcha moisturizer review;tatcha review;tatcha skincare;tatcha skincare review;tatcha the water review,128,2,eb0754cb34a0a03d3f20c32e24b2573979c19a2d452377e8af3ca51498e352cf, +2018-01-21,Skincare,skincare,Kiehls,https://www.downsstyle.com/skincare/2018/1/21/kiehls,collection:skincare;sitemap,2018-03-12,200,https://www.downsstyle.com/skincare/2018/1/21/kiehls,Chas Downs,cheap eye cream that works;cheap lip balm that works;cheap masks;cheap skincare;cheap skincare for acne;cheap skincare products;cheap skincare routine;luxury face products;luxury lip balm that works;luxury moistuzier;luxury skincare for acne;luxury skincare reviews,371,2,7392db10358e73a9433788c1df7cf129d73c9d162db20917b3afbf634d727305, +2018-01-22,Skincare,skincare,Lancer Skincare,https://www.downsstyle.com/skincare/2017/12/14/lancer-skincare,collection:skincare;sitemap,2018-09-09,200,https://www.downsstyle.com/skincare/2017/12/14/lancer-skincare,Chas Downs,best luxury skincare products;is lancer skincare a good brand;is lancer skincare organic;is lancer skincare worth it;lancer moisturizer review;lancer skincare review;luxury skincare for acne;luxury skincare for adults with aging skin;luxury skincare for teens;luxury skincare reviews;luxury skincare that works;skincare that works,230,2,360103541f0f75a27f5342b0a2245736708c526bd47aeeb6609dd124ce9248cf, +2018-01-23,Masks,masks,Peter Thomas Roth Bubbling Mask,https://www.downsstyle.com/masks/2018/1/23/peter-thomas-roth-bubbling-mask,collection:masks;sitemap,2018-09-09,200,https://www.downsstyle.com/masks/2018/1/23/peter-thomas-roth-bubbling-mask,Chas Downs,acne masks that work;best masks for hydration;best oxygen mask;bubbling mask review;cool masks;do oxygen masks work;hydrating masks for the winter;masks for adults;masks for adults who want clear skin;masks for hydration;masks for teen acne;masks for the winter;masks that work for intense hydration;masks to remove makeup;oxygen mask;oxygen mask review;oxygen mask reviews;oxygen masks that work;Peter Thomas roth bubbling mask;peter thomas roth bubbling mask;Peter Thomas roth oxygen bubbling mask review;Peter Thomas roth oxygen mask;Peter Thomas roth oxygen mask review;skincare mask review;skincare tips for acne skin;skincare tips for teens;what is an oxygen mask,179,2,8526138f275b9c7ea8e4f70033a6d73cea817d2963bc1a3fa3d7d469a22eea57, +2018-01-23,Skincare,skincare,Chanel Skincare,https://www.downsstyle.com/skincare/2018/1/23/chanel-skincare,collection:skincare;sitemap,2018-09-09,200,https://www.downsstyle.com/skincare/2018/1/23/chanel-skincare,Chas Downs,chanel mask;Chanel skin care gift sets;chanel skin care line;chanel skincare;chanel skincare at Costco;chanel skincare ingredients;chanel skincare review;chanel skincare reviews;chanel skincare samples;chanel skincare set;is chanel skincare worth it;is chanel skincare worth the price;luxury serum review;luxury skincare;luxury skincare for adults with aging skin;luxury skincare for teens with acne;luxury skincare reviews;luxury skincare that works;should i buy chanel skincare;skincare that works,249,2,34826106a7e1948ba30a733152657be2f003e8320301f6d0171d71bf4c0b030b, +2018-01-29,Skincare,skincare,Evian Facial Toner,https://www.downsstyle.com/skincare/2018/1/23/evian-toner-1,collection:skincare;sitemap,2018-01-29,200,https://www.downsstyle.com/skincare/2018/1/23/evian-toner-1,Chas Downs,beauty;evian;eviantoner;skincare;skincareroutine;toner,183,2,eacf0fa63c6d0b00eb30a2975fa1ef2c16acaff60551e85b6c118c749de7a36b, +2018-02-09,Masks,masks,Kiehls Rare Earth Deep Pore Cleaning Masque,https://www.downsstyle.com/masks/2018/2/9/kiehls-rare-earth-deep-pore-cleaning-masque,collection:masks;sitemap,2018-09-09,200,https://www.downsstyle.com/masks/2018/2/9/kiehls-rare-earth-deep-pore-cleaning-masque,Chas Downs,best skincare lines;does kiehls work;how to get good skin overnight;how to get perfect skin;how to get rid of a pimple;how to get rid of a pimple overnight;how to get rid of acne;how to get rid of acne fast;how to get rid of acne for teenagers;how to get rid of acne for teens;how to get rid of acne scars fast;how to get rid of blackheads;how to get rid of dehydrated skin;how to get rid of large pimples;how to get rid of pimples;how to get rid of pimples fast;how to get rid of teen acne;how to hydrate your skin;how to remove redness from a pimple;kiehls mask;kiehls mask review;kiehls masks that work;luxury masks to get rid of acne scars;luxury masks to remove acne;masks for adult acne;masks for teen acne;masks that get rid of pimples;masks to remove black heads;masks to remove makeup;skincare masks that work;which kiehls masks are good,207,2,3e5a59c6f6361fc444d277ebcd3291591bc3961f6035070dab20f29032c625a3, +2018-02-09,Skincare,skincare,FOREO Luna Mini,https://www.downsstyle.com/skincare/2018/2/9/foreo-luna-mini,collection:skincare;sitemap,2018-09-03,200,https://www.downsstyle.com/skincare/2018/2/9/foreo-luna-mini,Chas Downs,foreo luna foto;foreo luna mini 2;foreo luna Sephora;forex;forex luna 2;forex luna fofo;forex luna mini;forex luna review;is clarinsonic good;is foreo worth it;is the foreo luna good;should i buy a foreo luna,215,2,a16bb88867e942050aa6fd8651a93fa43c3d39fb5b5cd39302a6d6b828b70dd3, +2018-02-09,Skincare,skincare,Kate Somerville Pimples Be Gone,https://www.downsstyle.com/skincare/2018/2/9/kate-somerville-pimples-be-gone,collection:skincare;sitemap,2018-02-10,200,https://www.downsstyle.com/skincare/2018/2/9/kate-somerville-pimples-be-gone,Chas Downs,,285,2,2820c763d52d3e9a3fed5a734b4c624f2afe10909ab4b0c6e919ca9c77a901e3, +2018-02-20,Skincare,skincare,Why I get facials biweekly,https://www.downsstyle.com/skincare/2018/2/11/why-i-get-facials-biweekly,collection:skincare;sitemap,2018-02-22,200,https://www.downsstyle.com/skincare/2018/2/11/why-i-get-facials-biweekly,Chas Downs,,492,2,6718aa0c1157e0fa9feab3c472714d474d64abc56e58bc4e459d193cfcbd9823, +2018-02-21,Interior Design,new-blog-1,Nest Fragrances Sicilian Tangerine Reed Diffuser,https://www.downsstyle.com/new-blog-1/2018/2/14/nest-fragrances-sicilian-tangerine-reed-diffuser,collection:new-blog-1;homepage;sitemap,2018-03-08,200,https://www.downsstyle.com/new-blog-1/2018/2/14/nest-fragrances-sicilian-tangerine-reed-diffuser,Chas Downs,candle heaven;candles;lux candles;luxurycandles;reed diffuser;reeddiffuser,260,2,3d1b43dae3355153daa1c1d78dc866b0321cbd4b3300dc6760d4731733ca7565, +2018-02-21,Skincare,skincare,Ole Hendrickson Skincare Routine,https://www.downsstyle.com/skincare/2018/2/21/ole-hendricksen-skincare-routine,collection:skincare;sitemap,2018-09-03,200,https://www.downsstyle.com/skincare/2018/2/21/ole-hendricksen-skincare-routine,Chas Downs,acne skincare routine;best skincare products;cheap masks;cheap moisturizer;cheap moisturizer for acne;cheap moisturizer for normal skin;cheap moisturizer thats good;is ole henricksen good;luxury face products;luxury moistuzier;luxury skincare;luxury skincare product review;luxuryskincare;makss;masks;moisturizer;morning skincare routine;normal skincare routine;ole henriksen balance;ole henriksen banana bright eye cream;ole henriksen mask;ole henriksen night;ole henriksen reviews;ole henriksen spa;ole henriksen truth serum;should i buy ole henricksen;skincare;skincare products review;skincare routine;skincare routine in the morning;skincareroutine,483,2,2801c682b30860a280b380c7b8e37f0d21d3233bfa0ac925b5a258ba92b4fb5f, +2018-03-02,Skincare,skincare,Estee Lauder Skincare Set,https://www.downsstyle.com/skincare/2018/2/21/estee-lauder-skincare-set,collection:skincare;sitemap,2018-06-15,200,https://www.downsstyle.com/skincare/2018/2/21/estee-lauder-skincare-set,Chas Downs,beauty;cheap moisturizer;cheap moisturizer for acne;estee Lauder skin care better than Clinique;estee Lauder skin care ingredients;estee Lauder skin care line;estee Lauder skincare;estee Lauder skincare review;estee Lauder skincare reviews;esteem Lauder free gift;esteem Lauder skin care products;esteem Lauder skincare for men;esteem Lauder skincare set;facecare;facemask;health;koreanbeauty;luxury skincare for acne;luxury skincare for teens;luxury skincare reviews;luxuryskincare;masks;skincare,532,2,1ab60db22a3a10922c70bfd6c8e92d9e66f800df3c50587bd09e5b33a75b9ac8, +2018-03-04,Candles,new-blog,February Fave Candles,https://www.downsstyle.com/new-blog/2018/3/4/my-february-fave-candles,collection:new-blog;sitemap,2018-03-12,200,https://www.downsstyle.com/new-blog/2018/3/4/my-february-fave-candles,Chas Downs,candles;candles on sale;lux candles;luxury candles;luxury scents,55,2,2f33c92032b717a969ff61fc07be6c7750b5ef58a50077dd9b47343f606afddb, +2018-03-04,Candles,new-blog,My favorite candles under $15,https://www.downsstyle.com/new-blog/2018/3/4/my-favorite-candles-under-10,collection:new-blog;sitemap,2018-03-12,200,https://www.downsstyle.com/new-blog/2018/3/4/my-favorite-candles-under-10,Chas Downs,candles;candles on sale;candles on slae;candles under $10;candles under $15;cheap candles,263,2,fdb3035f6b6ac706d56d785ffbaf8937b9616e9b778b383c0dd4be07424a77af, +2018-03-04,Masks,masks,Estee Lauder Masks,https://www.downsstyle.com/masks/2018/2/21/estee-lauder-masks,collection:masks;sitemap,2018-03-04,200,https://www.downsstyle.com/masks/2018/2/21/estee-lauder-masks,Chas Downs,esteelauder;esteelaudermasks;koreanskincare;makeup;masks;skincare,459,2,5f17690a161094592534c0316bd67d7cc4b4722ffda85e86790a87305cd7c510, +2018-03-04,Masks,masks,Glamglow Firming Mask,https://www.downsstyle.com/masks/2018/2/21/glamglow-firming-mask,collection:masks;sitemap,2018-09-29,200,https://www.downsstyle.com/masks/2018/2/21/glamglow-firming-mask,Chas Downs,glamglow firming mask review;glamglow mask review;gravity mask review;gravitymud;how to slow down aging;is glamglow a good brand;is glamglow cruelty free;is glamglow organic;is glamglow worth it;is the glamglow firming mask worth it;luxury masks to get rid of acne scars;makeup;mask review;masks;masks for adults;masks for adults who want to slow down aging;masks for aging skin;masks to get rid of smile lines;masks to get rid of wrinkles;masks to hydrate skin;Sephoraskincare;should i buy the glamglow firming mask;skincare;skincarejunkie,290,2,859b4a780c34feb8a79518c46aecec8c9ddaf1d08d19f3d278df14f12348c8c1, +2018-03-06,Gift Inspo,gifts,What I Got Myself For My B-Day,https://www.downsstyle.com/gifts/2018/3/6/what-i-got-myself-for-my-b-day,collection:gifts;sitemap,2018-04-24,200,https://www.downsstyle.com/gifts/2018/3/6/what-i-got-myself-for-my-b-day,Chas Downs,,86,2,1caba45640fb66943b9cf21875277fd68efda35ab571ab1c7773183f21d2c82d, +2018-03-27,Masks,masks,Dr. Jart+ Shake & Shot Rubber Hydro Mask,https://www.downsstyle.com/masks/2018/2/21/dr-jart-shake-shot-rubber-hydro-mask,collection:masks;sitemap,2018-09-03,200,https://www.downsstyle.com/masks/2018/2/21/dr-jart-shake-shot-rubber-hydro-mask,Chas Downs,cheap masks that work;cheap skincare;cheap skincare that feels luxury;diy mask;dr jart masks;esteelaudermasks;glamglow masks;innovative skincare;luxury masks;luxury skincare;masks;skincare;skincare junkie;skincare masks;skincare masks that work;skincare must have,248,2,7762d4c5611ce57a527f558356e2a495ebad35b1cdb733016d8ab8b72721b4a0, +2018-03-28,Skincare,skincare,Lip Treatments For Moisture & Plumping Review (Drug Store & Luxury),https://www.downsstyle.com/skincare/2018/2/14/lip-treatments-for-moisture-plumping,collection:skincare;sitemap,2018-06-15,200,https://www.downsstyle.com/skincare/2018/2/14/lip-treatments-for-moisture-plumping,Chas Downs,chapstick;chapstick review;chapstick reviews;cheap masks;cheap masks acne;lip;lip plumber 2018;lip plumber injection;lip plumber walmart;lip plumper;lip plumper device;lip plumper products;lip plumper suction;lip plumper tool;lip treatment at home;lip treatment devices;lip treatment for aging lips;lip treatment review;lip treatment that works;lip treatments for chapped lips;lip treatments for dry lips;liptreatment;luxury chapstick;luxury chapsticks;luxury masks;luxuryskincare;masks,206,3,e0da9a941cb9076e9b20a0b06cb721428d69c9db392572742256cad207404833, +2018-04-09,Candles,new-blog,Henri Bendel Candles,https://www.downsstyle.com/new-blog/2018/3/12/henri-bendel-candles,collection:new-blog;sitemap,2018-04-30,200,https://www.downsstyle.com/new-blog/2018/3/12/henri-bendel-candles,Chas Downs,candle heaven;candles;candles on sale;candles under $15;cheap candles;cheap candles that are good;Henri bendel candles;Henri bendel candles review;interior design;Irresistible candles;luxury candles;luxury scents,154,3,4060453f063025408e6b7ad669283cfd66c5a72eb160db652cf136c68a5856f3, +2018-04-17,Candles,new-blog,March Fave Candles,https://www.downsstyle.com/new-blog/2018/3/11/march-fave-candles,collection:new-blog;sitemap,2018-04-18,200,https://www.downsstyle.com/new-blog/2018/3/11/march-fave-candles,Chas Downs,candles;Henri bendel candles;luxury candles;luxury candles march 2018;luxury scents 2018;nest candles;soy candles;voluspa candles,139,2,881321536885a450b27984eafbc3f55e4723d2f5240f72396b7be733fb9af618, +2018-04-24,Skincare,skincare,Wonjini Effect... Japanese PR package,https://www.downsstyle.com/skincare/2017/12/14/wonjineffect,collection:skincare;sitemap,2018-06-15,200,https://www.downsstyle.com/skincare/2017/12/14/wonjineffect,Chas Downs,acne skincare routine;best skincare products;Chinese skincare;Chinese skincare reviews;Japanese masks;Japanese skincare;Japanese skincare review;Japanese skincare reviews;Japanese skincare that works;luxuryskincare;skincare;skincare lover;skincare products review;skincare reviews;skincare routine in the morning;skincareroutine,93,1,2ccb5d5461a334b8bfedf1e392a1280c9ebf32d9fea5e5c341f7f7f31234a102, +2018-04-28,Masks,masks,Ole Henricksen Hydra Clay Detox Mask,https://www.downsstyle.com/masks/2018/4/28/ole-hendricksen-hydra-clay-detox-mask,collection:masks;sitemap,2018-09-03,200,https://www.downsstyle.com/masks/2018/4/28/ole-hendricksen-hydra-clay-detox-mask,Chas Downs,best inexpensive masks;cheap masks;cheap masks that work;is ole henricksen good for acne skin;is Ole Henricksen skincare good;luxury masks;luxury skincare;mask obsessed;masks I need;masks im obsessed with;masks you need;Ole Henricksen hydra clay detox mask review;Ole Henricksen mask review;Ole Henricksen skincare review;Sephora skincare;skincare;skincare must have;skincare obsessed;skincarejunkie;skincarelover,210,2,b01cf2e5727f572c428ee5df5dbb2f7f918ff2582dc2dfa9d8f0a92687b8a2e4, +2018-04-29,Look Book,look-book,Gucci,https://www.downsstyle.com/look-book/2018/1/17/gucci,collection:look-book;sitemap,2018-09-03,200,https://www.downsstyle.com/look-book/2018/1/17/gucci,Chas Downs,$10000 at gucci;are gucci shoes comfortable;expensive gucci;gucci;gucci 2017;gucci bag;gucci belts;gucci campaign;gucci facts;gucci flip flops;gucci gang;gucci haul;gucci italy;Gucci key chain;Gucci keychain wallet;gucci lookbook;gucci lover;gucci mens lookbook;gucci ophidia;gucci outfit review;Gucci review;gucci shoes;gucci shoes haul;gucci shopping spree;gucci snake tie;gucci sneakers;gucci tie;haul;is gucci worth it;luxury gucci;original gucci;should I buy gucci;should I buy gucci shoes;should I buy gucci sneakers;spending money on gucci,162,2,42bc948aec4eb0f5a2045280da876c8357b552f8407cbd576b0bb6a4a39798e1, +2018-04-30,Skincare,skincare,Eminence Organic Cosmetics: Your Skin Will Thank You!,https://www.downsstyle.com/skincare/2018/4/30/eminence-organic-cosmetics-your-skin-will-thank-you,collection:skincare;sitemap,2018-09-18,200,https://www.downsstyle.com/skincare/2018/4/30/eminence-organic-cosmetics-your-skin-will-thank-you,Chas Downs,cheap masks for acne;is eminence a good brand;is eminence good for your skin;masks;masks for acne;skincare;skincare lover;skincare products review;skincare revuews,492,6,03fe03d2ab2ed5a3c8e4de6df8bfa87e47a8045e47cd31e82f4cdbd8a5c73d15, +2018-05-02,Skincare,skincare,Tatcha Deep Cleanse Face Wash Review,https://www.downsstyle.com/skincare/2018/2/11/new-tatcha-face-wash,collection:skincare;sitemap,2018-06-15,200,https://www.downsstyle.com/skincare/2018/2/11/new-tatcha-face-wash,Chas Downs,expensive skincare;masks for acne;skincare addict;skincare blog;skincare for acne;skincare for dry skin;skincare lover;skincare reviews;skincare routine in the morning;skincare that works;Tatcha;tatcha review;tatcha reviews;tatcha skincare,283,3,4db790dc35d8981e11a75f218672b999c9f07e5559cf92b249c50e729a673005, +2018-05-08,Masks,masks,$128 Sisley Red Clay Mask Review,https://www.downsstyle.com/masks/2018/2/14/sisley-red-clay-mask,collection:masks;sitemap,2020-05-07,200,https://www.downsstyle.com/masks/2018/2/14/sisley-red-clay-mask,Chas Downs,good masks for hydration;good masks for hydration review;how to hydrate your skin;is Sisley a good brand;is Sisley cruelty free;is sisley overhyped;is sisley red clay worth it;is sisley skincare worth it;is Sisley worth it;luxury masks;luxury sheet masks;luxury skincare;should i buy the sisley red clay mask;Sisley mask review;sisley red clay benefits;sisley red clay mask review;Sisley red clay mask review;sisley red clay mask worth it,204,2,01d2bd60f0632f87ee7f0cf05eb4a513152777545ac152438cec7a7a85d7fb32, +2018-05-28,Masks,masks,FARMACY Honey Potion Mask,https://www.downsstyle.com/masks/2018/5/13/farmacy-honey-potion-mask,collection:masks;sitemap,2018-09-03,200,https://www.downsstyle.com/masks/2018/5/13/farmacy-honey-potion-mask,Chas Downs,best inexpensive masks;best masks;best Sephora masks blog;best skincare lines;cool masks;diy honey mask;farmacy honey mask review;good skincare from Sephora reviews;gravitymask;honeymask;how to make a honey mask;how to make masks with honey;is the farmacy skincare line good;luxury masks;luxury skincare;masks;organic masks review;organic masks that worj;organic skincare;organic skincare review;skincare;skincare essentials,166,1,6d1011be4f9e836324fa40d8bd9c6373c697935f7ab9817465b15d179b912870, +2018-06-11,Look Book,look-book,Comme Des Garçons,https://www.downsstyle.com/look-book/2018/5/16/comme-des-garons,collection:look-book;sitemap,2018-09-03,200,https://www.downsstyle.com/look-book/2018/5/16/comme-des-garons,Chas Downs,cdg;cdg lookbook;comme;comme de garcons;comme des garcon;comme des garcons;comme des garcons homme plus;comme des garcons hoodie review;comme des garcons lookbook;comme des garcons outfits;comme des garcons play;comme des garcons review;comme des garcons supreme review;comme des garçons;comme des garçons (business operation);comme des gaçons homme plus;commes des garcons;converse;des;fashion;homme;mens lookbook;mens outfits;nike;rei kawakubo;style;supreme,57,1,b1d94de87316e91c87d2077c56c2c3b774af43ca6aec51ab49e19d9cb0ac4a4b, +2018-06-12,Look Book,look-book,Yeezy,https://www.downsstyle.com/look-book/2018/5/13/yeezy,collection:look-book;sitemap,2018-06-13,200,https://www.downsstyle.com/look-book/2018/5/13/yeezy,Chas Downs,adidas;adidas yeezy;adidas yeezy boost;boost;comedy;custom yeezy;fake yeezys;fashion;funny;how to get yeezy butter;how to get yeezys;kanye;kanye west;nike;shoes;sneaker;sneaker collection;sneakers;unboxing;vlog;yeezy;yeezy 350;yeezy 350 boost;yeezy 350 v2;yeezy 700;yeezy boost;yeezy boost 350;yeezy boost 350 v2;yeezy busta;yeezy butter;yeezy in space;yeezy shoes;yeezy v2;yeezys,401,7,19385aa873bfbf4085a9e96ab6b973896197532c121cecb6c3d23aa7e5236d84, +2018-06-13,Look Book,look-book,Lookbook,https://www.downsstyle.com/look-book/2018/3/8/outfits-for-march,collection:look-book;sitemap,2018-06-13,200,https://www.downsstyle.com/look-book/2018/3/8/outfits-for-march,Chas Downs,,81,3,d8e6eb4340fc16c3a825920f0748d00d907edb7784dfb89976ad1c9ac3a24294, +2018-06-13,Look Book,look-book,Off-White,https://www.downsstyle.com/look-book/2018/1/17/off-white,collection:look-book;sitemap,2018-09-03,200,https://www.downsstyle.com/look-book/2018/1/17/off-white,Chas Downs,adidas;air jordan;bape;belt;designer lookbook;designer mens blog lookbook;designer mens lookbook;designer outfits;fashion;gucci;hype;hypebeast;jordan;jordan 1;kanye west;nike;off;off white;off white air jordan 1;off white nike;off white presto;off-white;off-white review;off-white virgil abloh;off-white x jimmy choo;off-white ‘more affordable’ collection;offwhite;offwhitereview;pyrex;review;shoes;sneaker;sneakers;streetwear;style;supreme;unboxing;virgil;virgil abloh;virgil abloh louis Vuitton;virgil abloh off-white;virgil abloh review;virgil off-white;white;yeezy,160,3,8f11cb45d299a86b1fa36a76948c3616b89fa108a052684d2ba8e846e4b0d898, +2018-06-13,Masks,masks,Dr. Brant Magnetight Mask,https://www.downsstyle.com/masks/2018/3/27/dr-brant-magnetight-mask,collection:masks;sitemap,2018-09-09,200,https://www.downsstyle.com/masks/2018/3/27/dr-brant-magnetight-mask,Chas Downs,charcoal skincare;charcoal skincare that works;charcoal skincare with magnet;cheapskincare;cool gift ideas;cool masks;cool masks for sleep over 2018;cool masks for sleep overs;cool masks to give as a gift;cool skincare;cool skincare 2018;cool skincare brands for bloggers;cool skincare brands from the United States;cool skincare brands from the us;cool skincare gifts;cool skincare lines from Miami;coupon for mask;dr brant mask;dr brant skincare Miami;dr brant skincare um;good skincare for friends;is dr brant a good skincare line;is dr brant magnet mask worth it;is dr brant mask worth it;is dr brant skincare good;is dr brant skincare worth it;is dr brant worth it;magnet mask;magnet mask 2018 review;magnet mask review;magnet mask that works;magnet skincare;masks;masks for acne;masks for pimples;masks for when you break out;masks to get rid of blackheads;masks to remove makeup;should I buy dr brant skincare;skincare;skincare as gifts;skincare coupon;skincare for adults with acne;skincare tips;skincare tips for acne prone skin;skincare tips for acne skin;skincare tips for adults with acne;skincare tips for all skincare types;skincare tips for teenagers;skincare tips for teenagers with acne;skincare tips for teenagers with pimples;skincare tips for teens;skincare tips for teens with acne;skincare tips that work;skincarejunkie,266,2,00ec1d03b5bc10c9e203ce312b81da9f06803aa9c8feed10aa837ef8db15229f, +2018-06-20,Candles,new-blog,Fragrances I use around my House,https://www.downsstyle.com/new-blog/2018/6/11/home-fragrances,collection:new-blog;sitemap,2018-06-21,200,https://www.downsstyle.com/new-blog/2018/6/11/home-fragrances,Chas Downs,candles;designer fragrances review;fragrance;fragrance for home;fragrances review;fragrances that aren't heavy;perfumeascandle,119,3,367e14a3cfb0ed595945a8173bb2b77b1f8140034af5a619839c2286ed05a362, +2018-06-20,Masks,masks,Chanel Vs. Estee Lauder Eye Masks Review,https://www.downsstyle.com/masks/2018/6/20/chanel-vs-estee-lauder-eye-masks-review,collection:masks;sitemap,2018-06-21,200,https://www.downsstyle.com/masks/2018/6/20/chanel-vs-estee-lauder-eye-masks-review,Chas Downs,beauty;Chanel eye patches;chanel vs estee Lauder eye masks review;chanel vs estee Lauder eye patches;designer eye patches;estee Lauder eye patches;eye;eye bags;eye masks;eye patch;eye patches;eye patches review;luxury eye patches;makeup;panda dream eye patch review;panda eye patch review;patch;patches;peter thomas roth 24k gold eye patches | review;petitfee black pearl & gold hydrogel eye patch review;petitfee black pearl & gold hydrogel eye patch review nishipetals;review;skin republic collagen under eye patches review;tony moly eye patch review;under eye patches,293,2,f6b1608e9538a441a51af515063bebba7224e52f88e47f2a3df6374ca3d2644a, +2018-06-22,Masks,masks,Caudalie Masks,https://www.downsstyle.com/masks/2018/1/17/caudalie-masks,collection:masks;sitemap,2018-10-06,200,https://www.downsstyle.com/masks/2018/1/17/caudalie-masks,Chas Downs,best masks for hydration;caudalie mask review;caudalie mask that work;how to choose the right mask;how to get rid of a pimple overnight;how to get rid of acne;how to get rid of adult acne;how to get rid of teen acne;how to make a mask at home;how to make masks with honey;how to remove blackheads;luxury masks that work;masks for acne;masks that work;masks that work for acne scars;masks that work from sephora;masks to hydrate skin;masks to remove makeup;skincare brands for teens with acne;skincare brands that work;skincare must have;skincare tips for acne skin;skincare tips for teenagers;skincare tips for teenagers with acne;skincare tips for teens;skincare to remove black heads,334,3,06df5ec333d743a0c0e21d3691e2f74f7f1d175fb004c259d2c1e15a7f629837, +2018-06-25,Masks,masks,Sisley Black Rose Cream Mask Review,https://www.downsstyle.com/masks/2018/6/20/sisley-black-rose-cream-mask,collection:masks;sitemap,2018-09-09,200,https://www.downsstyle.com/masks/2018/6/20/sisley-black-rose-cream-mask,Chas Downs,$125 sisley mask;are the sisley masks worth it;best masks 2018;best masks for hydration;good masks to invest in;good skincare for friends;how to get rid of a wrinkle;how to get rid of dehydrated skin;how to get rid of smile lines;how to get rid of wrinkles;how to hydrate your skin;is sisley skincare worth it;is Sisley worth it;is the Sisley black rose cream mask worth it;is the Sisley rose cream mask worth it;luxury gifts;luxury gifts that are under 200;luxury gifts under 150;luxury skincare brands that work;luxury skincare gifts;masks for hydration;masks that work for hydration;masks that work for intense hydration;most expensive masks;should i buy sisley skincare;should I buy the Sisley black rose cream mask;Sisley black rose cream mask;sisley black rose cream mask review;sisley mask review;Sisley review;skincare gifts;skincare tips for acne skin;skincare tips for adult acne;skincare tips for adults;skincare tips for aging;skincare tips for wrinkles,254,2,5687a7984bf5a53de6f1dbc7f47c931d11ac75ef66cb84ca56b9763d1ff43acc, +2018-06-26,Look Book,look-book,Transcendent Clothing Exclusive Sneak Peek Season 1,https://www.downsstyle.com/look-book/2018/6/26/transcendental-clothing-exclusive-sneak-peek-season-1,collection:look-book;sitemap,2018-06-29,200,https://www.downsstyle.com/look-book/2018/6/26/transcendental-clothing-exclusive-sneak-peek-season-1,Chas Downs,brand design;designer review;gay hoodie;gay hoodies;gay pride;hoodie for gay;how to design your own brand;knew it hoodies;pride hoodie;Transcendent;Transcendent clothing;Transcendent clothing PR;Transcendent clothing PR package;Transcendent clothing review;Transcendent clothing us;transcendental clothing;Transcendental Clothing Exclusive Sneak Peek Season 1;Transcendental Clothing review;Transcendental hoodies;twink crop top;Twink hoodies,243,2,21b0f685d93d9401c699e4586663317177ae981a7b2dbe132ce94f8544bafcbe, +2018-06-29,Look Book,look-book,James Perse,https://www.downsstyle.com/look-book/2018/6/25/james-perse,collection:look-book;sitemap,2018-09-03,200,https://www.downsstyle.com/look-book/2018/6/25/james-perse,Chas Downs,best mens tee's;best tshirts for men;best tshirts on the market;James perse;James perse haul;James perse review;James perse sweatshirt;James perse t-shirt review,178,2,49a0880cf311061d47606b4f948502ffef616872df3b6eba2b691b5ad4f54058, +2018-06-30,Look Book,look-book,Yves Saint Laurent a Legend,https://www.downsstyle.com/look-book/2018/6/13/yves-saint-laurent-a-legend,collection:look-book;sitemap,2018-09-03,200,https://www.downsstyle.com/look-book/2018/6/13/yves-saint-laurent-a-legend,Chas Downs,are gucci sneakers comfortable;are saint laurent sneakers comfortable;gucci sneakers;is saint laurent worth it;mens currated lookbook;mens lookbook;mens outfits;Prada sneakers;saint laurent;saint laurent addict;saint laurent clothes review;saint laurent high top sneakers;saint laurent lookbook;saint laurent low top star sneakers;saint laurent mens collection;saint laurent outfits 2018;saint laurent review;saint Laurent rubber sole;saint laurent skincare;shoe addict;should I buy gucci sneakers;should I buy saint laurent sneakers;should I buy ysl shoes;ysl;ysl clothing;ysl makeup;ysl perfume review;ysl shoes;ysl skincare,193,3,7786c8ce5af0f6aa44a92b1b9c8c0b6a6cf833250c0d886730d83ba21e5c4239, +2018-06-30,Skincare,skincare,Sisley $500 Moistuzier,https://www.downsstyle.com/skincare/2018/6/20/sisley-500-moistuzier,collection:skincare;sitemap,2018-09-09,200,https://www.downsstyle.com/skincare/2018/6/20/sisley-500-moistuzier,Chas Downs,best anti aging serum;best anti aging skin care line;best cleaner for mature skin;best luxury moisturizer;best luxury moisturizer on the market;best moisturizer for senitive aging skin;best oil free moisturizer;best skincare for anti aging;best skincare products on the market;chanel skincare;luxury skincare for acne;luxury skincare for adults with aging skin;sisley haul;Sisley lintegral anti age moisturizer;Sisley review;skincare lover;skincare products review,210,2,bc133dc15aba6cc47aec6a753bab4589278e510ee2d2921fb1fbbe9cb0e222df, +2018-07-01,Masks,masks,Boscia Charcoal Mask,https://www.downsstyle.com/masks/2018/6/30/boscia-charcoal-mask,collection:masks;sitemap,2018-09-09,200,https://www.downsstyle.com/masks/2018/6/30/boscia-charcoal-mask,Chas Downs,best charcoal masks;best masks on the market for acne;boscia;boscia charcoal mask;Boscia masks review;Bosnia skincare;caudalie masks;caudalie masks review;chanel vs estee Lauder eye masks review;charcoal masks that work;dr brant magent mask review;dr brant magnet mask;glamglow mask;glamglow skincare;is boscia a good brand;is boscia paraben free;is dr brant magnet mask worth it;is the boscia charcoal mask worth it;Laneige Sleeping Mask;should I buy the boscia mask;Sisley black rose cream mask,183,2,4a831a32835ba5e21e3c9543aab33b8692db504c35d40bc00ffa30abf494437b, +2018-07-02,Candles,new-blog,Voluspa Candles,https://www.downsstyle.com/new-blog/2018/4/7/voluspa-candles,collection:new-blog;sitemap,2018-07-02,200,https://www.downsstyle.com/new-blog/2018/4/7/voluspa-candles,Chas Downs,are nest candles worth it;are voluspa candles worth it;candles that are worth it;do voluspa candles burn evenly;inexpensive candles that are good;is voluspa worth it;soy candles that are good;volsupa candles review;voluspa candles;voluspa soy candles,84,2,4cb535f0e96cbdd9ca0b67679600624de1e5fee28f9fc5dcd32531befe370348, +2018-07-10,Skincare,skincare,Dr. Brant Skincare,https://www.downsstyle.com/skincare/2018/3/17/dr-brant,collection:skincare;sitemap,2018-07-10,200,https://www.downsstyle.com/skincare/2018/3/17/dr-brant,Chas Downs,acne skincare routine;best dr brant skincare products;best face wash;best face wash for dry skin;best luxury moisturizer;best products in Sephora;best skincare for acne skin;best skincare for anti aging;best skincare products on the market;does dr brant skincare work;dr brant face wash;dr brant mask;dr brant masks;dr brant moisturizer review;dr brant review;face wash for acne skin;how to get rid of acne,223,2,3cf45c6bf5c1b26354795315bf5c695513f6e957f984396c610a1766570a74a7, +2018-07-11,Masks,masks,Glamglow Instamud 60 second Mask,https://www.downsstyle.com/masks/2018/7/10/glamglow-instamud-60-second-mask,collection:masks;sitemap,2018-09-09,200,https://www.downsstyle.com/masks/2018/7/10/glamglow-instamud-60-second-mask,Chas Downs,are glamglow masks worth it;are glamglow masks worth the hype;best glamglow masks;does the glamglow 60 second mask work;dr brant review;glamglow;glamglow instamud review;glamglow review;how to choose the right mask;how to get amazing skin overnight;how to get good skin overnight;how to get model skin;how to get perfect skin;how to get rid of a pimple overnight;how to get rid of acne;how to get rid of acne fast;how to get rid of acne for teens;how to get rid of acne scars fast;how to get rid of adult acne;how to get rid of large pimples;how to get rid of teen acne;instamud 60 second treatment review;is glamglow a good brand;is glamglow cruelty free;is glamglow instamud worth it;is glamglow skincare good;is glamglow worth it;luxury masks;masks I need;masks that work;should i buy the glamglow 60 second mask;skincare tips;skincare tips for all skincare types;skincare tips for teenagers;whats the best glamglow mask;whats the best glamglow product,356,2,ff8d841c906b1bd9a0a38eb6a237fb38815199f7a40db53333403c40bcfb1755, +2018-07-14,Candles,new-blog,CANDLES I RESTOCK ON WHEN ON SALE,https://www.downsstyle.com/new-blog/2018/7/14/candles-i-restock-on-when-on-sale,collection:new-blog;homepage;sitemap,2018-07-14,200,https://www.downsstyle.com/new-blog/2018/7/14/candles-i-restock-on-when-on-sale,Chas Downs,are henri bendel candles good;bath & body works candle review;bath & body works candle reviews;candle;candle business review;candle diy;candle empties;candle fragrance;candle haul;candle making;candle making videos;candle review;candles;fragrance oil review;henri bendel candle reviews;henri bendel candles;how long do henri bendel candles last;how long do nest candles last;jo malone candle review;jo malone cologne & candle review;jo malone review;nest candles review;review;test candles;yankee candle;yankee candle 2017 preview;yankee candle preview;yankee candle review,141,2,18b2bb721d78c8f98c07d970aa323044d63a1f1b0a5bdc43435b24352e2d53d0, +2018-07-15,Skincare,skincare,Why sunscreen is vital to beauty,https://www.downsstyle.com/skincare/2018/7/15/why-sunscreen-is-vital-to-beauty,collection:skincare;sitemap,2018-09-09,200,https://www.downsstyle.com/skincare/2018/7/15/why-sunscreen-is-vital-to-beauty,Chas Downs,beauty;best drugstore sunscreen;best drugstore sunscreen that works;best luxury sunscreen;best oil free sunscreen;best sunscreen lotion for dry skin;best sunscreen lotion for oily skin;luxury sunscreen;luxury sunscreen for acne skin;luxury sunscreen for sensitive skin;luxury sunscreen review;luxury sunscreen that works;oil free sunscreen that works;skin;skin care;skin care routine;sunscreen;sunscreen (consumer product);sunscreen for acne;sunscreen for all skin types;sunscreen for dry skin;sunscreen for face that works;sunscreen for oily skin;sunscreen for sensitive skin;sunscreen for sensitive skin that works;sunscreen lotion for acne prone skin;sunscreen lotion for dry skin;sunscreen lotion for oily skin;sunscreen that doesn't cause pimples;sunscreen that doesn't leave you oily;sunscreen that doesn't make you break out;sunscreen that works;why it is important to use sunscreen everyday,178,2,71bb2497eee2f97f1810d8b4006b000b421830678df9dbb608e26cfbc15a59b1, +2018-07-16,Masks,masks,Glow Recipe Watermelon Mask,https://www.downsstyle.com/masks/2018/7/16/glow-recipe-watermelon-mask,collection:masks;sitemap,2018-09-03,200,https://www.downsstyle.com/masks/2018/7/16/glow-recipe-watermelon-mask,Chas Downs,diy facial sheet mask;face mask;glow recipe;glow recipe jelly sheet mask;glow recipe jelly sheet mask how to;glow recipe products;glow recipe sheet mask collection;glow recipe skincare;glow recipe watermelon mask;glow recipe watermelon sheet mask;glow recipe watermelon sheet mask review;luxury skincare;mask;masks for acne redness;masks that work;masks that work for acne scars;masks that work from sephora;new glow recipe sheet mask;new glow recipe sheet mask review;sheet mask;sheet mask review,252,2,f2309d5bc89f06e33a99e49ac23557b57decb4e4839d407ef44f21a4a3556090, +2018-07-17,Masks,masks,Clarins SOS Nourishing Balm Mask,https://www.downsstyle.com/masks/2018/7/17/clarins-sos-balm-nourishing-mask,collection:masks;sitemap,2018-09-09,200,https://www.downsstyle.com/masks/2018/7/17/clarins-sos-balm-nourishing-mask,Chas Downs,clarins;clarins (business operation);clarins cleanser review;clarins extra firming mask application;clarins eye mask;clarins gentle foaming cleanser review;clarins hydraquench review;clarins makeup review;clarins products;clarins review;clarins skincare;clarins skincare review;clarins sunkissed collection 2018 review;clay mask;does clarins help get rid of acne;face mask;facial mask;is clarins a good skincare brand;is clarins cruelty free;is clarins paraben free;is clarions good;is clarions worth the hype;makeup review;product review;review;skincare;skincare review,243,2,ddf3babfad88a4fccbf2383eb215ceb5a4aff24315ec900e9feb9516d59b2bb4, +2018-07-18,Masks,masks,Sheet masks under $10,https://www.downsstyle.com/masks/2018/7/18/sheet-masks-under-10,collection:masks;sitemap,2020-05-22,200,https://www.downsstyle.com/masks/2018/7/18/sheet-masks-under-10,Chas Downs,affordable korean sheet masks;affordable sheet masks;american sheet masks;asian sheet masks;best sheet masks;drugstore sheet masks;face mask;face masks;k-beauty sheet masks;k-beauty vs us sheet masks;korean sheet mask;korean sheet masks;korean vs american sheet masks;loreal sheet hair mask;luxury sheet masks;luxury skincare;masks;my favorite sheet masks;sheet mask;sheet mask review;sheet masks;sheet masks i've repurchased;worst sheet masks,298,3,f8049ebe930b270d54887bec562bedade40e2473e482fbfda7b43dbec0d33da4, +2018-07-19,Masks,masks,Same Product different formula? Why one works and the other is a Dupe!,https://www.downsstyle.com/masks/2018/7/19/same-product-different-formula-why-one-works-and-the-other-is-a-dupe,collection:masks;sitemap,2018-09-09,200,https://www.downsstyle.com/masks/2018/7/19/same-product-different-formula-why-one-works-and-the-other-is-a-dupe,Chas Downs,acne masks;how to choose the right mask;how to figure out if your mask is bad for your skin;masks for acne that dont work;masks for acne that work;masks that break you out;masks that suck;masks to avoid;masks you shouldnt use;products that don't work,203,2,83449b40a6023021906930d91278c271cf8e252052e09042172bfa32ec05f871, +2018-07-23,Skincare,skincare,DRUG STORE SKINCARE?,https://www.downsstyle.com/skincare/2018/7/23/drug-store-skincare,collection:skincare;sitemap,2018-07-23,200,https://www.downsstyle.com/skincare/2018/7/23/drug-store-skincare,Chas Downs,beauty;beauty review;brutally honest sisley primer review;izia by sisley perfume review;izia by sisley review;izia review;lux review;luxury;luxury review;review;sisley;sisley black rose cream mask;sisley eye concealer review;sisley izia fragrance review;sisley izia parfum review;sisley izia perfume review;sisley izia review;sisley mask review;sisley paris;sisley primer;sisley review;skincare review,238,2,a20c5dae6f52fc1da9b21e50e96a768e6fbf58d249415760a62669eda5d104bd, +2018-07-26,Masks,masks,Ole Henrickensen cold plunge mask,https://www.downsstyle.com/masks/2018/7/25/ole-henrickensen-cold-plunge-mask,collection:masks;sitemap,2018-09-09,200,https://www.downsstyle.com/masks/2018/7/25/ole-henrickensen-cold-plunge-mask,Chas Downs,cool masks for sleep over 2018;cool masks for sleep overs;cool masks to give your friends as a present;cool presents;cooling masks;facial mask;good masks 2018;good masks for acne;how to choose the right mask;how to get rid of acne;how to remove acne scars;how to remove acne scars fast;is ole henrickensen cruelty free;luxury acne masks;luxury masks;luxury skincare;masks for acne;masks for redness;masks that work 2018;masks that work for acne;masks that you can place in the freezer;masks to remove redness;ole henrickensen cold plunge mask;ole henriksen skincare;present ideas;skincare for adults;skincare for teens;skincare that works;skincare tips;skincare tips for teens;skincarejunkie,203,2,f1984ea0b952558df1e2aa66f5b4930c0b9d7b91d7fadab23bdfc853d8c86609, +2018-07-29,Skincare,skincare,Bath soaps to help you relax during this stressful week,https://www.downsstyle.com/skincare/2018/7/29/bath-soaps-to-help-you-relax-during-this-stressful-week,collection:skincare;sitemap,2018-11-28,200,https://www.downsstyle.com/skincare/2018/7/29/bath-soaps-to-help-you-relax-during-this-stressful-week,Chas Downs,bath soaps that work;best bath products;best body exfoliators;best body moisturizer;best body products;best bodymoisturizer for adults;best housewarming gifts;best jo malone shower gel;best moisturizer for adults;best moisturizer for senitive aging skin;caudalie bath wash;caudalie scrub;caudalie scrub review;good body moisturizer;housewarming gifts;jo malone shower gel review;keihls body moisturizer;Kiehls body wash review;Kiehls lavender body wash review;luxury bath products;luxury bath soaps;luxury body moisturizers;luxury shower gels;shower gel review;shower gels as gifts;shower gels that hydrate;shower gels that work;which jo malone shower gel is good;which jo malone shower gel should I give as a gift,167,3,3890c1cf572e018f16da33ab0213496ee36601978e647fefd9ee33f94f8357a0, +2018-07-31,Masks,masks,Kora Organics Turmeric Mask,https://www.downsstyle.com/masks/2018/7/31/kora-beauty-tumeric-mask,collection:masks;sitemap,2020-05-23,200,https://www.downsstyle.com/masks/2018/7/31/kora-beauty-tumeric-mask,Chas Downs,are turmeric masks good for your skin;diy masks;diy masks with tumeric;how to make a mask at home;how to make a turmeric mask at home;hsn korres body butter;hsn korres olive oil;hsn korres today's special;is kora organics a good skincare brand;is the kora organics mask good;kora organics mask review;kora organics turmeric mask;koraorganics;korres almond blossom;korres almond blossom moisturizing cream;korres beauty;korres black pine eye cream;korres black pine eye serum;korres black pine serum;korres body butter spray;korres body milk;korres body wash;korres castanea arcadia serum;korres cleanser;korres deodorant;korres eye cream;korres face wash;korres fig body butter;korres foundation;korres golden krocus;korres greece;korres greek yoghurt cleanser;korres greek yoghurt foaming cream cleanser;korres greek yoghurt moisturizer;korres greek yoghurt sleeping facial;korres greek yogurt;korres greek yogurt cleanser;korres hydra biome;korres jasmine lip butter;korres lip balm;korres lipstick;korres magnolia day cream;korres makeup;korres mattifying primer;korres moisturizer;korres night cream;korres perfume;korres pomegranate;korres pomegranate mask;korres pomegranate mattifying primer;korres pomegranate toner;korres primer;korres products;korres pure greek olive;korres reviews;korres rose oil;korres sale;korres sephora;korres serum;korres shampoo;korres skin care;korres skincare review;korres sleeping facial;korres sunscreen;korres ulta;korres usa;korres vitamin c;korres vitamin c serum;korres vitamin c sleeping facial;korres wild rose advanced brightening sleeping facial;korres wild rose brightening sleeping facial;korres wild rose cleanser;korres wild rose eye cream;korres wild rose lip butter;korres wild rose mask;korres wild rose night cream;korres wild rose serum;korres wild rose sleeping facial before and after;korres wild rose sleeping facial review;korres wild rose smoothie;korres wild rose vitamin c;korres wild rose vitamin c active brightening oil;korres wild rose vitamin c brightening oil;korres yogurt cleanser;korrs;masks for sensitive skin;masks that you can make at home;micheal korr;qvc korres;skincare tips;skincare tips for adults with acne;skincare tips for combination skin;skincare tips for kids;skincare tips for teenagers;skincare tips for teens;skincare tips for teens with acne;timothy randall korr;tumeric masks that work for acne;turmeric mask at home;turmeric mask review;turmeric masks for acne,247,2,a3b52b629b3bf9b7cca969262abb45f671d594f8f0103d33765f933f37c7caab, +2018-07-31,Skincare,skincare,$8 vs. $100 razor,https://www.downsstyle.com/skincare/2018/7/31/8-vs-100-razor,collection:skincare;sitemap,2018-11-28,200,https://www.downsstyle.com/skincare/2018/7/31/8-vs-100-razor,Chas Downs,art of shaving kit review;art of shaving razor review;art of shaving review;barbasol razor review;barbasol ultra 6 razor;barbasol ultra 6 razor blog post;barbasol ultra 6 razor review;best razor;best razor for body shaving;best razor on the market;best razors for legs;blog;chanson de major lazer;chanson major lazer;de razor;different types of razors;double edge razor;eyebrow razors;face razor;gillette razor blades;gillette razors;girl razor;good razors for men;good razors for shaving;how to shave without getting razor bumps;how to use a razor;is the barbasol ultra 6 razor good;lean on major lazer;major laser;major lazer;major lazer dj snake;major lazer lean on;major lazer music video;major lazer musique;old razor;razor;razor beast;razor blade;razor blades;razor handles;razor reviews;razor service;razor strap;razor's edge;razored bangs;razored fringe;razors;razors 101;razors for men;razors shift;razors skate co;razors sl;razors sl3;razors that don't cut when shaving review;razors that don't give you razor burn;razors that leave no trace;razors that work;review for mens razors;review for razors;safety razor;safety razor (invention);shave with a razor;shaving with a safety razor;should I buy art of shaving razors;should I buy the art of shaving kit;should I buy the barbasol ultra 6 razor;straight razor;the art of shaving review;what's a good razor for men;why art of shaving kit is not worth it;why art of shaving razors are bad;why you shouldn't buy the art of shaving,219,2,24b3e3115a2259e152b67b39521e39a4ab92d558282ce3b729ba86bf4afd7cd9, +2018-08-08,Masks,masks,Ole Henricksen 3 step Mask,https://www.downsstyle.com/masks/2018/8/8/ole-henricksen-3-step-mask,collection:masks;sitemap,2018-12-07,200,https://www.downsstyle.com/masks/2018/8/8/ole-henricksen-3-step-mask,Chas Downs,acid peel review;are acid peels good for your skin;chemical peel;does ole henricksen work;how to choose the right mask;how to figure out if your mask is bad for your skin;how to get rid of a pimple overnight;how to get rid of acne;how to get rid of acne fast;how to get rid of acne scars fast;how to get rid of large pimples;how to remove acne scars fast;is ole henricksen good for acne skin;luxury masks;luxury masks for adults;luxury skincare;masks for adult acne;masks for adults who want clear skin;masks for teen acne;masks for teens;ole henricksen acid peel mask;ole henricksen mask review;ole henriksen;ole henriksen (organization founder);ole henriksen power bright;ole henriksen power peel;ole henriksen power peel professional spa grade kit;ole henriksen power peel review;ole henriksen skincare;ole power peel acne;olehenriksen power peel transforming facial system;overnight masks that work;power peel;power peel acne;power peel by ole henriksen;power peel ole henriksen review;power peel review,262,2,2e5d8df9a4e5c17d4eb0715fad33de5fe9e22e4b9bd539facd3ebc28afe5392a, +2018-08-11,Masks,masks,Sunday Riley Sulfur Mask Review,https://www.downsstyle.com/masks/2018/8/11/sunday-riley-sulfur-mask-review,collection:masks;sitemap,2018-10-10,200,https://www.downsstyle.com/masks/2018/8/11/sunday-riley-sulfur-mask-review,Chas Downs,best masks for hydration;best masks for problem skin;best masks of 2018;best overnight masks;does sunday riley sulfur mask work;does sunday riley work;good skincare regimen;how to get amazing skin overnight;how to get good skin overnight;how to get model skin;how to get rid of a pimple overnight;how to get rid of acne fast;how to get rid of acne for adults;how to get rid of acne for teenagers;how to get rid of acne scars fast;how to get rid of large pimples;is Sunday Riley a good brand;is sunday riley cruelty free;is sunday riley good for acne skin;is sunday riley organic;is sunday riley worth it;is Sunday Riley worth it;masks for acne;masks for adult acne;masks for teen acne;masks for teenagers;masks for teens;masks for teens that work;masks that work 2018;masks that work for acne;masks that work for acne scars;masks with tree oil;regimen for skin;skincare for teens;skincare tips for teenagers;skincare tips for teenagers with acne;skincare tips for teens;skincare tips that work;sunday riley sulfur mask;sunday riley sulfur mask canada;sunday riley sulfur mask directions;sunday riley sulfur mask overnight;sunday riley sulfur mask review;sunday riley sulfur mask uk,252,2,c911f9e23514f6a307f8197656a8d006b85f55c660501ef3b10c199ceb4f4b56, +2018-08-12,Look Book,look-book,The 5 next outfits for my next vacation,https://www.downsstyle.com/look-book/2018/8/12/the-3-next-outfits-for-my-next-vacation,collection:look-book;sitemap,2018-09-09,200,https://www.downsstyle.com/look-book/2018/8/12/the-3-next-outfits-for-my-next-vacation,Chas Downs,cool outfits;cool outfits for winter;cool outfits for winter men;finesse the system t-shirt;finesse the system tee;high fashion lookbook;high fashion lookbook for men 2018;lookbook for men;Lookbook for men 2018;mens lookbook;mens outfit;outfit lookbook 2018;outfits for my next vacation;transcendent clothing;trend t-shirt;trend tee,76,6,064a609b9ca7db9584b0a506ab4af23ed088dbf7b1236f0636be605aeb962ea7, +2018-08-12,Skincare,skincare,The Best Drugstore Drug Store Skincare Approved by Dermatologists,https://www.downsstyle.com/skincare/2018/8/12/the-best-drugstore-drug-store-skincare-approved-by-dermatologists,collection:skincare;sitemap,2018-09-09,200,https://www.downsstyle.com/skincare/2018/8/12/the-best-drugstore-drug-store-skincare-approved-by-dermatologists,Chas Downs,best anti-aging products | dermatologist at the drugstore;best drug store skincare;best drugstore skin care;best drugstore skin care products;best drugstore skincare;best drugstore skincare - for oily/combination skin;best drugstore skincare 2017;best skin care products;best skincare;Burts bees skincare review;dermatologist;drug store skincare for blackheads;drug store skincare for teen acne;drug store skincare for teenagers with acne;drug store skincare review;drug store skincare that works;drug store skincare thats good;drugstore;drugstore products;drugstore skin care products;drugstore skincare;drugstore skincare for adult acne;drugstore skincare for teenagers;drugstore skincare routine;drugstore skincare that doesn't break you out;drugstore skincare thats works;exfoliators at the drug store that work;how to get rid of acne;how to get rid of blackheads;is acure good;is acute good;is Burts bees good;simple skincare;skincare;skincare routine,346,13,f0610bc15c60d6d361e767743c99508ad001e98177fec558edf4862e78b961a1, +2018-08-21,Travel,travel,Ode To Miami,https://www.downsstyle.com/travel/2018/8/21/ode-to-miami,collection:travel;sitemap,2018-08-22,200,https://www.downsstyle.com/travel/2018/8/21/ode-to-miami,Chas Downs,,243,1,d34c3d81ce0272047b206591979abcb882fad54844966a01e826066bafcf34df, +2018-08-23,Skincare,skincare,La Prarie $205 Tinted Moisturizer,https://www.downsstyle.com/skincare/2018/8/23/la-prarie-205-tinted-moisturizer,collection:skincare;sitemap,2018-11-28,200,https://www.downsstyle.com/skincare/2018/8/23/la-prarie-205-tinted-moisturizer,Chas Downs,best tinted moisturizer;clinique la prairie;d&g millennial skin on-the-glow tinted moisturizer;dolce and gabbana tinted moisturiser;foundation review;is la prairie a good skincare brand;is la prairie skincare good;is la prairie worth it;is the la prairie tinted moisturizer a good foundation alternative;is the la prairie tinted moisturizer full coverage;is the la prairie tinted moisturizer good;is the la prairie tinted moisturizer worth 205;is the la prairie tinted moisturizer worth it;la mer;la mer bronzer 2018 review;la mer bronzing powder review;la petite maison dans la prairie;la prairie;la prairie (city/town/village);la prairie blush;la prairie cellular swiss;la prairie cushion foundation;la prairie foundation;la prairie foundation review;la prairie la mer it cosmetics rosehip seed oil;la prairie loose powder;la prairie night cream;la prairie review;la prairie serum;la prairie skin care;la prairie skin care review;la prairie skincare;la prairie spa;la prairie tinted moisturizer review;la prairie tinted sunscreen;la prairie обзор;la prairie 气垫;la prarie;laprairie;moisturizer review;reseña base de la prairie;review;should I buy la prairie;should I buy the la prairie tinted moisturizer;should I splurge on skincare;tinted moisturizer;worst tinted moisturizer,276,2,3ff0718e731f35a437e003808084235c8c3c0c86571058678423608e6504e8f1, +2018-09-09,Look Book,look-book,Dior Lookbook,https://www.downsstyle.com/look-book/2018/6/13/dior,collection:look-book;sitemap,2018-09-10,200,https://www.downsstyle.com/look-book/2018/6/13/dior,Chas Downs,christian dior fabric;christian dior history;Christian dior influence in fashion;dior eye wear;dior fashion;Dior lookbook;dior lookbook;dior lookbook for men;dior outfit;dior outfits for 2018;dior outfits for men 2018;dior style;high fashion lookbook for men;high fashion lookbook for men 2018 2019;how did dior influence 21st century fashion;how to dress 2018;how to get dior cheap;how to get dior for cheap;how to get dior makeup cheap;how to get dior sunglasses for cheap;how to get yeezys;how to have better style for men;how to save when buying designer;lookbook men 2018,381,3,a817e374242af5d56d80c56ee969841cac7d13cf3a86b413286021ed93a26b98, +2018-09-10,Masks,masks,$135 SKII Facial Treatment Mask Review,https://www.downsstyle.com/masks/2018/9/9/135-skii-facial-treatment-mask-review,collection:masks;sitemap,2018-09-10,200,https://www.downsstyle.com/masks/2018/9/9/135-skii-facial-treatment-mask-review,Chas Downs,at home facial;at home facial mask;how to have a spa day at home;is skII mask worth it;is skII worth it;luxury face mask review;luxury face masks;luxury face masks that work;luxury facial mask review;masks that are used in facial;should I buy the skII facial treatment mask;skII mask review;skII skincare review,264,2,0ab8fea5e97b9babd449d3d8595d916df747619977e4c2797c87aeda99fec8c0, +2018-09-21,Masks,masks,Glamglow Bubblesheet Mask,https://www.downsstyle.com/masks/2018/9/21/glamglow-bubblesheet-mask,collection:masks;sitemap,2020-04-18,200,https://www.downsstyle.com/masks/2018/9/21/glamglow-bubblesheet-mask,Chas Downs,bubble sheet mask review;glamglow bubble sheet mask review;glamglow bubblesheet review;glamglow bubblesheetmask;glamglow review;is glamglow worth it;is the glamglow bubble sheet worth it,217,2,1b15145b38e61dcd50008811f8b9ccab34339e11ecef3b99787bb0fa4ae2cc73, +2018-09-22,Skincare,skincare,Kiehls Midnight Recovery Serum Review,https://www.downsstyle.com/skincare/2018/9/22/kiehls-midnight-recovery-serum-review,collection:skincare;sitemap,2018-10-20,200,https://www.downsstyle.com/skincare/2018/9/22/kiehls-midnight-recovery-serum-review,Chas Downs,,122,2,9137871d23b3ea5fc160662b1743eb12da54166e52e8c8a7aaecebe37e22bc23, +2018-10-06,Masks,masks,Origins using alcohol in products/ Ginzing Peel-Off Mask,https://www.downsstyle.com/masks/2018/10/6/origins-using-alcohol-in-products-peel-off-mask,collection:masks;sitemap,2018-11-11,200,https://www.downsstyle.com/masks/2018/10/6/origins-using-alcohol-in-products-peel-off-mask,Chas Downs,best peel off mask;best peel off mask for boys;best peel off mask for girls;best peel off mask for teenagers!;blackhead peel off mask;cheap blackhead peel off mask;face mask;ginseng;ginzing;male skincare blogger;mask;orgins mask;origins;origins charcoal mask;origins face masks;origins ginzing;origins ginzing peel off mask;origins mask;origins skincare;peel off;peel off face mask;peel off mask;products that don't work;sephora;skincare blog;skincare blogger;skincare reviews;skincare that doesn't work;skincare to stay away from;worse peel off mask,346,2,91f0eb11a48b36984412c0d6ecb8328ba81cf78f7131a7caa32517161cd24a6d, +2018-10-10,Masks,masks,Ren Evercalm Ultra Comforting Rescue Mask,https://www.downsstyle.com/masks/2018/10/10/ren-evercalm-ultra-comforting-rescue-mask,collection:masks;sitemap,2018-11-11,200,https://www.downsstyle.com/masks/2018/10/10/ren-evercalm-ultra-comforting-rescue-mask,Chas Downs,beneath the mask;brian carroll;brian eno;brian foster;brian w. foster;calm;calm rain;calm redness relief range;every;good masks after laser hair removal;good masks for sensitive skin;how to get rid of the pain from laser hair removal;mask;masks for after facials;masks for laser hair removal;music;paula's choice calm redness relief range;paulas choice calm redness relief range full review;paulas choice calm redness review;paulas choice redness relief calm review;pj masks;pj masks romeo;pj masks toys;putin the cat was purrfectly calm;sensitive masks that work;without his mask;without the mask,303,2,de3096414b02fa41355a3dc3190b80d56fc3cafb0699192bb3a4652969b128fb, +2018-10-20,Skincare,skincare,Pixi Rose Ceramide Cream,https://www.downsstyle.com/skincare/2018/10/15/pixi-rose-ceramide-cream,collection:skincare;sitemap,2018-10-21,200,https://www.downsstyle.com/skincare/2018/10/15/pixi-rose-ceramide-cream,Chas Downs,,185,2,19818c926e72152c164bd7dab576a19c110cd777cc4d28dcf4f872f346fb3a9f, +2018-10-25,Skincare,skincare,Rosehip seed oil and why I love it 😍,https://www.downsstyle.com/skincare/2018/10/16/oil,collection:skincare;sitemap,2018-10-26,200,https://www.downsstyle.com/skincare/2018/10/16/oil,Chas Downs,,138,2,39c60931a87010ef249107ae62cacff27ddd065269b3da3e98dc7810889247b5, +2018-11-07,Masks,masks,Jet Lag Mask in First Class,https://www.downsstyle.com/masks/2018/11/6/jet-lag-mask-in-first-class,collection:masks;sitemap,2020-04-18,200,https://www.downsstyle.com/masks/2018/11/6/jet-lag-mask-in-first-class,Chas Downs,face mask;face mask review;jet lag mask;jet lag mask review;jet lag mask summer fridays;jetlag mask;mask;review;summer friday jet lag mask;summer friday's jet lag mask;summer fridays;summer fridays jet lag mask;summer fridays jet lag mask review;summer fridays jetlag mask;summer fridays mask;summer fridays mask review;summer fridays overtime mask;summer fridays review,303,2,c41dcd685dd2c1685bc3368097fca6ec5ab0e84e50900c72c689d4afc7e501ee, +2018-11-11,Masks,masks,Sisley Eye Contour Mask Review,https://www.downsstyle.com/masks/2018/11/11/sisley-eye-contour-mask-review,collection:masks;sitemap,2020-04-18,200,https://www.downsstyle.com/masks/2018/11/11/sisley-eye-contour-mask-review,Chas Downs,contour;eye;eye contour mask;eye cream;eye mask;face mask;mask;sisley;sisley black rose cream mask;sisley eye and lip contour balm;sisley eye and lip contour complex review;sisley eye and lip contour cream;sisley eye and lip contour cream review;sisley eye contour mask;Sisley Eye Contour Mask Review;sisley eye cream;sisley mask review;sisley paris;sisley paris black rose cream mask;sisley review,266,2,2a446dedcd74235928004816b76c6d6c5aa8d4db9b597743dff6b049189a8cbe, +2018-11-28,Skincare,skincare,Holiday Skincare Sephora Haul,https://www.downsstyle.com/skincare/2018/11/27/holiday-skincare-sephora-haul,collection:skincare;sitemap,2018-11-28,200,https://www.downsstyle.com/skincare/2018/11/27/holiday-skincare-sephora-haul,Chas Downs,amore pacific 12 days of essential beauty;amore pacific 12 days of essential beauty blog review;amore pacific 12 days of essential beauty review;amore pacific review;beauty haul;best skincare;caudalie review;Chaz downs;Chaz downs blog;Chaz downs downs style;clean skincare;cosmetics;downs style holiday luxury skincare Sephora haul;downs style holiday skincare haul;downs style holiday skincare Sephora haul;dr Dennis gross dew holiday right;dr Dennis gross dew holiday right blog post;dr Dennis gross dew holiday right review;dr Dennis gross eye cream review;fresh;fresh beauty;fresh beauty skincare;fresh beauty skincare haul;fresh beauty skincare review;fresh beauty skincare routine;fresh faced skincare routine;fresh rose skincare;fresh roundtrip rituals;fresh roundtrip rituals review;fresh skin care;fresh skincare;fresh skincare 2018;fresh skincare review;fresh skincare review 2018;fresh soy cleanser;fresh soy cleanser review;gift ideas;haul;holiday;holiday 2018;holiday haul;holiday luxury skincare haul;holiday makeup;holiday Sephora haul;holiday Sephora skincare haul;holiday skincare;holiday skincare haul;holiday skincare luxury haul;holiday skincare routine;holiday skincare Sephora haul;how much does Kiehl's collection for a cause donate;is Kiehl's skincare good;is the amore pacific 12 days of essential beauty good;is the dr Dennis gross dew holiday right good;is the fresh roundtrip rituals good;is the fresh soy cleanser good;is the jet lag mask by summer Fridays good;is the Kiehl's collection for a cause good;is the Kiehl's mask good;is the korres wild rose radiance good;is the lancome rosy skincare collection good;is the Peter Thomas roth 24kt gold mask worth it;is the Peter Thomas roth 24kt gold mask worth it review;is the rose fresh mask good;Kiehl's collection for a cause;Kiehl's collection for a cause blog post;Kiehl's collection for a cause review;Kiehl's skincare review;korean skincare;korean skincare haul;korean skincare routine;korres wild rose radiance;korres wild rose radiance kit;korres wild rose radiance kit review;korres wild rose radiance oil review;korres wild rose radiance review;lancome;lancome cosmetics;lancome genifique;lancome review;lancome rosy skincare collection;lancome rosy skincare collection review;lancome sikincare;lancome skin care;lancome skincare;lancome skincare for acne prone skin;lancome skincare for oily skin;lancome skincare haul;lancome skincare review;lancome skincare reviews;lancome skincare routine;lancome skincare set;lancome tutorial;lancome visionnaire;lancôme;lancôme (business operation);makeup;makeup haul;natural holiday skincare sets;ocean fresh skincare;organic holiday skincare sets;organic skincare;Peter Thomas roth 24kt gold mask review;Peter Thomas Roth cucumber gel mask review;Peter Thomas roth mask review;Peter Thomas roth mask review cucumber gel mask;Peter Thomas roth skincare;Peter Thomas roth skincare review;rose face mask fresh review;Sephora favorites skincare;Sephora favorites skincare review;sephora haul;should I buy Peter Thomas roth;should I buy the fresh roundtrip rituals;should I buy the lancome rosy skincare collection;should I get korres wild rose radiance;skin;skin care;skinacre haul;skincare;skincare favorites;skincare haul;skincare review;skincare routine;skincare routine 2017;sugar lip scrub fresh;sugar lip scrub fresh review;summer Fridays jet lag mask review;ulta haul;ulta holiday makeup haul;who makes the summer Fridays mask,193,2,7d5b2fb836695b4042402a91ee338aa35e444468dc35f2e5fa576f156bb4f82e, +2018-12-03,Skincare,skincare,Creating a Skincare Line at 18... What I’ve Learned,https://www.downsstyle.com/skincare/2018/12/3/creating-a-skincare-line-at-18-what-i-ve-learned,collection:skincare;sitemap,2019-04-28,200,https://www.downsstyle.com/skincare/2018/12/3/creating-a-skincare-line-at-18-what-i-ve-learned,Chas Downs,,604,2,ed574768d258ff505942efbf04bde9714d73e3dc7a4f55977929da1beaaad20c, +2019-04-28,Skincare,skincare,Glossier PopUp Shop Miami,https://www.downsstyle.com/skincare/2019/4/28/glossier-popup-shop-miami,collection:skincare;sitemap,2019-04-29,200,https://www.downsstyle.com/skincare/2019/4/28/glossier-popup-shop-miami,Chas Downs,full face of glossier;glossier;glossier boy brow;glossier brand review;glossier cloud paint;glossier code;glossier concealer;glossier dark skin;glossier full face;glossier grwm;glossier haloscope;glossier haul;glossier lip gloss;glossier makeup;glossier makeup review;glossier makeup tutorial;glossier play;glossier play review;glossier review;glossier reviews;glossier skin tint;glossier skincare;glossier swatches,218,2,74405b559ae289fe2796d1ebf659107f5cf83993ec1e376f46f7374711255c02, +2019-05-21,Masks,masks,Shiseido Waso Purifying Peel off Mask Review,https://www.downsstyle.com/masks/2019/5/21/shiseido-waso-purifying-peel-off-mask-review,collection:masks;sitemap,2020-04-18,200,https://www.downsstyle.com/masks/2019/5/21/shiseido-waso-purifying-peel-off-mask-review,Chas Downs,charcoal peel off mask;peel off mask;purifying mask;review;sheseido pembe maske;shiseido;shiseido - waso;shiseido - waso| soft and cushy polisher review;shiseido facial mask;shiseido mask;shiseido purifying mask;shiseido purifying mask demo + review;shiseido purifying mask review+demo;shiseido waso;shiseido waso maschera;shiseido waso review;waso,169,2,94e2805095c2fac4ab25750e54839fc4f1e51fba96ca2b52920d9814af6f3d13, +2019-05-21,Skincare,skincare,Shiseido Waso New Product Line Review,https://www.downsstyle.com/skincare/2019/5/21/shiseido-waso-new-product-line-review,collection:skincare;sitemap,2019-05-24,200,https://www.downsstyle.com/skincare/2019/5/21/shiseido-waso-new-product-line-review,Chas Downs,shiseido;shiseido - waso;shiseido - waso| soft and cushy polisher review;shiseido waso;shiseido waso brand;shiseido waso cleanser review;shiseido waso collection;shiseido waso color smart day moisturizer;shiseido waso quick gentle cleanser;shiseido waso quick gentle cleanser review;shiseido waso resenha;shiseido waso review;shiseido waso skincare;shisesido waso quick gentle cleanser;skincare;waso;waso shiseido,496,2,c015e680870c9c400681f6d3b6d058514f129ccee0a59e8d797bcde869e614da, +2019-05-23,Masks,masks,Dr. Brant Oxygen Facial Review,https://www.downsstyle.com/masks/2019/5/23/dr-brant-oxygen-facial-review,collection:masks;sitemap,2019-05-24,200,https://www.downsstyle.com/masks/2019/5/23/dr-brant-oxygen-facial-review,Chas Downs,br brandt oxygen facial mask;dr brandt;dr brandt bb cream;dr brandt maget mask;dr brandt magnetight age defier;dr brandt oxygen facial;dr brandt oxygen facial demo;dr brandt oxygen facial mask;dr brandt oxygen facial review;dr brandt oxygen mask;dr brandt pores no more;dr brandt review;dr brandt skincare;dr brant magnetight age-defier mask;dr. brandt;oxygen facial;oxygen facial dr brandt,433,2,5e175c726f5bbf06de15db0ac4435f6581fa37f9ba18ebbc41d8a18111ce4e08, +2019-05-24,Skincare,skincare,Glow Recipe Pineapple + C Bright Serum Review,https://www.downsstyle.com/skincare/2019/5/24/glow-recipe-pineapple-c-bright-serum-review,collection:skincare;sitemap,2019-05-24,200,https://www.downsstyle.com/skincare/2019/5/24/glow-recipe-pineapple-c-bright-serum-review,Chas Downs,glow recipe;glow recipe avocado;glow recipe pineapple;glow recipe pineapple c brightening serum review;glow recipe pineapple c serum review;glow recipe pineapple serum;glow recipe review;glow recipe watermelon;glow recipe watermelon glow ultra-fine mist;glow recipe watermelon mist;new glow recipe pineapple c brightening serum;pineapple brightening serum;tatcha violet c brightening serum;vitamin c serum,267,2,a3757e35b7fbf1e4d346b86ff71608f7f5acf5818904b3c371f1a70eeff8b6ac, +2019-06-13,Skincare,skincare,Cane + Austin Skincare Review,https://www.downsstyle.com/skincare/2019/6/13/cane-austin-skincare,collection:skincare;sitemap,2019-06-13,200,https://www.downsstyle.com/skincare/2019/6/13/cane-austin-skincare,Chas Downs,acne skincare;cane & austin;cane + austin;cane + austin moisture cream;cane + austin prime & protect mattifying primer;cane + austin prime and protect primer;cane + austin primer;cane and austin;cane and austin prime and protect oily skin;cane and austin primer;cane and austin skincare review;drugstore skincare;review;skin care;skincare;skincare haul;skincare review;skincare routine,226,2,a58e7f0e5597d4f4f3c0a3a25a6b3c6ff69998e739fb96ef4380428ebe9b66e5, +2019-06-20,Masks,masks,T.L.C. Sukari Babyfacial Mask and Drunk Elephant Virgin Marulia Luxury Facial Oil Review,https://www.downsstyle.com/masks/2019/6/20/tlc-sukari-babyfacial-mask-review,collection:masks;sitemap,2020-03-04,200,https://www.downsstyle.com/masks/2019/6/20/tlc-sukari-babyfacial-mask-review,Chas Downs,baby facial drunk elephant;babyfacial;babyfacial drunk elephant;best drunk elephant products;drunk elephant;drunk elephant a passioni;drunk elephant a passioni retinol cream;drunk elephant acne;drunk elephant amazon;drunk elephant b hydra;drunk elephant baby facial;drunk elephant baby facial before and after;drunk elephant baby facial burns;drunk elephant baby facial reviews;drunk elephant babyfacial;drunk elephant babyfacial review;drunk elephant before and after;drunk elephant beste jelly cleanser;drunk elephant black friday;drunk elephant black friday 2019;drunk elephant bronzer;drunk elephant c firma;drunk elephant c firma day serum;drunk elephant c firma review;drunk elephant c tango;drunk elephant c tango multivitamin eye cream;drunk elephant c-firma day serum;drunk elephant careers;drunk elephant cleanser;drunk elephant cleansing balm;drunk elephant coupon;drunk elephant coupon code;drunk elephant cream;drunk elephant d bronzi;drunk elephant discount code;drunk elephant dupes;drunk elephant eye cream;drunk elephant eye serum;drunk elephant face wash;drunk elephant facial;drunk elephant facial oil;drunk elephant founder;drunk elephant framboos;drunk elephant fridge;drunk elephant glycolic night serum;drunk elephant hydration serum;drunk elephant instagram;drunk elephant jelly cleanser;drunk elephant kit;drunk elephant lala retro;drunk elephant lala retro whipped cream;drunk elephant lip balm;drunk elephant lippe balm;drunk elephant logo;drunk elephant marula oil;drunk elephant mask;drunk elephant minis;drunk elephant moisturizer;drunk elephant night serum;drunk elephant night serum before and after;drunk elephant oil;drunk elephant polypeptide;drunk elephant polypeptide cream;drunk elephant products;drunk elephant promo code;drunk elephant protini;drunk elephant protini polypeptide cream;drunk elephant protini review;drunk elephant retinol;drunk elephant retinol cream;drunk elephant retinol review;drunk elephant review;drunk elephant reviews;drunk elephant routine;drunk elephant sale;drunk elephant samples;drunk elephant serum;drunk elephant set;drunk elephant shaba complex eye serum;drunk elephant skin care;drunk elephant skincare;drunk elephant skincare routine;drunk elephant spf;drunk elephant sukari baby facial;drunk elephant sukari babyfacial review;drunk elephant sunscreen;drunk elephant sunshine drops;drunk elephant t.l.c. sukari babyfacial;drunk elephant the littles;drunk elephant tlc;drunk elephant tlc framboos;drunk elephant tlc sukari babyfacial;drunk elephant tlc sukari babyfacial review;drunk elephant trunk;drunk elephant umbra tinte;drunk elephant virgin marula oil;drunk elephant vitamin c;drunk elephant vitamin c serum;drunk elephant whipped cream;is drunk elephant cruelty free;is drunk elephant vegan;is drunk elephant worth it;protini drunk elephant;sephora drunk elephant;sunday riley vs drunk elephant;the drunk elephant;ulta drunk elephant;where to buy drunk elephant,279,2,11bdbabaea09e73ad42269153a477280f0aa9ff3378db137976db81eb04cd08b, +2019-06-21,Skincare,skincare,Fresh Sugar Strawberry Exfoliating Face Wash Review,https://www.downsstyle.com/skincare/2019/6/21/fresh-su,collection:skincare;sitemap,2019-06-23,200,https://www.downsstyle.com/skincare/2019/6/21/fresh-su,Chas Downs,face wash;fresh;fresh beauty;fresh beauty face wash;fresh beauty sugar strawberry exfoliating face wash;fresh beauty sugar strawberry face wash review;fresh sugar face polish dupe;fresh sugar strawberry exfoliating;fresh sugar strawberry exfoliating face wash;fresh sugar strawberry face wash;strawberry sugar exfoliating face wash;strawberry sugar scrub;sugar scrub;sugar strawberry exfoliating face wash,199,2,46793861960b980981912efedd1c5c691bd9c8fca9a46a16890771f0d5d77313, +2019-06-22,Skincare,skincare,AmorePacific Enzyme Cleansing Powder,https://www.downsstyle.com/skincare/2019/6/22/amorepacific-enzyme-cleansing-powder,collection:skincare;sitemap,2020-03-04,200,https://www.downsstyle.com/skincare/2019/6/22/amorepacific-enzyme-cleansing-powder,Chas Downs,amor pacific;amore pacific;amore pacific advent calendar;amore pacific age correcting foundation cushion;amore pacific age correcting foundation cushion in light medium;amore pacific brands;amore pacific careers;amore pacific cc cream;amore pacific cleanser;amore pacific color control;amore pacific company;amore pacific cosmetics;amore pacific cushion;amore pacific cushion compact;amore pacific cushion reviews;amore pacific enzyme;amore pacific enzyme peel;amore pacific eye essence review;amore pacific face wash;amore pacific foundation;amore pacific hair products;amore pacific hand cream;amore pacific hong kong;amore pacific moisturizer;amore pacific powder;amore pacific prime reserve review;amore pacific products;amore pacific radiance concentrator;amore pacific reviews;amore pacific sample set;amore pacific sephora;amore pacific shampoo;amore pacific skin care;amore pacific stock;amore pacific sulwhasoo;amore pacific sunscreen;amore pacific tinted moisturizer;amore pacific treatment enzyme peel;amore pacific vintage extract essence;amorepacific;amorepacific enzyme;amorepacific treatment enzyme peel;amorepacific treatment enzyme peeling masque;armore pacific enzyme peel;enzyme;enzyme peel;nordstrom amore pacific;powder cleanser;skincare;tatcha deep rice enzyme powder;tatcha rice enzyme powder review;tosowoong enzyme powder wash;treatment enzyme peel,235,2,b6c3ee01c38461b5292b9a1005cf202c9def7caf8f395f82289ad2d7a68f6a3c, +2019-06-25,Masks,masks,AmorePacific Treatment Peeling Masque Review,https://www.downsstyle.com/masks/2019/6/25/amorepacific-treatment-peeling-masque,collection:masks;sitemap,2019-07-10,200,https://www.downsstyle.com/masks/2019/6/25/amorepacific-treatment-peeling-masque,Chas Downs,amore pacific;amore pacific review;amore pacific treatment enzyme peel;amore pacific treatment enzyme peel review;amorepacific;amorepacific enzyme peel review;amorepacific treatment enzyme peel;amorepacific treatment enzyme peel review;amorepacific treatment enzyme peeling mask;amorepacific treatment enzyme peeling masque;how to apply amore pacific treatment peeling mask;how to apply amore pacific treatment peeling masque;how to use amore pacific treatment enzyme peel review;review;skincare review,249,2,956a0d645cbc80ba9b0b6ce3464db6d0a70685ebbcd89e012b9de7850c7b7c1f, +2019-06-27,Masks,masks,Algenist Alive Prebiotic Balancing Mask Review,https://www.downsstyle.com/masks/2019/6/27/algenist-prebiotic-balancing-mask-review,collection:masks;sitemap,2019-07-10,200,https://www.downsstyle.com/masks/2019/6/27/algenist-prebiotic-balancing-mask-review,Chas Downs,algenist;algenist alive;algenist alive face mask;algenist alive mask;algenist alive prebiotic balancing mask;algenist alive prebiotic balancing mask review + demo;algenist balancing;algenist cleanser review;algenist color changing mask;algenist gentle rejuvenating cleanser review;algenist mask;algenist mask review;algenist prebiotic balancing mask;algenist review;face mask;prebiotic skincare;skincare review,246,2,23a8a72a8b92790a019565f5a62f0eff8e32e471f543e7352958dfb55b9f2c8f, +2019-07-07,Skincare,skincare,Algenist MicroAlgae Skincare Review,https://www.downsstyle.com/skincare/2019/7/7/kzkcpyr4fgfyn69jllyzdz616hi1kw,collection:skincare;sitemap,2019-07-07,200,https://www.downsstyle.com/skincare/2019/7/7/kzkcpyr4fgfyn69jllyzdz616hi1kw,Chas Downs,algenist;algenist contouring cream reviews;algenist elevate cream review;algenist elevate review;algenist eye serum review;algenist liquid collagen;algenist liquid collagen review;algenist mask review;algenist review;algenist reviews;algenist serum;algenist skin care review;algenist skincare;algenist sleeping collagen reviews;review;skin care;skin care review;skincare;skincare review;skincare routine,317,2,131099cc4e8f4c89ad733e7fa7fc1c5f333c4353822e1e73edc3e783a3591c31, +2019-07-25,Skincare,skincare,Sephora Skincare Collection,https://www.downsstyle.com/skincare/2019/7/24/zzttit1p1icxx01hz6y6mrluktrpxv,collection:skincare;sitemap,2020-03-04,200,https://www.downsstyle.com/skincare/2019/7/24/zzttit1p1icxx01hz6y6mrluktrpxv,Chas Downs,affordable skincare;best clean skincare at sephora;best sephora skincare;best sephora skincare for acne;best sephora skincare products;best sephora skincare sets;best skincare at sephora;best skincare at sephora 2019;best skincare brand at sephora;best skincare brands at sephora;best skincare products from sephora;clean skincare;clean skincare sephora;cruelty free skincare at sephora;cruelty free skincare sephora;ddf skincare sephora;dior skincare sephora;dr brandt skincare sephora;dr dennis gross skincare sephora;foundation review;fragrance free skincare sephora;fresh skincare sephora;gluten free skincare at sephora;go to skincare sephora;goop skincare sephora;image skincare sephora;juara skincare sephora;korean skincare at sephora;korean skincare brands sephora;lancer skincare sephora;men's skincare sephora;ordinary skincare sephora;pai skincare sephora;primera skincare sephora;ren skincare sephora;review;sephora;sephora best sellers skincare;sephora cheap skincare;sephora clean skincare;sephora clean skincare line;sephora collection;sephora collection review;sephora collection skin care;sephora collection skin care products review;sephora collection skin care reviews;sephora collection skincare;sephora gift sets skincare;sephora haul;sephora kit review;sephora korean skincare;sephora skincare;sephora skincare box;sephora skincare brands;sephora skincare by age;sephora skincare collection;sephora skincare finder;sephora skincare kit review;sephora skincare review;sephora vegan skincare;skincare;skincare review;skincare routine;tula skincare sephora;vegan skincare at sephora;vegan skincare sephora;what is clean skincare at sephora,415,2,855750b1c6bfb182f8c0d795b30c24414b7793a7aa0d3006a6edd3c5a20d817e, +2019-08-04,Skincare,skincare,GlamGlow Good in Bed Review,https://www.downsstyle.com/skincare/2019/4/28/glamglow-good-in-bed-review,collection:skincare;sitemap,2020-03-03,200,https://www.downsstyle.com/skincare/2019/4/28/glamglow-good-in-bed-review,Chas Downs,best glamglow mask;glam glow mud mask review;glamglow;glamglow brightening mask;glamglow bubble mask;glamglow bubble sheet;glamglow charcoal mask;glamglow cleanser;glamglow clearing treatment;glamglow demo and review;glamglow dream duo;glamglow dupe;glamglow face mask;glamglow face wash;glamglow firming mask;glamglow flashmud;glamglow gentle bubble cleanser;glamglow glitter mask;glamglow glowstarter;glamglow glowstarter mega illuminating moisturizer;glamglow glowstarter review;glamglow good in bed;glamglow good in bed passionfruit night cream;glamglow good in bed review;glamglow good in bedtm passion fruit softening night cream;glamglow gravity mud;glamglow hydrating mask;glamglow illuminating moisturizer;glamglow instamud;glamglow lip plumper;glamglow mask;glamglow mask review;glamglow mask supermud;glamglow mega illuminating moisturizer;glamglow moisturizer;glamglow mud mask;glamglow powermud;glamglow review;glamglow reviews;glamglow sephora;glamglow star potion;glamglow starpotion;glamglow super serum;glamglow supercleanse;glamglow supermud;glamglow supermud clearing treatment;glamglow supermud dupe;glamglow supermud mask;glamglow supertoner;glamglow thirstymud;glamglow tropical cleanse;glamglow volcasmic;glamglow waterburst;glamglow youthmud;good in bed;good in bed glamglow;good in bed review;product review;review;sephora glamglow,406,2,4ee729a7b82520de37e7099bc09de6243459f0e5eae422816198433b0c045494, +2019-08-08,Masks,masks,Boscia Matcha Magic Mask,https://www.downsstyle.com/masks/2019/8/8/boscia-matcha-magic-mask,collection:masks;sitemap,2019-08-08,200,https://www.downsstyle.com/masks/2019/8/8/boscia-matcha-magic-mask,Chas Downs,boscia;boscia apple cider review;boscia black mask review;boscia mask;boscia mask review;boscia matcha;boscia matcha magic super-antioxidant mask;boscia matcha mask;boscia peel off mask review first impression;boscia review;boscia skincare;face mask;face mask review;green tea mask;mask;mask review;matcha;matcha magic mask;matcha mask;matcha mask review;peel off mask;review;skincare,261,2,405ad885814bfb352ecdbff5b559eabc6bfd83cb2c0f44ffa4b73bdc41241e86, +2019-08-08,Skincare,skincare,Boscia Full Skincare Haul,https://www.downsstyle.com/skincare/2019/8/8/boscia-full-skincare-haul,collection:skincare;sitemap,2020-03-04,200,https://www.downsstyle.com/skincare/2019/8/8/boscia-full-skincare-haul,Chas Downs,boscia;boscia baby soft foot peel;boscia bb cream;boscia beauty oil;boscia black charcoal mask;boscia black cleanser;boscia black hydration gel;boscia black mask;boscia black mask review;boscia blotting linens;boscia cactus water;boscia cactus water moisturizer;boscia cactus water moisturizer review;boscia charcoal;boscia charcoal cleanser;boscia charcoal jelly ball cleanser;boscia charcoal makeup melter;boscia charcoal mask;boscia charcoal pore pudding;boscia charcoal spot corrector;boscia clarifying detox mask;boscia cleanser;boscia cleansing gel;boscia cleansing gel review;boscia cleansing oil;boscia cleansing oil gel;boscia clear complexion cleanser;boscia clear complexion tonic;boscia cool cleansing oil;boscia costco;boscia detoxifying black charcoal cleanser;boscia detoxifying black cleanser;boscia exfoliating peel gel;boscia exfoliating peel gel review;boscia exfoliator;boscia eye cream;boscia face mask;boscia face wash;boscia facial cleanser;boscia foot peel;boscia gel to mousse cleanser;boscia green tea oil control mask;boscia green tea oil free moisturizer;boscia hydration gel;boscia indigo eye cream;boscia jelly ball;boscia luminizing black charcoal mask;boscia luminizing black mask;boscia luminizing black mask dupe;boscia luminizing black mask review;boscia luminizing pink mask;boscia makeup breakup;boscia makeup breakup cool cleansing oil;boscia makeup melter;boscia mask;boscia matcha magic super antioxidant mask;boscia matcha mask;boscia mermaid mask;boscia moisturizer;boscia oil;boscia peel;boscia peel gel;boscia peel off mask;boscia pink mask;boscia pore pudding;boscia pore strips;boscia primer;boscia products;boscia purifying cleansing gel;boscia review;boscia reviews;boscia rosehip omega face oil;boscia rosewater mist;boscia sake balm;boscia sake bright white mask;boscia sake cleansing water;boscia sake cleansing water review;boscia sake treatment water;boscia sephora;boscia setting spray;boscia skin perfecting bb cream;boscia skincare;boscia skincare review;boscia skincare sake treatment water;boscia toner;boscia tsubaki;boscia tsubaki beauty oil;boscia tsubaki cleansing oil gel;boscia tsubaki oil;boscia tsubaki splash mask;boscia tsubaki swirl;boscia ulta;high-end skincare review;is boscia cruelty free;review;skin;skin care;skincare;skincare review;skincare routine;ulta boscia,247,2,097c091b3f9d5489b2a0267819a412c4792b2dcf482a54ead3cb0d35f58b73be, +2019-09-10,Skincare,skincare,Peter Thomas Roth Skincare Haul,https://www.downsstyle.com/skincare/2019/9/10/peter-thomas-roth-skincare-haul,collection:skincare;sitemap,2020-03-04,200,https://www.downsstyle.com/skincare/2019/9/10/peter-thomas-roth-skincare-haul,Chas Downs,amazon peter thomas roth;best peter thomas roth products;haul;is peter thomas roth cruelty free;peter thomas roth;peter thomas roth 24k gold eye patches;peter thomas roth 24k gold mask;peter thomas roth 40 triple acid peel;peter thomas roth acne;peter thomas roth acne clearing gel;peter thomas roth acne clearing wash;peter thomas roth acne dots;peter thomas roth acne kit;peter thomas roth acne spot and area treatment;peter thomas roth acne system;peter thomas roth aha bha acne clearing gel;peter thomas roth amazon;peter thomas roth anti aging cleansing gel;peter thomas roth body lotion;peter thomas roth camu camu;peter thomas roth cc cream;peter thomas roth cleanser;peter thomas roth clinical skin care;peter thomas roth cloud cream;peter thomas roth coupon;peter thomas roth cruelty free;peter thomas roth cucumber detox;peter thomas roth cucumber eye patches;peter thomas roth cucumber gel mask;peter thomas roth exfoliating;peter thomas roth exfoliating gel;peter thomas roth exfoliator;peter thomas roth eye cream;peter thomas roth eye patches;peter thomas roth eyelash serum;peter thomas roth face mask;peter thomas roth face wash;peter thomas roth firmx;peter thomas roth firmx peeling gel;peter thomas roth glycolic acid;peter thomas roth gold eye patches;peter thomas roth gold mask;peter thomas roth green releaf;peter thomas roth hungarian thermal water;peter thomas roth hungarian thermal water mask;peter thomas roth hyaluronic acid;peter thomas roth hyaluronic cloud cream;peter thomas roth hydra gel eye patches;peter thomas roth instant firmx;peter thomas roth instant firmx eye;peter thomas roth irish moor mud;peter thomas roth irish moor mud mask;peter thomas roth jewelry;peter thomas roth lashes to die for;peter thomas roth lashes to die for turbo;peter thomas roth mascara;peter thomas roth mask;peter thomas roth mask frenzy;peter thomas roth mask set;peter thomas roth max complexion correction pads;peter thomas roth mega rich body lotion;peter thomas roth moisturizer;peter thomas roth pads;peter thomas roth peel;peter thomas roth peel pads;peter thomas roth peeling gel;peter thomas roth peptide 21;peter thomas roth potent c;peter thomas roth potent c power serum;peter thomas roth powder sunscreen;peter thomas roth products;peter thomas roth pumpkin enzyme mask;peter thomas roth retinol;peter thomas roth retinol fusion pm;peter thomas roth retinol fusion pm night serum;peter thomas roth review;peter thomas roth reviews;peter thomas roth rose stem cell;peter thomas roth rose stem cell cream;peter thomas roth rose stem cell mask;peter thomas roth sephora;peter thomas roth serum;peter thomas roth shampoo;peter thomas roth skin care;peter thomas roth skin to die for;peter thomas roth skincare;peter thomas roth skincare review;peter thomas roth sulfur mask;peter thomas roth sunscreen;peter thomas roth sunscreen powder;peter thomas roth toner;peter thomas roth un wrinkle;peter thomas roth un wrinkle lip;peter thomas roth un wrinkle pads;peter thomas roth un wrinkle peel pads;peter thomas roth vitamin c;peter thomas roth vitamin c serum;peter thomas roth water drench;peter thomas roth water drench hyaluronic cloud cream;peter thomas roth water drench hyaluronic cloud serum;peter thomas roth water drench moisturizer;peter thomas roth water drench serum;qvc peter thomas roth;skincare;skincare haul;ulta peter thomas roth,873,2,edda43871a3b0a9b63912ee4e716a0371499dfcfd19a0e3658d1ac76cf4a0e0f, +2019-09-24,Skincare,skincare,I Dew Skincare Review,https://www.downsstyle.com/skincare/2019/9/24/i-dew-skincare,collection:skincare;sitemap,2019-09-24,200,https://www.downsstyle.com/skincare/2019/9/24/i-dew-skincare,Chas Downs,disco kitten review;i dew care;i dew care berry groovy;i dew care disco kitten;i dew care face mask;i dew care face mask review;i dew care mask;i dew care mask review;i dew care masks review;i dew care mini scoops;i dew care review;i dew care sugar kitten;korean skincare;memebox i dew care;memebox review;review;skincare;skincare review;sugar kitten review,676,2,fa7791f0cf5ef88770c285eb2e49029772e579657bfa6f0c3c38af9a6d904dd0, +2019-09-26,Candles,new-blog,Nest Candles,https://www.downsstyle.com/new-blog/2018/6/30/nest-candles,collection:new-blog;homepage;sitemap,2019-11-02,200,https://www.downsstyle.com/new-blog/2018/6/30/nest-candles,Chas Downs,are nest candles good;are nest candles worth it;nest candles review;nest soy candles,251,2,aaef9fd722abb300455dff292a7a0507f455bccf00474378d723c5568be04e8c, +2019-10-04,Skincare,skincare,Sol De Janeiro Review,https://www.downsstyle.com/skincare/2019/10/4/sol-de-janeiro-review,collection:skincare;sitemap,2019-10-31,200,https://www.downsstyle.com/skincare/2019/10/4/sol-de-janeiro-review,Chas Downs,,337,2,0cca40a066486ec40899927d9082e25c079a8ee3466a6699e7253f670e255637, +2019-10-16,Skincare,skincare,Shea Moisture Skincare Review,https://www.downsstyle.com/skincare/2019/10/16/shea-moisture-skincare-review,collection:skincare;sitemap,2020-03-04,200,https://www.downsstyle.com/skincare/2019/10/16/shea-moisture-skincare-review,Chas Downs,cvs shea moisture;moisture;review;shea butter;shea butter face moisturizer;shea butter moisturizer;shea moisture;shea moisture 10 in 1;shea moisture african black soap;shea moisture african black soap clarifying mud mask;shea moisture african black soap mask;shea moisture african black soap review;shea moisture african black soap skin care kit;shea moisture argan oil;shea moisture baby lotion;shea moisture baby shampoo;shea moisture bar soap;shea moisture beard;shea moisture beard balm;shea moisture beard kit;shea moisture beard wash;shea moisture black castor oil;shea moisture black castor oil shampoo;shea moisture body lotion;shea moisture body scrub;shea moisture castor oil;shea moisture clarifying mud mask;shea moisture clarifying shampoo;shea moisture co wash;shea moisture coconut;shea moisture coconut and hibiscus shampoo;shea moisture coconut shampoo;shea moisture color creme;shea moisture curl and shine shampoo;shea moisture curl and style milk;shea moisture curl cream;shea moisture curl smoothie;shea moisture curl stretch pudding;shea moisture curling cream;shea moisture curling gel souffle;shea moisture curly hair;shea moisture dandruff shampoo;shea moisture deep treatment masque;shea moisture detangler;shea moisture eczema;shea moisture face mask;shea moisture face wash;shea moisture gel;shea moisture gift set;shea moisture green coconut and activated charcoal reviews;shea moisture hair;shea moisture high porosity;shea moisture jamaican black castor oil leave in conditioner;shea moisture jamaican black castor oil shampoo;shea moisture leave in;shea moisture leave in treatment;shea moisture manuka honey and yogurt;shea moisture manuka honey mask;shea moisture manuka honey shampoo;shea moisture mask;shea moisture masque;shea moisture men;shea moisture moisturizer;shea moisture mousse;shea moisture mud mask;shea moisture oil;shea moisture owner;shea moisture problem skin facial wash & scrub;shea moisture raw shea butter;shea moisture raw shea butter deep treatment masque;shea moisture raw shea butter moisture retention shampoo;shea moisture review;shea moisture reviews;shea moisture sale;shea moisture shampoo and conditioner;shea moisture shea butter;shea moisture skin care;shea moisture skin care review;shea moisture skincare;shea moisture smoothie;shea moisture soap;shea moisture superfruit;shea moisture walmart;sheamoisture 100 extra virgin coconut oil leave in treatment;sheamoisture african black bar soap;sheamoisture african black soap;sheamoisture african black soap clarifying mud mask;sheamoisture african black soap dandruff control shampoo;sheamoisture coconut & hibiscus co wash conditioning cleanser;sheamoisture coconut & hibiscus curl & shine conditioner;sheamoisture coconut & hibiscus curl & shine shampoo;sheamoisture coconut & hibiscus curl & style milk;sheamoisture coconut & hibiscus curl enhancing smoothie;sheamoisture coconut & hibiscus frizz free curl mousse;sheamoisture coconut & hibiscus hold & shine moisture mist;sheamoisture com;sheamoisture hair styling products;sheamoisture high porosity moisture seal masque;sheamoisture jamaican black castor oil;sheamoisture jamaican black castor oil srengthen grow & restore shampoo;sheamoisture jamaican black castor oil strengthen grow & restore conditioner;sheamoisture manuka honey & mafura oil intensive hydration hair masque;sheamoisture raw shea butter deep treatment masque;sheamoisture raw shea butter detangler;sheamoisture raw shea butter moisture retention shampoo;sheamoisture shampoo & conditioner;sheamoisture superfruit complex 10 in 1 renewal system hair masque;skincare;target shea moisture;walgreens shea moisture,531,2,3307ede305c1dfafdd96bdae182f0005174afeb7d743e1064223fdb3ffb90961, +2019-12-02,Skincare,skincare,Glamglow Review,https://www.downsstyle.com/skincare/2019/12/2/yoipa7z83s10ghhwfagm1q3kcpc7tn,collection:skincare;sitemap,2020-03-03,200,https://www.downsstyle.com/skincare/2019/12/2/yoipa7z83s10ghhwfagm1q3kcpc7tn,Chas Downs,best glamglow mask;glam glow;glam glow review;glamglow;glamglow brightening mask;glamglow bubble mask;glamglow bubble sheet;glamglow cbd;glamglow cbd moisturizer;glamglow charcoal mask;glamglow cleanser;glamglow clearing treatment;glamglow dream duo;glamglow dupe;glamglow face mask;glamglow face wash;glamglow firming mask;glamglow flashmud;glamglow gentle bubble cleanser;glamglow glitter mask;glamglow glowstarter;glamglow glowstarter mega illuminating moisturizer;glamglow glowstarter review;glamglow good in bed;glamglow gravity mud;glamglow honest review;glamglow hydrating mask;glamglow illuminating moisturizer;glamglow instamud;glamglow lip plumper;glamglow mask;glamglow mask review;glamglow mask supermud;glamglow mega illuminating moisturizer;glamglow moisturizer;glamglow mud mask;glamglow mud mask review;glamglow powermud;glamglow review;glamglow review & demo;glamglow reviews;glamglow sephora;glamglow star potion;glamglow starpotion;glamglow super serum;glamglow supercleanse;glamglow supermud;glamglow supermud clearing treatment;glamglow supermud clearing treatment review;glamglow supermud dupe;glamglow supermud mask;glamglow supermud mask review;glamglow supertoner;glamglow thirstymud;glamglow tropical cleanse;glamglow volcasmic;glamglow waterburst;glamglow youthmud;product review;review;sephora glamglow,291,2,3127bd90b9f129604df750a7d2987c131b9c340537ec56ca7a71419c3dc23a92, +2020-02-11,Skincare,skincare,Kielh's Healthy Skin Squad Skincare Review,https://www.downsstyle.com/skincare/2020/2/8/kielhs-healthy-skin-squad-skincare-review,collection:skincare;sitemap,2020-03-03,200,https://www.downsstyle.com/skincare/2020/2/8/kielhs-healthy-skin-squad-skincare-review,Chas Downs,beauty review;best kiehls products;clear skin;everyday skincare for acne prone skin;everyday skincare for clear skin;healthy skin;is kiehl's cruelty free;kiehl's;kiehl's age defender;kiehl's avocado eye cream;kiehl's calendula;kiehl's calendula toner;kiehl's clearly corrective dark spot solution;kiehl's creamy eye treatment with avocado;kiehl's creme de corps;kiehl's daily reviving concentrate;kiehl's dark spot corrector;kiehl's face wash;kiehl's lotion;kiehl's mask;kiehl's midnight recovery concentrate;kiehl's midnight recovery eye;kiehl's moisturizer;kiehl's near me;kiehl's powerful strength line reducing concentrate;kiehl's sephora;kiehl's serum;kiehl's shampoo;kiehl's skin care;kiehl's store;kiehl's super multi corrective cream;kiehl's toner;kiehl's ultra facial cleanser;kiehl's ultra facial cream;kiehl's ultra facial moisturizer;kiehl's vitamin c;kiehl's vitamin c serum;kiehls butterstick;kiehls coupon;kiehls creamy eye treatment;kiehls eye cream;kiehls face cream;kiehls facial fuel;kiehls gift sets;kiehls hand cream;kiehls lip balm;kiehls mask;kiehls midnight recovery;kiehls midnight recovery oil;kiehls musk;kiehls nyc;kiehls products;kiehls promo code;kiehls skin care;kiehls sunscreen;makeup revolution skincare review;neecie's skincare review;oily skin;review;reviews;revolution skincare review;sheroscience skincare routine;skin care;skin care products;skin care routine;skincare;skincare review;skincare review channel;skincare routine;skincare routine 2018;the skin squad,295,2,09b95104f6cff96dba5ce265a0f64164b932ae80785db18dd90f76a95865f796, +2020-02-20,Skincare,skincare,Sunday Riley Power Couple Trio Review,https://www.downsstyle.com/skincare/2020/2/20/sunday-riley-power-couple-trio-review,collection:skincare;sitemap,2020-03-03,200,https://www.downsstyle.com/skincare/2020/2/20/sunday-riley-power-couple-trio-review,Chas Downs,best sunday riley products;ceo glow sunday riley;ceo sunday riley;sephora sunday riley;skincare sunday riley;sunday riley;sunday riley a+;sunday riley a+ high dose retinoid serum;sunday riley a+ high dose retinol serum;sunday riley a+ retinol;sunday riley auto correct;sunday riley box;sunday riley ceo;sunday riley ceo cream;sunday riley ceo glow;sunday riley ceo glow oil;sunday riley ceo moisturizer;sunday riley ceo serum;sunday riley ceramic slip;sunday riley ceramic slip cleanser;sunday riley eye cream;sunday riley good genes;sunday riley good genes all in one lactic acid treatment;sunday riley good genes dupe;sunday riley good genes review;sunday riley good genes treatment;sunday riley ice ceramide moisturizing cream;sunday riley juno;sunday riley lactic acid;sunday riley luna;sunday riley luna oil;sunday riley luna review;sunday riley luna sleeping night oil;sunday riley modern skincare;sunday riley modern skincare llc;sunday riley moisturizer;sunday riley night oil;sunday riley oil;sunday riley power couple;sunday riley products;sunday riley retinol;sunday riley reviews;sunday riley sale;sunday riley serum;sunday riley skincare;sunday riley skincare products;sunday riley skincare regimen;sunday riley skincare reviews;sunday riley skincare routine;sunday riley skincare set;sunday riley subscription box;sunday riley tidal;sunday riley tidal brightening enzyme water cream;sunday riley ufo;sunday riley ufo oil;sunday riley ufo review;sunday riley vitamin c;sunday riley vitamin c cream,453,2,1ff257ce327b10c07bdd89abfdb04869f5238c4253dd661f50d39a79f2cf5a36, +2020-03-03,Skincare,skincare,Dior Skincare Review,https://www.downsstyle.com/skincare/2020/3/3/dior-skincare-review,collection:skincare;sitemap,2020-03-22,200,https://www.downsstyle.com/skincare/2020/3/3/dior-skincare-review,Chas Downs,christian dior skincare reviews;dior;dior beauty;dior capture youth;dior dream skin review;dior foundation review;dior homme skincare;dior makeup;dior makeup review;dior men skincare;dior prestige skincare;dior review;dior skin care;dior skincare;dior skincare 2019;dior skincare capture youth;dior skincare dreamskin;dior skincare foundation;dior skincare gift set;dior skincare nordstrom;dior skincare prestige;dior skincare products;dior skincare review;dior skincare routine;dior skincare sale;dior skincare sephora;dior skincare workshop;dior total youth skincare ritual;drunk elephant skincare review;high end skincare;luxury skincare;nordstrom dior skincare;review;skin care review;skincare;skincare experiment;skincare review;skincare review and unboxing;skincare routine;skincare routines,596,2,f0b7da3a6a8b8b42c6695ac338f421e457fe90517f736d1803a60d6e0c07b6a8, +2020-03-09,Look Book,look-book,Outfit Inspo,https://www.downsstyle.com/look-book/2020/3/9/outfit-inspo,collection:look-book;sitemap,2020-03-30,200,https://www.downsstyle.com/look-book/2020/3/9/outfit-inspo,Chas Downs,,99,7,e1480fb0a79a998aab5e78f83699fbd94bd96f72bb965bf79cee524e61355368, +2020-03-09,Masks,masks,Zombie Pack Egg Tightening Mask?,https://www.downsstyle.com/masks/2020/3/9/ncngcav0usq8d48u986708xjlbr8xj,collection:masks;sitemap,2020-03-09,200,https://www.downsstyle.com/masks/2020/3/9/ncngcav0usq8d48u986708xjlbr8xj,Chas Downs,face mask;grandma mask vs zombie mask;hanacure mask;hanacure vs zombie pack;mask;mask pack;masker zombie pack;monster zombie face mask;reviewing zombie face mask;skin1004 zombie mask;skin1004 zombie pack;trying out zombie face mask;zombie;zombie face mask;zombie face mask review;zombie mask;zombie mask pack;zombie pack;zombie pack diamond;zombie pack diamond mask;zombie pack mask;zombie pack vs hanacure,261,2,85c1950c93c532623722ec883d9e603b28c7f05944ed0b8529ebd24ec2983d73, +2020-03-09,Skincare,skincare,Murad Vitamin C Line is it even from an Orange?,https://www.downsstyle.com/skincare/2020/3/9/e0hh55enl2ljrxp0a228awsizmwrui,collection:skincare;sitemap,2020-03-22,200,https://www.downsstyle.com/skincare/2020/3/9/e0hh55enl2ljrxp0a228awsizmwrui,Chas Downs,affordable vitamin c serum;cerave vitamin c;cerave vitamin c serum;dr dray vitamin c serum;murad;murad cleanser;murad esenciales vitamina c;murad moisturizer;murad para las manchas;murad products;murad review;murad skincare;murad vitamin c;murad vitamin c facial;murad vitamin c moisturizer;review serum vitamin c;review vitamin c;vit c;vitamin;vitamin c;vitamin c serum;vitamin c serum murad,281,2,80cb1396e678a20f64176aa7531bc619b7c62c15e1243e5475e4f0034966ba1a, +2020-03-10,Skincare,skincare,Lancome Skincare Review,https://www.downsstyle.com/skincare/2018/8/23/lancome-moisturizer,collection:skincare;sitemap,2020-03-22,200,https://www.downsstyle.com/skincare/2018/8/23/lancome-moisturizer,Chas Downs,lancome;lancome cream review;lancome genifique review;lancome night creme review;lancome products;lancome review;lancome skin care;lancome skin care reviews;lancome skincare;lancome skincare review;lancome skincare review 2019;lancome skincare reviews;lancome skincare routine;lancome skincare set;lancome teint idole;lancome toner;lancôme (business operation);review;skin care;skincare;skincare review;skincare routine,292,2,7e4f6fb8cd7072adbac1deb32a1e68c7ef6bfeb83dedeff542f4bf309d9417d7, +2020-03-11,Skincare,skincare,Caudalie Skincare Review,https://www.downsstyle.com/skincare/2020/3/10/ml8yudguw8a5kzdm5hfgwv3drb91ir,collection:skincare;sitemap,2020-04-18,200,https://www.downsstyle.com/skincare/2020/3/10/ml8yudguw8a5kzdm5hfgwv3drb91ir,Chas Downs,,348,2,3dd71cd45d5d3450bff0f264967353bb3f987017dd577da4679ccb613314de1c, +2020-03-12,Skincare,skincare,Youth to the People Skincare Review,https://www.downsstyle.com/skincare/2020/3/12/3qh2vgeu7qqefe8avektggt7uil4za,collection:skincare;sitemap,2020-04-18,200,https://www.downsstyle.com/skincare/2020/3/12/3qh2vgeu7qqefe8avektggt7uil4za,Chas Downs,youth to the people;youth to the people adaptogen deep moisture cream;youth to the people brand review;youth to the people cleanser;youth to the people dream mask;youth to the people oil;youth to the people review;youth to the people skincare;youth to the people skincare review;youth to the people superberry oil;youth to the people superfood cleanser;youth to the people toner,238,2,dafaa3da442587033312f919b1fa7349d7fb07176d485e16db31a03b3e78233b, +2020-03-13,Skincare,skincare,Farmacy Skincare Review,https://www.downsstyle.com/skincare/2020/3/13/h8z0c8vsgl7s8i0hfbhuf2cpqzswm4,collection:skincare;sitemap,2020-04-18,200,https://www.downsstyle.com/skincare/2020/3/13/h8z0c8vsgl7s8i0hfbhuf2cpqzswm4,Chas Downs,cream farmacy skincare;farmacy;farmacy beauty;farmacy clean bee review;farmacy honey potion;farmacy moisturizer review;farmacy review;farmacy reviews;farmacy skin care review;farmacy skin dew review;farmacy skincare;farmacy skincare reddit;farmacy skincare review;farmacy skincare routine;korean skincare;natural skincare;review;reviews;skin care;skin care review;skincare;skincare review;skincare routine,354,2,ce90736f5cb7b8bd408dbb6c4fbbc7c44919a755682f83dcce8e6cb3fafd591e, +2020-03-14,Look Book,look-book,Spring Outfit Inspo,https://www.downsstyle.com/look-book/2020/3/14/vdk84jqyb4m64t44jtz02x6whx7m8z,collection:look-book;sitemap,2020-03-14,200,https://www.downsstyle.com/look-book/2020/3/14/vdk84jqyb4m64t44jtz02x6whx7m8z,Chas Downs,,78,7,c007865f08c0e45fc8ed26db84e7759107b2a28227b2f076e71748d01ee97976, +2020-03-14,Skincare,skincare,The Inkey List Skincare Review,https://www.downsstyle.com/skincare/2020/3/10/zjl460v3b2d2xqux4oqughfc4xm3u0,collection:skincare;sitemap,2020-03-22,200,https://www.downsstyle.com/skincare/2020/3/10/zjl460v3b2d2xqux4oqughfc4xm3u0,Chas Downs,inkey list;inkey list q10;inkey list retinol;inkey list retinol review;inkey list review;inkey list vs the ordinary;review;the inkey list;the inkey list hyaluronic acid serum;the inkey list polyglutamic acid;the inkey list retinol;the inkey list retinol face serum;the inkey list retinol review;the inkey list review;the inkey list skincare;the inkey list skincare review,276,2,f0a86cb2053f20a98be88f79f5cc54fcfe9176fb6d4850c16537cebc63b68803, +2020-03-15,Skincare,skincare,First Aid Beauty Skincare Review,https://www.downsstyle.com/skincare/2020/3/15/first-aid-beauty-skincare-review,collection:skincare;sitemap,2020-03-22,200,https://www.downsstyle.com/skincare/2020/3/15/first-aid-beauty-skincare-review,Chas Downs,beauty;first aid beauty;first aid beauty face cleanser;first aid beauty micellar review;first aid beauty moisturizer;first aid beauty review;first aid beauty reviews;first aid beauty skincare;first aid beauty skincare review;first aid beauty tinted moisturizer;first aid beauty ultra repair cream;first aid beauty ultra repair face moisturizer;review;skincare;skincare review;skincare routine,459,2,50c29aff75c86083e2d6daa4326c0762e84fa6a0bfc0151771f0ec1610b0e3f0, +2020-03-15,Skincare,skincare,Lord Jones Royal Oil CBD Serum Review,https://www.downsstyle.com/skincare/2020/3/15/lord-jones-royal-oil-cbd-serum-review,collection:skincare;sitemap,2020-03-18,200,https://www.downsstyle.com/skincare/2020/3/15/lord-jones-royal-oil-cbd-serum-review,Chas Downs,,207,2,88e0a30008aa16e6d463332d301d79eda0d1fed4a0a3e49913eceef17842469a, +2020-03-15,Travel,travel,CoronaVirus Essentials,https://www.downsstyle.com/travel/2020/3/15/coronavirus,collection:travel;sitemap,2020-03-15,200,https://www.downsstyle.com/travel/2020/3/15/coronavirus,Chas Downs,,229,2,59227b0655fdb227b50949a8943d05c7eceb309129bdbbe196ce2a58f16ea7fd, +2020-03-17,Skincare,skincare,Laneige Skincare Review,https://www.downsstyle.com/skincare/2020/3/17/y386tpvylmqzy1lqjg6lixehmxjepw,collection:skincare;sitemap,2020-03-22,200,https://www.downsstyle.com/skincare/2020/3/17/y386tpvylmqzy1lqjg6lixehmxjepw,Chas Downs,is laneige organic;is laneige worth it;laneige ingredients review;laneige natural?;laneige review;laneige skincare;laneige skincare review,307,2,a2d653fd5263050513f81358f0e354014013b3078205760cb209a7b6232de17a, +2020-04-18,Masks,masks,Farmacy Vitamin C Mask Review,https://www.downsstyle.com/masks/2020/4/18/farmacy-vitamin-c-mask-review,collection:masks;sitemap,2020-04-18,200,https://www.downsstyle.com/masks/2020/4/18/farmacy-vitamin-c-mask-review,Chas Downs,,218,2,be6a0dcb0f3f2a4c8aafdd4a6577883f0f72fc4070e88fbff8c79edc234d3335, +2020-04-18,Masks,masks,Youth To The People Superberry Mask Review,https://www.downsstyle.com/masks/2020/4/18/youth-to-the-people-superberry-mask-review,collection:masks;sitemap,2020-05-01,200,https://www.downsstyle.com/masks/2020/4/18/youth-to-the-people-superberry-mask-review,Chas Downs,,160,2,1c8bf3b9e00ee6996e73cc1eb03aed23764ea621d1ff62a348d9b00107272aac, +2020-04-20,Masks,masks,First Aid Beauty Purifying Mask Review,https://www.downsstyle.com/masks/2020/4/18/first-aid-beauty-purifying-mask-review,collection:masks;homepage;sitemap,2020-04-20,200,https://www.downsstyle.com/masks/2020/4/18/first-aid-beauty-purifying-mask-review,Chas Downs,,165,2,6ed6bee7bd10a5ec5335bd12e6b6d107907085ffb603f7e904dc1012bceea7ef, +2020-04-28,Workouts/Diet,workoutsdiet,My Workout Routine,https://www.downsstyle.com/workoutsdiet/2017/12/6/my-workout-routine,collection:workoutsdiet;sitemap,2020-04-28,200,https://www.downsstyle.com/workoutsdiet/2017/12/6/my-workout-routine,Chas Downs,,407,2,bcc5c75474aff46d193af4079c67c5a86ef3ba2a68e6a291d7207ea3a9a5ff8a, +2020-05-01,Candles,new-blog,Tom Ford Candles,https://www.downsstyle.com/new-blog/2020/4/28/tom-ford-candles-1,collection:new-blog;homepage;sitemap,2020-05-01,200,https://www.downsstyle.com/new-blog/2020/4/28/tom-ford-candles-1,Chas Downs,,170,2,7f1e3f2080e589fdebf2af225937a9b61a22c976306454ab41cd9fef1be3d810, +2020-05-03,Skincare,skincare,Earth To Skin Review,https://www.downsstyle.com/skincare/2020/5/3/i9l4nicj556zy15qbm63nvm93srz4i,collection:skincare;sitemap,2020-05-06,200,https://www.downsstyle.com/skincare/2020/5/3/i9l4nicj556zy15qbm63nvm93srz4i,Chas Downs,earthtoskin,292,2,4300a0645b6822be943fc95e71c4c86299f72c508a6e827b1347e3835ee72c11, +2020-05-05,Skincare,skincare,Harry's Skincare Review,https://www.downsstyle.com/skincare/2020/5/5/harrys-skincare-review,collection:skincare;sitemap,2020-05-06,200,https://www.downsstyle.com/skincare/2020/5/5/harrys-skincare-review,Chas Downs,,315,2,4531b17ae8fc708bed656de0d33b81079022971aff1b631198a5530bb3cbad0e, +2020-05-06,Skincare,skincare,La Mer Skincare Review,https://www.downsstyle.com/skincare/2020/4/28/la-mer-skincare-review,collection:skincare;sitemap,2020-05-06,200,https://www.downsstyle.com/skincare/2020/4/28/la-mer-skincare-review,Chas Downs,,726,2,6dbdaad643e3a0f9bf5a24fc86a3ed1708cfdba974e404ac6b88dd30c01aead5, +2020-05-07,Skincare,skincare,Sisley Black Rose Precious Serum Review,https://www.downsstyle.com/skincare/2020/5/6/sisley-black-rose-precious-serum,collection:skincare;sitemap,2020-05-07,200,https://www.downsstyle.com/skincare/2020/5/6/sisley-black-rose-precious-serum,Chas Downs,,261,2,3cd944be480364ed55884e92429091c8349b64f58cbf530cfdc3f170e3c22d05, +2020-05-08,Skincare,skincare,Burts Bees Skincare Review,https://www.downsstyle.com/skincare/2020/5/8/burts-bees-skincare-review,collection:skincare;sitemap,2020-05-13,200,https://www.downsstyle.com/skincare/2020/5/8/burts-bees-skincare-review,Chas Downs,,453,1,356238930cdf0fe60d32632efbaf55cc09f608b97cd5dba5a44c80464e1c4b86, +2020-05-10,Skincare,skincare,Honest Beauty/Company Skincare Review,https://www.downsstyle.com/skincare/2020/5/10/honest-beautycompany-skincare-review,collection:skincare;sitemap,2020-05-11,200,https://www.downsstyle.com/skincare/2020/5/10/honest-beautycompany-skincare-review,Chas Downs,,354,2,d7a30a363c28dd879f65473dc11245b2f65557427595e1659ef9612ac3fbda94, +2020-05-11,Skincare,skincare,La Roche-Posay Skincare Review,https://www.downsstyle.com/skincare/2020/5/11/la-roche-posay-skincare-review,collection:skincare;sitemap,2020-05-22,200,https://www.downsstyle.com/skincare/2020/5/11/la-roche-posay-skincare-review,Chas Downs,,426,2,480e7dd7ae3d65457c2f568a3f1065d478d0056e3a5dddb18ffc9d1b76f5602c, +2020-05-12,Skincare,skincare,Bliss Brightening Skincare Review,https://www.downsstyle.com/skincare/2020/5/12/bliss-brightening-skincare-review,collection:skincare;sitemap,2020-05-22,200,https://www.downsstyle.com/skincare/2020/5/12/bliss-brightening-skincare-review,Chas Downs,bliss;bliss products;bliss renew and smooth serum;bliss renew serum review;bliss review;bliss skin care;bliss skin care products reviews;bliss skin care review;bliss skincare;bliss skincare product reviews;bliss skincare reveiw;bliss skincare review;bliss skincare reviews;bliss skincare set;bliss skincare target;bliss what a melon mask review;drugstore skincare;review;skincare;skincare review;skincare routine,396,2,d32df56aee602a655b75f23642378e0d06211e39669c4043d893706676dc70f0, +2020-05-13,Skincare,skincare,Tom Ford Research Skincare Review,https://www.downsstyle.com/skincare/2020/5/13/tom-ford-skincare-review-1,collection:skincare;sitemap,2020-05-22,200,https://www.downsstyle.com/skincare/2020/5/13/tom-ford-skincare-review-1,Chas Downs,is tom ford research skincare worth the price;review;skincare;tom ford;tom ford badass review;tom ford beauty;tom ford eyeshadow review;tom ford for men;tom ford for men review;tom ford luxury skincare;tom ford makeup;tom ford research creme concentrate;tom ford research results;tom ford research review;tom ford skincare;tom ford skincare for men;tom ford skincare review,529,2,861b11b771f521348317818f5a489a31a4cc89ad28d4e1cb05658eee1311e53e, +2020-05-23,Skincare,skincare,KORA Organics Skincare Review,https://www.downsstyle.com/skincare/2020/5/23/kora-organics-skincare-review,collection:skincare;sitemap,2020-05-26,200,https://www.downsstyle.com/skincare/2020/5/23/kora-organics-skincare-review,Chas Downs,best organic skincare;certified organic skincare;clean skincare review;clean skincare sephora review;kora organics;kora organics brand review;kora organics noni bright vitamin c serum review;kora organics noni glow face oil;kora organics review;kora organics serum review;kora organics skincare;kora organics skincare review;kora organics vitamin c serum;organic;organic skincare;organics;organics skincare;review;skincare;skincare review;skincare routine;tatcha skincare review,503,2,1e19c418ba5f5232332097c664f41bcf89ab85ab4b627293bf9fb646fee6e10d, +2020-05-24,Masks,masks,KORA Organics Noni Glow Sleeping Mask,https://www.downsstyle.com/masks/2020/5/24/kora-organics-noni-glow-sleeping-mask,collection:masks;homepage;sitemap,2020-05-24,200,https://www.downsstyle.com/masks/2020/5/24/kora-organics-noni-glow-sleeping-mask,Chas Downs,,286,2,799c990d77bea42010f476cfef8bdd3762549226b4ca7789d40c0fd135d0b385, +2020-05-25,Skincare,skincare,Aveeno Skincare Review,https://www.downsstyle.com/skincare/2020/5/25/8ar4dg2ytpyxe79m06gr5vzl4c43mj,collection:skincare;sitemap,2020-05-26,200,https://www.downsstyle.com/skincare/2020/5/25/8ar4dg2ytpyxe79m06gr5vzl4c43mj,Chas Downs,,405,2,bf7d54add3f4a177efa67c97903a43e00698c9423b95fd0ba5d7ced35c49cf10, +2020-05-26,Skincare,skincare,Olay Regenerist Skincare Review,https://www.downsstyle.com/skincare/2020/5/26/olay-regenerist-skincare-review,collection:skincare;sitemap,2020-05-27,200,https://www.downsstyle.com/skincare/2020/5/26/olay-regenerist-skincare-review,Chas Downs,,497,2,55b08c03b9aa45c7ef81bfb31bcd62e50e5f6e9577508c297f2a20aab7130e45, +2020-05-29,Skincare,skincare,The Ordinary Skincare Review,https://www.downsstyle.com/skincare/2020/5/28/the-ordinary-skincare-review,collection:skincare;sitemap,2020-05-29,200,https://www.downsstyle.com/skincare/2020/5/28/the-ordinary-skincare-review,Chas Downs,,471,2,df63ce3a55c401bd66e1e7462c4814c42c0ca6f795d84298c899262d62c2d6ae, +2020-06-11,Skincare,skincare,Edible Beauty Skincare Review,https://www.downsstyle.com/skincare/2020/6/11/edible-beauty-skincare-review,collection:skincare;sitemap,2020-06-11,200,https://www.downsstyle.com/skincare/2020/6/11/edible-beauty-skincare-review,Chas Downs,can I actually eat edible beauty skincare;can you eat edible beauty,623,2,a05f197854c23a3d786cd6ff7a3e0199b85d25cf67b62f190af57efaa9b8254c, +2020-07-01,Eat,new-blog-2,Best Places to Eat in Miami,https://www.downsstyle.com/new-blog-2/2018/4/28/best-places-to-eat-in-miami,collection:new-blog-2;sitemap,2022-01-19,200,https://www.downsstyle.com/new-blog-2/2018/4/28/best-places-to-eat-in-miami,Chas Downs,,387,17,b502d1bd49cafa4f065b821eb3c618faf749047ca23e39fdba6a78cd0ca8b02f, +2020-07-01,Eat,new-blog-2,My favorite smoothie recipes,https://www.downsstyle.com/new-blog-2/2020/7/1/my-favorite-smoothie-recipes,collection:new-blog-2;sitemap,2020-07-01,200,https://www.downsstyle.com/new-blog-2/2020/7/1/my-favorite-smoothie-recipes,Chas Downs,,177,5,2b055fe859ee5f5a51c139ef00fce25f9ebdbc8659959481148dd56158d3cf3f, +2020-07-05,Skincare,skincare,SkinFix Vegan Skincare Review,https://www.downsstyle.com/skincare/2020/7/3/skinfix-vegan-skincare-review,collection:skincare;sitemap,2020-07-07,200,https://www.downsstyle.com/skincare/2020/7/3/skinfix-vegan-skincare-review,Chas Downs,skinfix correct reviews;skinfix redness recovery reviews;skinfix reviews;skinfix scrub reviews;skinfix serum reviews;skinfix vegan skincare;skinfix vegan skincare review,516,2,0dd417d4facdb680e8f66eda0a86c6eb7bee6df3c66ba13ef54baa593eb1de00, +2020-07-27,Candles,new-blog,Beeswax Candles and why you need to make a switch,https://www.downsstyle.com/new-blog/2020/7/27/beeswax-candles-and-why-you-need-to-make-a-switch,collection:new-blog;homepage;sitemap,2023-06-27,200,https://www.downsstyle.com/new-blog/2020/7/27/beeswax-candles-and-why-you-need-to-make-a-switch,Chas Downs,3 sided angel lantern with flameless candle by homereflections;bath and body works candles;beans and rice;candle;candle empties;candle haul;candle impressions;candle impressions 23;candle magic;candle trash;candles;candles & scents;cinnamon;cinnamon cabin;cinnamon candle;cinnamon candles;euphoric eucalyptus;euphoric eucalyptus candle;homeworx candles;jasmine blossom;jasmine blossom candle;jasmine candle;kringle candles;lavender;lavender candle;lavitate;lavitate candle;luminara set of (4) flameless unscented candles with remotes;peppermind;peppermind candle;peppermint candle;rose thorn;rose thorn candle;rose thorn canlde;sephora sale recommendations;seven deadly sins grand cross;seven deadly sins: grand cross;sultry sandalwood;sultry sandalwood candle;transcend;transcend cosmetics;transcend cosmetics candle;transcend cosmetics essential oil;vanilla candle;vanilla vacay;vanilla vacay candle,275,3,9fdbae7e6d2eef163b641318e35568159369654b35ad76a01abb73d5c1a38fa5, +2020-07-27,Look Book,look-book,Summer Outfits I love,https://www.downsstyle.com/look-book/2020/7/27/summer-outfits-i-love,collection:look-book;sitemap,2020-08-11,200,https://www.downsstyle.com/look-book/2020/7/27/summer-outfits-i-love,Chas Downs,summer lookbook;summer outfits,119,9,a58372abbdce911d8c1432bbc7de4fbb4319446290946f218f82a137d42fb157, +2020-07-27,Skincare,skincare,Tata Harper Skincare Review,https://www.downsstyle.com/skincare/2020/7/27/tata-harper-skincare-review,collection:skincare;sitemap,2023-06-26,200,https://www.downsstyle.com/skincare/2020/7/27/tata-harper-skincare-review,Chas Downs,,596,2,d17060bb1aba20ecec799830398d11f64029597eb54c886724c02b020918ec96, +2020-07-30,Skincare,skincare,Glow Recipe Skincare Review,https://www.downsstyle.com/skincare/2020/7/30/3gxxvcdsyd8wp37y7amv274q8i553d,collection:skincare;sitemap,2020-07-31,200,https://www.downsstyle.com/skincare/2020/7/30/3gxxvcdsyd8wp37y7amv274q8i553d,Chas Downs,,411,2,8f7510c0a8bf0e3c9873da88729d9450c70e197480ebe20a828916d046cda805, +2020-08-03,Skincare,skincare,Self/ish Skincare,https://www.downsstyle.com/skincare/2020/8/3/selfish-skincare,collection:skincare;sitemap,2020-08-04,200,https://www.downsstyle.com/skincare/2020/8/3/selfish-skincare,Chas Downs,,223,1,90b064ac00f41d93f5b5924b70667fb2f615e54aa6404ff7c50b3f2f23a97e45, +2020-08-06,Look Book,look-book,Bathing Suits you need to check out,https://www.downsstyle.com/look-book/2020/8/6/bathing-suits-you-need-to-check-out,collection:look-book;sitemap,2020-08-11,200,https://www.downsstyle.com/look-book/2020/8/6/bathing-suits-you-need-to-check-out,Chas Downs,bathing suits men;best mens bathing suits;best swim trunks;trunks men;trunks men for summer,119,9,8721ce08f332a012a355c620053e0712bf82fd655bd1448195adbb0087ebd926, +2020-08-11,Look Book,look-book,Express Haul #ad,https://www.downsstyle.com/look-book/2020/8/7/express-haul-ad,collection:look-book;sitemap,2020-08-15,200,https://www.downsstyle.com/look-book/2020/8/7/express-haul-ad,Chas Downs,,199,7,caafd86ecabd36da7130b97e98f9343b10b790f0ecd22a8ed821cbb811122890, +2020-08-12,Masks,masks,Transcend Cosmetics Hydrating and Reparative Mask,https://www.downsstyle.com/masks/2020/8/12/transcend-cosmetics-hydrating-and-reparative-mask,collection:masks;homepage;sitemap,2020-08-12,200,https://www.downsstyle.com/masks/2020/8/12/transcend-cosmetics-hydrating-and-reparative-mask,Chas Downs,Transcend Cosmetics Hydrating & Reparative Mask;Transcend Cosmetics Hydrating and Reparative Mask;Transcend Cosmetics Hydrating and Reparative Mask does it actually repair;Transcend Cosmetics Hydrating and Reparative Mask ingredients;Transcend Cosmetics Hydrating and Reparative Mask is it worth it;Transcend Cosmetics Hydrating and Reparative Mask review,324,2,6eab2ce4c7fe9a9e2c9046635f5f32506eaa9918283c87719502a09c3a452a1d, +2020-08-12,Skincare,skincare,Juice Beauty Skincare Review,https://www.downsstyle.com/skincare/2020/8/12/juice-beauty,collection:skincare;sitemap,2020-08-12,200,https://www.downsstyle.com/skincare/2020/8/12/juice-beauty,Chas Downs,,682,2,af066487c03f5d8d4d310956d50d9f335bc97b7243a04ebd1172010f4c3024cb, +2020-08-15,Skincare,skincare,Beekman 1802 Goat milk Skincare Review,https://www.downsstyle.com/skincare/2020/8/15/beekman-1802-skincare-review,collection:skincare;sitemap,2020-08-15,200,https://www.downsstyle.com/skincare/2020/8/15/beekman-1802-skincare-review,Chas Downs,,816,2,cee184f563d98d1cc2b651bd767050c8a555f107e1732de6e3df7ba2518604ad, +2020-09-18,Skincare,skincare,BeautyCounter Skincare Review,https://www.downsstyle.com/skincare/2020/9/18/counterbeauty-skincare-review,collection:skincare;sitemap,2020-09-18,200,https://www.downsstyle.com/skincare/2020/9/18/counterbeauty-skincare-review,Chas Downs,,456,2,a1b9d1af5a0c9df2de134a5ae4b1719a8b0d516d2c6b3bd8d931068c89855fa0, +2020-09-21,Skincare,skincare,Fenty Skin,https://www.downsstyle.com/skincare/2020/9/21/fenty-skin,collection:skincare;sitemap,2020-10-01,200,https://www.downsstyle.com/skincare/2020/9/21/fenty-skin,Chas Downs,,278,2,2686aaf3208ce55a7433a3105ee5a2ee8aaff0097fe5fde47b5a4dd0be54527d, +2020-10-01,Skincare,skincare,Oxy Total Care,https://www.downsstyle.com/skincare/2020/10/1/oxy-total-care,collection:skincare;sitemap,2020-10-01,200,https://www.downsstyle.com/skincare/2020/10/1/oxy-total-care,Chas Downs,,282,2,e78a37124a831fd954ed4dc2e0d731e653d164f0b0ff1c4d1c96ad1ce71d4454, +2020-10-11,Look Book,look-book,Spring Outfits I love,https://www.downsstyle.com/look-book/2020/10/11/spring-outfits-i-love,collection:look-book;sitemap,2020-10-11,200,https://www.downsstyle.com/look-book/2020/10/11/spring-outfits-i-love,Chas Downs,,75,5,8571aaf3294b98fdccf3a087f653b518daac701854eeeec6e74dd69ec5d7be6e, +2020-12-07,Skincare,skincare,Amore Pacific Time Response Cream,https://www.downsstyle.com/skincare/2020/12/7/amore-pacific-time-response-cream,collection:skincare;sitemap,2020-12-07,200,https://www.downsstyle.com/skincare/2020/12/7/amore-pacific-time-response-cream,Chas Downs,,221,2,6b27cd1ac3f324ca4a436abdeef2ad176d1ff7a4f4bfb7958f90c30b2ed2d216, +2021-05-19,Interior Design,new-blog-1,Plants that transform your home into a clean environment,https://www.downsstyle.com/new-blog-1/2021/5/19/how-plants-transform-your-home-into-a-clean-environment,collection:new-blog-1;homepage;sitemap,2021-06-14,200,https://www.downsstyle.com/new-blog-1/2021/5/19/how-plants-transform-your-home-into-a-clean-environment,Chas Downs,air purifying plants;best house plants;best indoor plants;best indoor plants for beginners;easy plants;good indoor plants;house plants;how to care for indoor plants;indoor house plants;indoor plant care;indoor plants;indoor plants for beginners;indoor plants for decoration;indoor plants india;indoor plants low light;inside plants;inside plants for home;low light indoor plants;must have indoor plants;office plants;plant care;plants;plants for decoration;plants for home;plants for indoor,288,10,d0a5c2d4370eb74d040a7ddc043cf3fac26cc9e7650c46a888cc02d6769fdf57, +2021-05-21,Masks,masks,Chantecaille Hibiscus Smoothing Mask,https://www.downsstyle.com/masks/2021/5/21/chantecaille-hibiscus-smoothing-mask,collection:masks;homepage;sitemap,2021-05-21,200,https://www.downsstyle.com/masks/2021/5/21/chantecaille-hibiscus-smoothing-mask,Chas Downs,chantecaille;chantecaille bio lifting cream;chantecaille bio lifting mask;chantecaille exfoliator mask;chantecaille face mask review;chantecaille favorites;chantecaille gold mask;chantecaille gold mask review;chantecaille gold recovery mask;chantecaille hibiscus smoothing mask;chantecaille jasmine and lily healing mask;chantecaille review;chantecaille skincare;chantecaille skincare haul;chantecaille skincare review;face mask;hibiscus smoothing mask;smoothing face mask,260,2,1c142c6558580f76515a6f9e96a0e2919c11287450620c368088d3b78db0ca58, +2021-05-21,Skincare,skincare,Chantecaille Skincare Review,https://www.downsstyle.com/skincare/2021/5/21/chantecaille-skincare-review,collection:skincare;sitemap,2021-05-21,200,https://www.downsstyle.com/skincare/2021/5/21/chantecaille-skincare-review,Chas Downs,chantecaille;chantecaille blush review;chantecaille cheek gelee;chantecaille eyeshadow review;chantecaille foundation review;chantecaille future skin;chantecaille future skin cushion foundation;chantecaille future skin gel foundation review;chantecaille just skin tinted moisturizer;chantecaille lip veil;chantecaille review;chantecaille rose de mai face oil;chantecaille skincare;chantecaille skincare haul;chantecaille skincare review;luxury skincare review;skincare,376,2,23760a4ba4c5c8e314854902ae013b50c0bd7a3211d94dc9817749873353cbcd, +2021-06-14,Look Book,look-book,Outfits that will keep you cool this Summer,https://www.downsstyle.com/look-book/2021/6/14/outfits-that-will-keep-you-cool-this-summer,collection:look-book;sitemap,2021-06-14,200,https://www.downsstyle.com/look-book/2021/6/14/outfits-that-will-keep-you-cool-this-summer,Chas Downs,casual summer outfits;cool casual outfits;cute summer outfits;elegant summer outfits;how to stay cool in the summer;outfit idea for summer;outfit ideas;outfit ideas for summer;outfits;outfits of the week;outfits to keep you cool;outfits to keep you cool this summer;outfits to keep you warm;stylish summer outfits;summer outfit ideas;summer outfit inspo;summer outfits;summer outfits idea;summer outfits that are stylish;summer to winter outfits;winter outfits,299,5,651495154d8a68f8d8d01accb4f6159f2c6ac12195072acb263f22f808ac06b6, +2021-06-14,Look Book,look-book,Sunglasses a way to Spice up your Outfit,https://www.downsstyle.com/look-book/2020/8/7/sunglasses-a-way-to-spice-up-your-outfit,collection:look-book;sitemap,2021-06-15,200,https://www.downsstyle.com/look-book/2020/8/7/sunglasses-a-way-to-spice-up-your-outfit,Chas Downs,affordable sunglasses;affordable sunglasses for summer;best men's sunglasses for summer;best summer sunglasses;best sunglasses;best sunglasses for men;best sunglasses for men 2021;cheap sunglasses;designer sunglasses;luxury sunglasses;mens sunglasses;polarized sunglasses;summer;summer sunglasses;summer sunglasses for women;sunglasses;sunglasses for men;sunglasses for summer;sunglasses for summer 2016;sunglasses for summer 2018;sunglasses for women;sunglasses haul;the best sunglasses for men,58,6,1fff7ae3967844880f3b0235a314105fa7caffb81b45432ad58c4f955a7979cd, +2021-06-14,Skincare,skincare,Transcend Cosmetics Sunscreen,https://www.downsstyle.com/skincare/2021/6/14/transcend-cosmetics-sunscreen,collection:skincare;sitemap,2021-06-14,200,https://www.downsstyle.com/skincare/2021/6/14/transcend-cosmetics-sunscreen,Chas Downs,anti aging secrets;anti-aging sunscreen;best sunscreen;bh cosmetics;cosmetics;dermatologist recommended sunscreen;first aid beauty sunscreen;how to stop foundation creasing;invisible sunscreen;lightweight sunscreen;replenix sheer physical sunscreen;skinceuticals;spf;spf50;suncreen;sunscreen,540,2,1489a92f527f8df2950501c65bcd0eaeb7a694a70b8c6ae3356b2de5cdb0f0b0, +2021-06-15,Gift Inspo,gifts,Amazon Gifts that are good for all types of people,https://www.downsstyle.com/gifts/2020/7/7/amazon-gifts-that-is-good-for-all-types-of-people,collection:gifts;sitemap,2021-06-19,200,https://www.downsstyle.com/gifts/2020/7/7/amazon-gifts-that-is-good-for-all-types-of-people,Chas Downs,,104,9,b0116597d669cbffbabce9d733577b5ae4c75fbd011409588b8cf534599cc606, +2021-06-15,Travel,travel,Water Bottles that are great on the Go,https://www.downsstyle.com/travel/2021/6/15/water-bottles-that-are-great-on-the-go,collection:travel;sitemap,2021-06-15,200,https://www.downsstyle.com/travel/2021/6/15/water-bottles-that-are-great-on-the-go,Chas Downs,,319,5,64627ddee6b9ea33d3b4ca474a4103b4e00a607cd892b5f62c6a236e1f992ce3, +2021-09-03,Skincare,skincare,Tatcha Skincare Review,https://www.downsstyle.com/skincare/2021/9/3/cnoqrmcsdc734pj1g3ah4o5rl40aqt,collection:skincare;sitemap,2021-09-03,200,https://www.downsstyle.com/skincare/2021/9/3/cnoqrmcsdc734pj1g3ah4o5rl40aqt,Chas Downs,,567,1,2c8c54035592349983f8fea5d4a5ca9d8df9012a6d3b4d6179a088cc3b379ed4, +2021-09-08,Travel,travel,Learning on the Go #ad,https://www.downsstyle.com/travel/2021/9/8/jwqfs0xs8k94mtoh1uqhkla68jlhg8,collection:travel;sitemap,2021-09-08,200,https://www.downsstyle.com/travel/2021/9/8/jwqfs0xs8k94mtoh1uqhkla68jlhg8,Chas Downs,,280,2,37c2c99f7a36af35b246d9bcd456d9076d01a28a8ae40d35bea8780f08ccba74, +2021-11-08,Travel,travel,Midterm Portfolio Blog,https://www.downsstyle.com/travel/2021/11/8/53uig13g12vetej0dagxp6x9kpy4dd,collection:travel;sitemap,2021-11-08,200,https://www.downsstyle.com/travel/2021/11/8/53uig13g12vetej0dagxp6x9kpy4dd,Chas Downs,,687,1,e3c008636f073df110197be4b29a218b858d601b3a69dba8bb55cac6a9a708a2, +2021-11-15,Skincare,skincare,Kate Somerville Anti Aging Skincare Routine Review,https://www.downsstyle.com/skincare/2021/11/15/kate-somerville-anti-aging-skincare-routine-review,collection:skincare;sitemap,2021-12-10,200,https://www.downsstyle.com/skincare/2021/11/15/kate-somerville-anti-aging-skincare-routine-review,Chas Downs,kate somerville;kate somerville acne;kate somerville clinic;kate somerville delikate;Kate Somerville dermalquench review;kate somerville exfolikate;kate somerville exfolikate cleanser;kate somerville exfolikate cleanser review;kate somerville exfolikate review;kate somerville exfolikate treatment review;kate somerville retinol eye cream;Kate Somerville review;kate somerville review;kate somerville skincare;kate somerville skincare review;kate somerville spray;kate somerville spraykate somerville;Kate somverville anti aging;Kate somverville anti aging review;skincare review;somerville;wrinkle warrior kate somerville,607,2,64394ade02bd92b0d249baeed7b5f9d5464447cdb8f6672e24278bf7535899b1, +2021-11-19,Candles,new-blog,Why Organic Beeswax Candles are the best Wax to burn,https://www.downsstyle.com/new-blog/2021/11/19/why-organic-beeswax-candles-are-the-best-wax-to-burn,collection:new-blog;homepage;sitemap,2023-06-27,200,https://www.downsstyle.com/new-blog/2021/11/19/why-organic-beeswax-candles-are-the-best-wax-to-burn,Chas Downs,#cosmetics;3 sided angel lantern with flameless candle by homereflections;bath and body works candles;beans and rice;best and worst rare beauty;camera ready cosmetics;candle;candle empties;candle haul;candle impressions;candle impressions 23;candle magic;candle trash;candles;candles & scents;cosmetics;euphoric eucalyptus;euphoric eucalyptus candle;fragrances;grande cosmeticd;homeworx candles;it cosmetics;jasmine blossom;jasmine blossom candle;jouer cosmetics;kringle candles;lavender;lavender candle;lavitate;lavitate candle;lightwork transcendence;luimen cosmetics;luminara set of (4) flameless unscented candles with remotes;makeup prosthetics;men's cologne;men's fragrance;prosthetic makeup;prosthetic wired;prosthetics;prosthetics tutorial;prosthetics wired;rose thorn;rose thorn canlde;sandalwood;sandalwood candle;sephora sale recommendations;seven deadly sins grand cross;seven deadly sins: grand cross;soothing sage;soothing sage candle;stila cosmetics;sultry sandalwood;sultry sandalwood candle;tienda cosmetica;transcend;transcend cosmetics;transcend cosmetics candle;transcend cosmetics essential oil;trending makeup;trixie cosmetics;vanilla candle;vanilla vacay;vanilla vacay candle;wired prosthetics tutorial;women's fragrance,464,1,23755eada1216ecf841ef4e288a1964f22e0ed442907ea3bb7be2571ecc0da38, +2021-11-19,Skincare,skincare,5 benefits of Organic Skincare products vs drug store products,https://www.downsstyle.com/skincare/2021/11/19/5-benefits-of-organic-skincare-products-vs-drug-store-products,collection:skincare;sitemap,2021-11-19,200,https://www.downsstyle.com/skincare/2021/11/19/5-benefits-of-organic-skincare-products-vs-drug-store-products,Chas Downs,,457,1,28450425a03632ac422e0ccfc1b83fcfd77432f5b482ab5128bb3b66af1259f9, +2021-11-30,Eat,new-blog-2,Organic Ice Cream Recipe,https://www.downsstyle.com/new-blog-2/2021/11/30/cj969cmdelgbd5onlq9reazoyd2ywl,collection:new-blog-2;sitemap,2021-12-07,200,https://www.downsstyle.com/new-blog-2/2021/11/30/cj969cmdelgbd5onlq9reazoyd2ywl,Chas Downs,,144,1,79ddeb8eb291831985414357cadfd16724a2e56372e8e8e008074965f7da3fea, +2021-12-10,Eat,new-blog-2,Foods to help your skin,https://www.downsstyle.com/new-blog-2/2021/12/9/0gu8w9kw5rmz6ucqlczsh0e27drpc0,collection:new-blog-2;sitemap,2021-12-10,200,https://www.downsstyle.com/new-blog-2/2021/12/9/0gu8w9kw5rmz6ucqlczsh0e27drpc0,Chas Downs,foods for skin;foods to help your skin;what to eat to get rid of acne,1195,13,c814879f055706b35ad0f86dbb7c94955fe9c13cb8d5ed22e395938d192b4280, +2021-12-11,Gift Inspo,gifts,"Gifts that are great for all, this Holiday Season",https://www.downsstyle.com/gifts/2021/12/11/76hfpq9t6xyhxtd82nhxrg4ou8g0xj,collection:gifts;sitemap,2021-12-21,200,https://www.downsstyle.com/gifts/2021/12/11/76hfpq9t6xyhxtd82nhxrg4ou8g0xj,Chas Downs,gift guide;holiday gift guide;holiday gifts,102,9,eaf070a9ff141ff48129d3e4bd1392f9d20d63e6e4c097985e52ae5a15da9fd8, +2021-12-11,Interior Design,new-blog-1,Cool Lamps to ditch overhead lighting,https://www.downsstyle.com/new-blog-1/2021/6/19/eds62j64c2p5tjf3rmj90md6idkdn5,collection:new-blog-1;homepage;sitemap,2021-12-11,200,https://www.downsstyle.com/new-blog-1/2021/6/19/eds62j64c2p5tjf3rmj90md6idkdn5,Chas Downs,,50,10,1242bfa394f88bd8cbfce61b2dab532a141b485b2a4ab96ba6c1fc92371526e2, +2021-12-21,Gift Inspo,gifts,Gifts I would give to friends,https://www.downsstyle.com/gifts/2018/4/28/gifts-i-would-give-to-friends,collection:gifts;sitemap,2021-12-23,200,https://www.downsstyle.com/gifts/2018/4/28/gifts-i-would-give-to-friends,Chas Downs,,131,12,b94d60e54604c716e15f77deaf5b833081b356d07e9f80537cb427fbe1659c54, +2021-12-21,Look Book,look-book,Basics You Need In Your Closet,https://www.downsstyle.com/look-book/2020/4/28/basics-you-need-in-your-closet,collection:look-book;sitemap,2021-12-23,200,https://www.downsstyle.com/look-book/2020/4/28/basics-you-need-in-your-closet,Chas Downs,,231,15,44e68fdb848d63e74941674e00dd0de172b51b75f59f7c44dd7cc9c837e0402b, +2021-12-23,Interior Design,new-blog-1,10 Pieces you need in your home,https://www.downsstyle.com/new-blog-1/2018/6/27/10-pieces-you-need-in-your-home,collection:new-blog-1;homepage;sitemap,2021-12-23,200,https://www.downsstyle.com/new-blog-1/2018/6/27/10-pieces-you-need-in-your-home,Chas Downs,,106,2,27a40f359f547a916be38b314ac7fc90fc3dc0e7f0ce1540bf7441492f3b7be8, +2021-12-26,Workouts/Diet,workoutsdiet,At Home Workout Essentials,https://www.downsstyle.com/workoutsdiet/2020/4/28/at-home-workout-essentials,collection:workoutsdiet;sitemap,2021-12-27,200,https://www.downsstyle.com/workoutsdiet/2020/4/28/at-home-workout-essentials,Chas Downs,,121,4,7b2a1f4a50b7a0adc894878848308f85619e88dc14ec88f9ac54a57a86bafc9f, +2022-01-06,Skincare,skincare,How to keep glowing skin,https://www.downsstyle.com/skincare/2022/1/6/ez455l4mzmxas319jkj47kgjy4okc6,collection:skincare;sitemap,2022-01-07,200,https://www.downsstyle.com/skincare/2022/1/6/ez455l4mzmxas319jkj47kgjy4okc6,Chas Downs,,1094,1,8e7abd54a4ee8ba868bdb53a93420081aef624a21134ede061330b28b126f9c5, +2022-01-07,Look Book,look-book,Accessories that spice up any outfit,https://www.downsstyle.com/look-book/2022/1/7/z7kaewqyypo5yx8q3c93n4cxpo9v07,collection:look-book;sitemap,2022-01-11,200,https://www.downsstyle.com/look-book/2022/1/7/z7kaewqyypo5yx8q3c93n4cxpo9v07,Chas Downs,,390,6,a6b99a3218e77b3b57fc8d233484e9fee8421952420cc540969f406ac8aa749c, +2022-01-11,Skincare,skincare,Biossance Skincare Review,https://www.downsstyle.com/skincare/2022/1/11/j7chyg49uqr314ka1p49xocjxch6zh,collection:skincare;sitemap,2023-06-08,200,https://www.downsstyle.com/skincare/2022/1/11/j7chyg49uqr314ka1p49xocjxch6zh,Chas Downs,,412,2,4139202c34b6936beef9bf0f42d9bf126099be43dad0480dc4d18e29bf9e4aaa, +2022-01-18,Eat,new-blog-2,Best Places to Eat in New York,https://www.downsstyle.com/new-blog-2/2018/4/28/best-places-to-eat-in-new-york,collection:new-blog-2;sitemap,2022-01-19,200,https://www.downsstyle.com/new-blog-2/2018/4/28/best-places-to-eat-in-new-york,Chas Downs,,131,12,c78850e88f525c0819841e496ce9e4c36acebab0da0334059eae71ca0dac5dcd, +2022-01-22,Eat,new-blog-2,Juice Cleanse & Why,https://www.downsstyle.com/new-blog-2/2018/4/28/juice-cleanse-why,collection:new-blog-2;sitemap,2023-06-08,200,https://www.downsstyle.com/new-blog-2/2018/4/28/juice-cleanse-why,Chas Downs,,197,7,eeb1166f9f3d9effa69c05b47bf9ba0b0f2b051dd0b373d50dcdd9ca067cbfae, +2023-06-01,Interior Design,new-blog-1,Cool finds for Home,https://www.downsstyle.com/new-blog-1/2023/6/1/e7xw93oyn2vpts9gix00eg4e0sery2,collection:new-blog-1;homepage;sitemap,2023-06-07,200,https://www.downsstyle.com/new-blog-1/2023/6/1/e7xw93oyn2vpts9gix00eg4e0sery2,Chas Downs,5 super cool things you want in your home now!;amazon;amazon favorites;amazon favorites home decor;amazon finds;amazon finds tiktok;amazon finds with links;amazon haul;amazon home;amazon home 2023;amazon home decor;amazon home decor haul;amazon home decor haul 2023;amazon home favorites;amazon home favorites 2023;amazon home finds;amazon home haul;amazon home must haves;amazon must haves;best amazon home decor;best amazon home finds;best amazon home products;charismas gifts for friends;cool;cool gadgets;cool things;decor finds;gadgets for your home;home;home decor;home decor haul;home decorating ideas;home gadgets;home gadgets 2021;home gadgets on amazon;home gadgets shorts;homes for sale;ideas for life;ikea home decor;new home decor;smart home;smart home gadgets;thrifting home decor;tiktok amazon finds;xcool home gadgets,88,3,8271d516e35ff426de1c301085db259cab2c65a823dacd453d194ae649ac756d, +2023-06-04,Skincare,skincare,Savannah Bee Company Review,https://www.downsstyle.com/skincare/2023/6/4/savannah-bee-company-review,collection:skincare;sitemap,2023-06-04,200,https://www.downsstyle.com/skincare/2023/6/4/savannah-bee-company-review,Chas Downs,,95,1,acbd3313ec655f4d8a1079db1c128be05c8ff51476e07512be713b6d18d85282, +2023-06-06,Eat,new-blog-2,Steak Houses I love in Miami,https://www.downsstyle.com/new-blog-2/2023/6/6/steak-houses-i-love-in-miami,collection:new-blog-2;sitemap,2023-06-07,200,https://www.downsstyle.com/new-blog-2/2023/6/6/steak-houses-i-love-in-miami,Chas Downs,bar food;best food;best food in miami;best food miami;best food miami beach;best food places in miami;best miami food;best places to eat in miami;cuban food;delhi street food;fast food;food;food asmr;food blog;food challenge;food in miami;food insider;food platter;food short;food shorts;food tour;food truck;food tube;food video;food videos;food vlog;food vlogs;food wars;foodie;foodie shorts;foods;hanoi street food;indian street food;miami;miami beach;miami cuban food;miami florida;miami food;miami food guide;miami food hotspots;miami food spots;miami food tour;miami foodie;miami places to eat;miami restaurants;miami street food;motu foodie;nyc food;prime 112;prime italian;spicy food;street food;street food india;street food shorts;things to do in miami;top food spots in miami;top places to eat in miami;unlimited food;vietnam food;vietnam street food,66,5,72f4703ad1b68adced88e3d7d42e2d277d4f58b7eaf04859c47fcc60e7376a8a, +2023-06-06,Interior Design,new-blog-1,Vases for your flowers,https://www.downsstyle.com/new-blog-1/2023/6/6/vases-for-your-flowers,collection:new-blog-1;homepage;sitemap,2023-06-07,200,https://www.downsstyle.com/new-blog-1/2023/6/6/vases-for-your-flowers,Chas Downs,1 hour flowers;buy myself flowers;can buy myself flowers;flower;flower tv comedy;flower tv malayalam;flowers;flowers 1 hour;flowers cover;flowers lyrics;flowers lyrics miley cyrus;flowers miley cyrus;flowers miley cyrus 1 hour;flowers miley cyrus lyrics;flowers tv;i can buy myself flowers;jisoo flower;lyrics flowers;lyrics miley cyrus flowers;miley cyrus flowers;miley cyrus flowers lyrics;miley cyrus lyrics flowers;zay flowers;지수 flower,73,7,a73cf0140c1b64cfad73c51960f702a54bfbd6aedb79817283bf5a101a74844b, +2023-06-06,Look Book,look-book,Summer Outfits,https://www.downsstyle.com/look-book/2023/6/6/summer-outfits,collection:look-book;sitemap,2023-06-09,200,https://www.downsstyle.com/look-book/2023/6/6/summer-outfits,Chas Downs,2023;best mens swimsuits;best summer outfits for men;Burberry;burberry;burberry bag;burberry bear;burberry belt;burberry bucket hat;burberry bucket hat burberry shirt burberry hat;burberry handbag;burberry hat;burberry hat unboxing;burberry hats;burberry haul;burberry headband;burberry rtw;burberry shoes;burberry shopping;burberry shorts;burberry skirt;burberry sneakers;burberry unboxing;casual outfits;casual summer outfit ideas;casual summer outfits;christian dior;christian dior sunglasses;cute summer outfits;dior;dior club sunglasses review;dior eyewear sunglasses;dior so real sunglasses;dior sunglasses;dior sunglasses evay;dior sunglasses for women;dior sunglasses review;fake dior sunglasses;hat;how to spot fake dior sunglasses;j crew;James perse;legit check dior sunglasses;lookbook;Lulu lemon;luxury burberry haul;men's outfits;mens outfits;mens swimsuit;mens swimsuits;orlebar brown;outfit ideas;outfits;outfits for summer;rag and bone;real dior sunglasses;real vs fake dior sunglasses;spot original dior sunglasses;spring outfits;styling burberry shorts with burberry shirt and hat;summer;summer cookbook 2023;summer fashion;summer fits;summer lookbook;summer looks;summer outfit;summer outfit ideas;summer outfit ideas for men;summer outfit inspiration;summer outfits;summer outfits 2021;summer outfits 2023;summer outfits for men;summer outfits men;summer style;sunglasses;swimsuit;unboxing dior sunglasses;unboxing my cute little burberry hat;vilbrequin;vilbrequin 2019;vilebrequin;vilebrequin -;vilebrequin denim 2019;vilebrequin fashion show;vilebrequin fw19;vilebrequin kids swimwear;vilebrequin men's;vilebrequin miami swim week;vilebrequin resort wear;vilebrequin spring summer 2018;vilebrequin spring summer 2022;vilebrequin starlettes;vilebrequin swimwear dubai;vilebrequin swimwear fashion show at atr hearts fashion;vilebrequin x off-white;white sunglasses dior,120,3,e5da019106e3eb3525bd77ac4e16d1cd806fb8004e28f2563d6f3d9e97d4ec4e, +2023-06-06,Workouts/Diet,workoutsdiet,Keto Diet,https://www.downsstyle.com/workoutsdiet/2023/6/6/keto-diet,collection:workoutsdiet;sitemap,2023-06-08,200,https://www.downsstyle.com/workoutsdiet/2023/6/6/keto-diet,Chas Downs,100 g protein vegan diet;balanced vegetarian diet;bloating vegan diet;carnivore vs vegan diet;diet;diet for vegetarians;downsstyle;how to do keto;how to start keto diet;joe rogan vegan diet;keto;keto diet;keto diet and gym;keto diet at home;keto diet dinner;keto diet explained;keto diet for beginners;keto diet girl;keto diet guide;keto diet hindi;keto diet kya h;keto diet plan;keto diet results;keto diet review;keto diet rules;keto diet tips;keto food;keto meals;keto recipes;keto snacks;keto weight loss;ketogenic diet;low carb diet;plant based diet;protein sources in vegan diet;raw vegan diet;starting a vegetarian diet;vegan;vegan diet;vegan diet before and after;vegan diet benefits;vegan diet for muscle building;vegan diet for weight loss;vegan diet weight loss;vegan food;vegan leaky gut diet;vegan nutritionist;vegan recipes;vegan vs carnivore diet;vegetarian;vegetarian diet;vegetarian diet benefits;vegetarian diet definition;vegetarian diet during pregnancy;vegetarian diet for beginners;vegetarian diet for bodybuilding;vegetarian diet for fat loss;vegetarian diet for weight gain;vegetarian diet plan;vegetarian diet recipes;vegetarian diet weight loss;vegetarian protein diet plan;what is a vegetarian diet;what is keto;what is the keto diet;what to eat on a vegan diet,106,8,c1ec179788098aadca67f09fc8692a0402d8245f639bc5a1202c619901125531, +2023-06-07,Look Book,look-book,Jewelry to level up any outfit,https://www.downsstyle.com/look-book/2023/6/7/jewelry-to-level-up-any-outfit,collection:look-book;homepage;sitemap,2023-07-29,200,https://www.downsstyle.com/look-book/2023/6/7/jewelry-to-level-up-any-outfit,Chas Downs,ana luisa;ana luisa bracelet;ana luisa code;ana luisa earring;ana luisa earrings;ana luisa earrings review;ana luisa haul;ana luisa honest review;ana luisa jewelry;ana luisa jewelry collection;ana luisa jewelry review;ana luisa michelle;ana luisa necklace;ana luisa ny;ana luisa quality;ana luisa review;ana luisa ring;ana luisa rings;ana luisa rope ring;ana luisa scam;ana luisa shoplog;ana luisa unboxing;artificial jewellery;bracelet;brass jewelry;cartier;cartier bracelet;cartier clou bracelet;cartier collection;cartier juc;cartier juste un clou;cartier juste un clou bracelet;cartier juste un clou bracelet small;cartier love;cartier love bracelet;cartier love bracelet review;cartier love bracelet size 15 vs 16;cartier love bracelet small;cartier love ring;cartier nail bracelet;cartier ring;cartier sm bracelet;cartier small love bracelet;cartier tank;cartier unboxing;dainty jewelry;diy jewelry;everyday jewelry;gold jewellery collection;gold jewellery designs;gold jewelry;gold smith jack jewelry;hand made jewellery;handmade jewelry;haul ana luisa;how to jewelry;how to make jewellry;how to make jewelry;how to photograph jewelry;is ana luisa worth it;jewellery (industry);jewellery making;jewellery wholesale market;jewelry;jewelry business;jewelry care;jewelry design;jewelry kit;jewelry making;jewelry marketing;jewelry photography;jewelry retouching;jewelry technique;jewelry tutorial;lali esposito;lali jo lali jo telugu song;lali storytime;lalilu;lightweight gold jewellery;love bracelet;mejuri jewelry;payal jewellery wholesale market;pearl jewellery making at home;pearl jewelry;photographing jewelry;ruby beads jewellary;sadar bazar jewellery market;small jewelry business;vintaj jewelry;wholesale jewellery market,282,18,c470fd3fe9b238cd364fb901648535a81fd6115bd14f748caeb821c34c9c028b, +2023-06-07,Workouts/Diet,workoutsdiet,Juice Diet,https://www.downsstyle.com/workoutsdiet/2023/6/7/juice-diet,collection:workoutsdiet;sitemap,2023-06-08,200,https://www.downsstyle.com/workoutsdiet/2023/6/7/juice-diet,Chas Downs,3 day juice cleanse;3 misconceptions about juice cleanses;5 days on a juice cleanse;blog;clean juice 3 day cleanse;cleanse;creating a food blog;detox cleanse;downsstyle;food;food blog;food blog demotivation;food blog malayalam;food blogger;food blogging for beginners;food blogging tips;food vlog;food vlog malayalam;food vlogs;foodie;green juice;how to create a food blog;how to do a juice cleanse;how to juice;how to juice cleanse;how to start a food blog;indian food;juice;juice cleanse;juice cleanse before and after;juice cleanse benefits;juice cleanse diy;juice cleanse weight loss;juice cleanses;juice cleansing;juice detox;juice fast;juice fasting;making a food blog;reasons to start a food blog;setting up food blog;smoothie blog;start a food blog;start food blog;starting a food blog;starting food blog;street food;trying a juice cleanse;trying a juice cleanse for 1 day;wordpress food blog,85,4,430d48ad57b4357fef280c28a6966dab9d98c2a3693dff085b53df79989602c2, +2023-06-08,Eat,new-blog-2,My favorite Salads,https://www.downsstyle.com/new-blog-2/2023/6/8/my-favorite-salads,collection:new-blog-2;sitemap,2023-06-09,200,https://www.downsstyle.com/new-blog-2/2023/6/8/my-favorite-salads,Chas Downs,avocado salad;best caesar salad;best caesar salad dressing;best cobb salad;best salad;best salads;caesar;caesar dressing;caesar salad;caesar salad chicken;caesar salad dressing;caesar salad dressing recipe;caesar salad recipe;caesar salad vegetarian;ceasar salad;chicken caesar salad;chicken caesar salad recipe;chicken cobb salad;chicken salad;cob salad;cobb salad;cobb salad 101;cobb salad dressing;cobb salad dressing recipe;cobb salad recipe;corn salad;cucumber salad;easy caesar salad;easy cobb salad;easy salad;easy salad recipes;fresh salad;garden salad;greek salad;healthy salad;healthy salad recipes;homemade caesar salad;homemade caesar salad dressing;homemade salad dressing;how to make a cobb salad;how to make a salad;how to make caesar salad;how to make caesar salad dressing;how to make caesar salad easy;how to make cobb salad;how to make salad;how to make salad dressing;is salad a virus;is salad legit;is salad safe;kale salad;keto cobb salad;keto salad;korean salad;making caesar salad;mattys favorite salad;meal prep salad;popular salad;protein salad;restaurant salad;restaurant style salad;salad;salad (type of dish);salad dressing;salad dressing recipe;salad dressing recipes;salad dressings;salad ideas;salad recipe;salad recipes;salads;salmon cobb salad;salmon salad;simple salad;summer salad;the best cobb salad;tomato salad;vegetable salad;yummy salad,116,6,292074b9f196df958310fada2c6f40c430ee2859858566fa18d99dd768234318, +2023-06-08,Look Book,look-book,White for Summer,https://www.downsstyle.com/look-book/2023/6/8/white-for-summer,collection:look-book;homepage;sitemap,2023-06-08,200,https://www.downsstyle.com/look-book/2023/6/8/white-for-summer,Chas Downs,15 white summer dresses;all white;all white outfit;all white outfit ideas;all white outfits;all white outfits for men;all white outfits for women;all white party outfit ideas;all white summer outfits;best tom ford;black and white outfits;casual chic summer outfits;casual summer outfits;chic white outfits;ford;how to decorate for summer;how to style white jeans for summer;how to wear a white summer dress;mens all white outfits;mens outfits;monochromatic outfits;mr tom ford;outfit ideas;outfits;outfits for summer;simple white outfits;summer;summer outfit ideas;summer outfits;summer outfits 2022;summer outfits with white;summer style;summer walker white tee;the summer of the beautiful white horse;tom;tom ford;tom ford 2013;tom ford 2018;tom ford 2019;tom ford advice;tom ford fashion;tom ford for men;tom ford fragrance;tom ford fragrances;tom ford gives makeover;tom ford gq;tom ford interview;tom ford makeover;tom ford ombre leather;tom ford peach dawn quad;tom ford perfumes;tom ford private blend;tom ford speech;tom ford style;tom ford suit;tom ford talk;tom ford teaches;tom ford womenswear;white blazer outfits summer;white dress for summer;white fox boutique summer try on haul;white in summer;white jeans outfits;white jeans summer outfits;white on white outfits;white outfit;white outfit for summer;white outfit ideas;white outfits;white pants outfit;white shirt outfits;white skirt summer;white sneakers for men;white summer;white summer dress;white summer outfit;white t-shirt outfits for summer;white t-shirt outfits for summer 2021;winter outfits,97,6,277002b30d3050a9878f5807d9a23f652c34f3e97b545509d588b46cd6026fe9, +2023-06-08,Workouts/Diet,workoutsdiet,My Yoga Routine,https://www.downsstyle.com/workoutsdiet/2023/6/8/my-yoga-routine,collection:workoutsdiet;sitemap,2023-06-08,200,https://www.downsstyle.com/workoutsdiet/2023/6/8/my-yoga-routine,Chas Downs,10 min yoga;10 minute meditation;10 minute yoga;15 min yoga;30 days of yoga;ashtanga yoga;at home yoga;beginner yoga;beginners yoga;deep sleep meditation music;fast meditation;free yoga;free yoga videos;full body yoga;guided meditation;guided meditation 10 minutes;healing meditation;home yoga;home yoga practice;how to do yoga;meditation;meditation 10 minutes;meditation for anxiety;meditation for beginners;meditation for sleep;meditation guided;meditation morning;meditation music;meditation music for sleep;meditation music relax mind body;mindfulness meditation;morning meditation;morning yoga;online yoga;positive energy meditation;power yoga;quick meditation;sleep meditation;vinyasa yoga;yoga;yoga at home;yoga basics;yoga class;yoga flow;yoga for beginners;yoga for flexibility;yoga for kids;yoga poses;yoga practice;yoga stretch;yoga with adrienne;yoga workout,108,3,ff5f644d37710eca62ffe07d6d0f3d107000e45dd60328162072986bab7ec7b7, +2023-06-09,Gift Inspo,gifts,Crystals I would gift my besties,https://www.downsstyle.com/gifts/2023/6/9/crystals-i-would-gift-my-besties,collection:gifts;sitemap,2023-06-09,200,https://www.downsstyle.com/gifts/2023/6/9/crystals-i-would-gift-my-besties,Chas Downs,#rose quartz;ale zalewa nas obsydian!;american turquoise;benefits of tigers eye;best turquoise;black obsydian;bronx;conan exiles obsydian;czarny obsydian;czy widzisz obsydian na obrazku;czy widzisz tu obsydian;czy znajdziesz tu obsydian;dyed turquoise;eye of the tiger;fake turquoise;first time hearing onyx;first time hearing onyx shut em down;funny;funny compilation;gem turquoise;goons;green turquoise;griselda onyx - back to the future;how to turquoise;how to use rose quartz crystal;huda beauty rose quartz palette tutorial;jak zdobyć obsydian;jak zrobić obsydian;jak zrobić obsydian z redstone;kingman turquoise;kingman turquoise mine;lomo turquoise;minecraft obsydian;minecraft poradnik obsydian;natural turquoise;ny;obsdian;obsidian;obsidian aj;obsydian;obsydian aj;obsydian czarny armenia;obsydian horseshoe;obsydian kekfest;obsydian rising;on foot;onyx;onyx (composer);onyx (musical group);onyx aint no time to rest;onyx dope dod;onyx family;onyx kids;onyx mixtape;onyx poke 4;onyx rest;onyx shut em down;onyx shut em down reaction;onyx team;onyx the gaming machine;onyx time;quartz;raekwon;red tigers eye meaning;rose;rose quarts;rose quartz;rose quartz 2022;rose quartz about;rose quartz and greg;rose quartz benefits;rose quartz crystal;rose quartz crystal healing;rose quartz for love;rose quartz fusion;rose quartz healing;rose quartz love;rose quartz meaning;rose quartz member;rose quartz mv;rose quartz power;rose quartz roller;rose quartz stone;rough turquoise;sleeping beauty turquoise;song;sony dpt;sposób na obsydian;survivor eye of the tiger;tiger eye;tiger eye bracelet;tiger eye crystal;tigers eye;tigers eye benefits;tigers eye crystal;tigers eye crystal benefits;tigers eye crystal healing;tigers eye crystal meaning;tigers eye healing;tigers eye healing properties;tigers eye meaning;tigers eye meditation;tigers eye properties;tigers eye solar plexus;tigers eye stone;tigers eye stone benefits;turquoise;turquoise 101;turquoise carpet;turquoise history;turquoise jewelry;turquoise matrix;turquoise mine;turquoise ring;turquoise side;turquoise stone;turquoise test;turquoiseau;vinyl;why is turquoise stabilized;yeezy 350 onyx;yeezy slide onyx;zalewa nas obsydian,311,8,3c33a3179c5441693308f1d4886566bbbe9ffaceea3349dc50a87556ba62d43b, +2023-06-11,Skincare,skincare,Dermalogica Skincare Review,https://www.downsstyle.com/skincare/2023/6/11/dermatologica-skincare-review,collection:skincare;sitemap,2023-06-25,200,https://www.downsstyle.com/skincare/2023/6/11/dermatologica-skincare-review,Chas Downs,dermalogica;dermalogica acne skincare;dermalogica daily microfoliant;dermalogica facial;dermalogica precleanse;dermalogica review;dermalogica reviews;dermalogica sensitive skincare;dermalogica skin care;dermalogica skin smoothing cream;dermalogica skin smoothing cream review;dermalogica skin-care review;dermalogica skincare;dermalogica skincare review;dermalogica special cleansing gel;review;skincare;skincare review;skincare routine,304,2,e2eb38c946e3d6ea65fb63510efc1b69d21f0eba6bba67673871d6bd248fbe4e, +2023-06-13,Gift Inspo,gifts,Fathers Day Gift Guide,https://www.downsstyle.com/gifts/2023/6/13/fathers-day-gift-guide,collection:gifts;sitemap,2023-06-14,200,https://www.downsstyle.com/gifts/2023/6/13/fathers-day-gift-guide,Chas Downs,best fathers day gifts;diy fathers day ideas;father's day gift guide;father's day gift ideas;fathers day;fathers day diy ideas;fathers day gift;fathers day gift guide;fathers day gift guide 2022;fathers day gift guide 2023;fathers day gift ideas;fathers day gift ideas easy;fathers day gifts;fathers day gifts 2022;fathers day gifts 2023;fathers day gifts amazon;fathers day ideas;gift guide;gift guide for fathers day;inexpensive fathers day gifts,73,3,fb209f3e67b1001f5dee56e4c1b2bad38a9cdc23cef5944f988ba268c5d567b2, +2023-06-15,Skincare,skincare,Elf Skin Review,https://www.downsstyle.com/skincare/2023/6/15/elf-skin-review,collection:skincare;sitemap,2023-06-15,200,https://www.downsstyle.com/skincare/2023/6/15/elf-skin-review,Chas Downs,dr dray elf pure skin;dry skin;elf;elf cosmetics;elf cosmetics review;elf holy hydration review;elf makeup;elf makeup review;elf pure skin;elf pure skin cleanser;elf pure skin collection review;elf pure skin reviews;elf pure skin skincare review;elf pure skin toner;elf review;elf skin;elf skin care;elf skin care review;elf skin care routine;elf skin care test;elf skin hit kit review;elf skin hit kit reviews;elf skin suntouchable sunscreen primer;elf skin suntouchable whoa glow spf 30 sunscreen primer;elf skincare;elf skincare line review;elf skincare products;elf skincare review;fair skin;review;skin care;skin care routine;skincare review,265,2,7f5efbcae3a3b04a0013a919520383f75c4ef9662b07cfe8a44c7c8add6215d0, +2023-06-24,Skincare,skincare,Dr. Barbara Sturm Night Serum,https://www.downsstyle.com/skincare/2023/6/24/dr-barbara-sturm,collection:skincare;sitemap,2023-06-25,200,https://www.downsstyle.com/skincare/2023/6/24/dr-barbara-sturm,Chas Downs,barbara sturm;dr barbara strum review;dr barbara strum skincare review;dr barbara sturm;dr barbara sturm adam waldman;dr barbara sturm hyaluronic serum;dr barbara sturm hyaluronic serum 10ml;dr barbara sturm hyaluronic serum how to;dr barbara sturm hyaluronic serum reviews;dr barbara sturm interview;dr barbara sturm reviews;dr barbara sturm serum;dr barbara sturm skincare;dr. barbara sturm;dr. barbara sturm hyaluronic serum;dr. barbara sturm hyaluronic serum review;dr. barbara sturm skincare;dr. barbara sturm super anti-aging serum,412,1,216a5863e5cccd10d2d4e92c70a2e3cd2470f444361faf3b5554df690809c53f, +2023-06-25,Masks,masks,Sulwashoo Radiance Energy Mask,https://www.downsstyle.com/masks/2023/6/25/dq73o0f5x4yll5fp4hj8idsavj7a1j,collection:masks;homepage;sitemap,2023-06-26,200,https://www.downsstyle.com/masks/2023/6/25/dq73o0f5x4yll5fp4hj8idsavj7a1j,Chas Downs,#(skin care sulwhasoo);#sulwhasoo;radiance energy mask;skincare sulwhasoo;sulwashoo clarifying mask;sulwhasoo;sulwhasoo clarifying mask;sulwhasoo concentrated ginseng renewing creamy mask;sulwhasoo indonesia;sulwhasoo mask;sulwhasoo overnight vitalizing mask;sulwhasoo overnight vitalizing mask ex;sulwhasoo radiance energy mask;sulwhasoo sleeping mask,581,1,0456d4678b8d3952dc1653525cfd58f9742d741660d53c79480829c6c6cec7e7, +2023-06-26,Masks,masks,Tata Harper Resurfacing Mask,https://www.downsstyle.com/masks/2023/6/26/tata-harper-resurfacing-mask,collection:masks;homepage;sitemap,2023-06-26,200,https://www.downsstyle.com/masks/2023/6/26/tata-harper-resurfacing-mask,Chas Downs,how to use tata harper resurfacing mask;resurfacing mask;resurfacing mask tata harper;tata harper;tata harper mask;tata harper mask review;tata harper resurfacing bha glow mask;tata harper resurfacing mask;tata harper resurfacing mask how to use;tata harper resurfacing mask overnight;tata harper resurfacing mask review;tata harper resurfacing mask sample;tata harper resurfacing mask youtube;tata harper review;tata harper skincare;tatcha harper resurfacing mask,617,1,567b29274285ca323a80c41941384408d9c24fd0a41308adf6b6f9befc576314, +2023-06-26,Skincare,skincare,Sol de Janiero Bum Bum Cream Review,https://www.downsstyle.com/skincare/2023/6/26/sol-de-janiero-skincare-for-body,collection:skincare;sitemap,2023-06-27,200,https://www.downsstyle.com/skincare/2023/6/26/sol-de-janiero-skincare-for-body,Chas Downs,brazilian bum bum cream;brazilian bum bum cream review;bum bum cream;bum bum cream perfume;bum bum cream review;indian review on sol de janeiro bum bum cream;sol de janeiro;sol de janeiro brazilian bum bum cream;sol de janeiro brazilian bum bum cream review;sol de janeiro brazilian bum bum cream reviews;sol de janeiro brazilian crush;sol de janeiro bum bum cream;sol de janeiro bum bum cream review;sol de janeiro review;sol de janiero brazilian bum bum cream,573,1,bc9a748968325689995499926c0f04490242d78707ed9d78b2e3b6af76cdbd44, +2023-06-28,Candles,new-blog,"""Lavitate"" Organic Beeswax Candle Review",https://www.downsstyle.com/new-blog/2023/6/28/lavitate-organic-beeswax-candle,collection:new-blog;homepage;sitemap,2023-06-29,200,https://www.downsstyle.com/new-blog/2023/6/28/lavitate-organic-beeswax-candle,Chas Downs,#candle;#candles;#cosmetics;21 pilots levitate;3 sided angel lantern with flameless candle by homereflections;3d;7ds grand cross;bath and body works candles;best candle;best tie downs;blend bunny cosmetics;blend bunny cosmetics allie dawson;blend bunny cosmetics palettes;blend bunny cosmetics sugar and grunge collection;blend bunny cosmetics sugar and grunge palette;blend bunny cosmetics sugar and grunge palette review;brown skin;button-down shirt;camera ready cosmetics;candle;candle empties;candle experiment;candle experiment with water;candle haul;candle impressions;candle impressions 23;candle light;candle magic;candle magic flames;candle magic video;candle making;candle making at home for beginners;candle shorts;candle stick patterns;candle sticks;candle style;candle trash;candles;candles & scents;championship;churchill downs;churchill downs freestyle;competition;coolmasks;cosmetics;create candle;crochet styles;curly crochet styles;curly hairstyles;cute curly styles;dayfox & tubebackr - lavitate;dayfox & tubebackr lavitate;diy candle;diy candles;diy lavendar candle;diy lavender candle;diy lavender candle homemade;doji candle;downs;eminence;english lavender;estee lauder;expensivemask;expensiveskincare;facemask;flight;floating candle holders;floating candles;floating led candle;free;funfly;glamglow;glamglowmask;grand cross;grande cosmeticd;grow lavender;growing lavender;halloween decorations;hammer candle;harry styles;heli;helicopter;helikopter;hitormiss;homemade candles;homeworx candles;how to grow lavender;how to grow lavender outdoors;how to levitate;how to make a candle;how to make a lavender candle;how to make candle;how to make candle at home;how to make candles;how to make candles lavender candle diy;how to make candles smell stronger;how to make lavender candle;how to prune lavender;how to style;how to style button down;inside candle;inside candle by power of stocks;inside candle strategy;institutional candle;it cosmetics;jouer cosmetics;kaitlyn downs;kringle candles;lavendar candle;lavender;lavender candle;lavender candle diy;lavender candle making;lavender candles;lavender cuttings;lavender flowers;lavender haze;lavender haze lyrics;lavender haze taylor swift;lavender lyrics;lavender patrick;lavender patrickananda;lavender plant;lavender plants;lavender scented candle;lavender scented tea light candles;lavitate;lavitate (b-cheese remix);lavitate - dayfox & tubebackr;lavitate - imagine dragon lyrics;lavitate bachkaane bacche;lavitate bachkaane bacche official audio;lavitate bachkaane bacche rap song;lavitate dayfox & tubebackr;lavitate lyrics;lavitate new rap song hindi;lesson;lessons;levitate;levitate dema;levitate trench;levitate video;levitating candle;levitating candle experiment;levitating candles;lightwork transcendence;lila downs;luimen cosmetics;luxurycreams;luxurymask;luxuryskincare;lyrics lavender haze;make beautiful candle from;mask;men's fragrance;men's style;model;modell;moistuzier;natural curly styles;natural hairstyles;official levitate;peterthomasroth;pink lavender candle review;planting lavender;prosthetics;prpackage;prunboxing;pruning lavender;quick hairstyles;rc;real men real style;rejection candle;riele downs;riele downs age;riele downs and jace norman;riele downs biography;riele downs boyfriend;riele downs car;riele downs lifestyle;riele downs lifestyle 2021;riele downs net worth;riele downs now;riele downs sister;riele downs tiktok;sds grand cross;sephora sale recommendations;seven deadly sins grand cross;seven deadly sins: grand cross;seven deadly sins: grand cross (android/ios);sheet stay downs;sisley;sisley mask review;sisley red clay mask review;sisley skincare haul;skincare;skincarelover;south downs cycling;south downs mtb;south downs mtb events;south downs way;soy candle;stacey london;stacy london;stacy london smokes;stacy london style;stacy london tv;stacy london vassar;stila cosmetics;style;style candle;style tips;style ups and downs;summer crochet styles;taylor swift lavender haze;the forex candle stick count down;three inside down candle;tie downs;tips for growing lavender;top levitate;trailer;transcend;transcend cosmetics;trixie cosmetics;underwater candle;use of candle sticks;vanilla lavender candle review;video levitate;what is stacy london doing now;when to prune lavender,394,1,2eb7e17008a46627119e3e1be229fb9790a48907f59e675855c395876b4c3644, +2023-06-28,Masks,masks,Glamglow Brightmud Eye Treatment,https://www.downsstyle.com/masks/2023/6/28/glamglow-brightmud-eye-treatment,collection:masks;homepage;sitemap,2023-06-29,200,https://www.downsstyle.com/masks/2023/6/28/glamglow-brightmud-eye-treatment,Chas Downs,bright eye treatment;brightmud eye treatment;eye treatment;glam glow super mud clearing treatment;glamglow;glamglow bright eyes;glamglow brighteyes;glamglow brightmud;glamglow brightmud eye treatment;glamglow brightmud eye treatment demo;glamglow brightmud eye treatment first impressions;glamglow brightmud eye treatment review;glamglow eye;glamglow eye treatment;glamglow mask;glamglow review;glamglow supermud clearing treatment review,571,1,38b51c137b283a5fdc72a914e5b5271c6d964f79c98e73fe9c597e18be98d40e, +2023-06-28,Skincare,skincare,Transcend Cosmetics Luxurious Lavender Rollerball Review,https://www.downsstyle.com/skincare/2023/6/28/transcend-cosmetics-rose-geranium-rollerball-review,collection:skincare;sitemap,2023-06-29,200,https://www.downsstyle.com/skincare/2023/6/28/transcend-cosmetics-rose-geranium-rollerball-review,Chas Downs,#lavender;#lavendero;azooz lavender;benefits of lavender oil;best essential oils;doterra roller bottle recipes;english lavender;essential oil;essential oil blends;essential oil perfume;essential oil recipes;essential oil roll on;essential oil roller ball;essential oil roller bottle;essential oil roller bottles;essential oil rollerball;essential oil rollerball recipes;essential oil rollerballs;essential oil rollers;essential oils;french lavender;grow lavender;growing lavender;how to grow lavender;how to grow lavender outdoors;how to make essential oil rollerball blends;how to make lavender lotion;how to propagate lavender;how to prune lavender;how to use essential oil rollerball;how to use essential oils;how to use lavender oil;james caan rollerball;james caan rollerball scenes;lavender;lavender bath;lavender care;lavender cuttings;lavender essential oil;lavender flowers;lavender fragrance;lavender haze;lavender honey;lavender lyrics;lavender oil;lavender oil benefits;lavender oil for face;lavender oil for hair;lavender oil for skin;lavender patrick;lavender patrickananda;lavender perfume;lavender plant;lavender plants;lavender soap;monthly rollerball;planting lavender;pruning lavender;qué es rollerball;rollberbottle;roller bottle;roller bottle blends;roller bottle labels;roller bottle recipes;roller bottle recipes doterra;roller bottles diy;rollerball;rollerball (1975);rollerball (film);rollerball 1975;rollerball 2002;rollerball album;rollerball and gel pen;rollerball full album;rollerball game;rollerball james caan;rollerball lost in space;rollerball movie;rollerball or gel pen;rollerball pen vs. gel pen;rollerball pens;rollerball remedy;rollerball trailer;rollerball trailer 1975;rollerball vs gel pen;satthwa lavender oil for men;soothing lavender aroma therapy;support breathe rollerball;support lavender and peppermin;support pure lavender essentia;tips for growing lavender;underrated rollerball;uses of lavender oil;when to prune lavender;yardley london lavender luxury soap,406,1,a13ce4744d907b5a43581cd2453fade0adcd1d5f6bd4f139cfc1a69928d9d1af, +2023-06-29,Candles,new-blog,Gourmand Rose Candle Review,https://www.downsstyle.com/new-blog/2023/6/29/gourmand-rose-candle-review,collection:new-blog;homepage;sitemap,2023-06-30,200,https://www.downsstyle.com/new-blog/2023/6/29/gourmand-rose-candle-review,Chas Downs,#cosmetics;bath and body works candles;best luxury candles;candle;candle haul;candle review;candles;candles for men;coffee candles;fall candles;festive gourmand;festive gourmand candle;fragrances;gourmand candles;gourmand scented candle;gourmond candles;grande cosmeticd;homeworx by harry slatkin s/2 (18oz) gourmand candles on qvc;homeworx by harry slatkin set of (2) 18oz gourmand candles on qvc;homeworx by harry slatkin set of 2 18oz. gourmand candles on qvc;it cosmetics;jouer cosmetics;levels of prosthetic makeup;lightwork transcendence;luimen cosmetics;makeup prosthetics;men's cologne;men's fragrance;prosthetic makeup;prosthetic wired;prosthetics;prosthetics tutorial;prosthetics wired;scented candles;stila cosmetics;timeless makeup;transcend cosmetics;trending makeup;trendy vs timeless makeup;trixie cosmetics;wired prosthetics tutorial;women's fragrance;yankee candles,232,1,91421ea549af4cefd7c1e1a2f3a091bc87c5284c2ff5e36182adc093c3c5f345, +2023-06-30,Candles,new-blog,Illuminaria Candle Review,https://www.downsstyle.com/new-blog/2023/6/30/illuminaria-candle-review,collection:new-blog;homepage;sitemap,2023-06-30,200,https://www.downsstyle.com/new-blog/2023/6/30/illuminaria-candle-review,Chas Downs,baies candle thymes;battery operated candle;best candles;best luxury candles;best smelling candles;candle;candle (invention);candle collection;candle decorations;candle luminaries;candle luminary;candle making;candle review;candle shell;candle tunneling;candle wax;candles;candles & scents;flameless candle;flameless candles;flameless candles review;flameless candles reviews;flameless pillar candles;flameless taper candles;fornasetti candle review;fornasetti candles;glass flameless candle;hollow candles;illuminara;illuminaria;lavender candles;led candle;led candles;luminara flameless candles;luminaria;luminary candle;luminary candles;luxury candle review;luxury candles;pumpkin candle;santal 26 candle;scented candle;scented candles;top luxury candles;vanilla candle,287,1,a697be0b97ffa75892bd787c4efeb34a63231b5f04d0c894e89195018d52c7d4, +2023-06-30,Skincare,skincare,Chanel Skincare Review,https://www.downsstyle.com/skincare/2023/6/30/chanel-skincare-review,collection:skincare;sitemap,2023-07-01,200,https://www.downsstyle.com/skincare/2023/6/30/chanel-skincare-review,Chas Downs,beauty secrets;best chanel beauty;best of chanel beauty;chanel;chanel beauty;Chanel beauty;chanel beauty 2020;chanel beauty 2022;chanel beauty haul;chanel beauty review;chanel beauty staples;chanel beauty talks;chanel beauty unboxing;chanel best skincare;chanel hydra beauty review;chanel hydra beauty skincare review;chanel le lift skincare;chanel le lift skincare review;chanel les beiges;chanel makeup;chanel makeup review;chanel makeup tutorial;chanel n1 review;chanel no 1 skincare review;chanel review;chanel serum review;chanel skincare;Chanel skincare;chanel skincare review;chanel sublimage review;chanel toner review;luxury beauty;luxury beauty channel;luxury beauty products worth the money;luxury skincare review;n1 de chanel review;new chanel makeup;new chanel skincare;new chanel skincare review;skincare;skincare review;skincare routine,429,1,27dcff40a18dfab14bee9c792adfc2036838e11cb3a67803fc0fbe5477dea312, +2023-07-01,Candles,new-blog,Boy Smells Candle Review,https://www.downsstyle.com/new-blog/2023/7/1/boy-smells-candle-review,collection:new-blog;homepage;sitemap,2024-06-29,200,https://www.downsstyle.com/new-blog/2023/7/1/boy-smells-candle-review,Chas Downs,#boys meals;#boysmells;#boysmellscandle;boy;boy smell;boy smells;boy smells ash;boy smells candle;boy smells candle review;boy smells candle reviews;boy smells candles;boy smells farm to candle;boy smells farm to candle snap;boy smells first impression;boy smells founder;boy smells hinoki fantome;boy smells hypernature collection;boy smells italian kush review;boy smells kacey musgraves;boy smells kacey musgraves candle;boy smells kush;boy smells kush candle;boy smells neopeche candle;boy smells perfumes;boy smells slow burn;boy smells snap;boy smells st. al candle;boy smells suede pony;boy smells unboxing;boysmell;boysmells;boysmells ash;boysmellsash;burning palo santo;candle;candle review;candles;first smell;founder of boy smells;how boy smells grew;how to burn palo santo;how to light palo santo;how to smell good;how to use palo santo;how to use palo santo stick;how to use palo santo wood;luxury candle review;luxury candles;palo santo;palo santo benefits;palo santo burning sticks;palo santo cleansing;palo santo how to burn;palo santo incense;palo santo incense sticks;palo santo incenses sticks;palo santo ritual;palo santo smudging;palo santo stick;palo santo sticks;palo santo uses;palo santo wood;palo santo wood stick;smell;smell test;smelled;smells,396,1,d36ffbb573162115bc2c62179e7b31e3db9201fce9777c9301cb7948a741873f, +2023-07-06,Masks,masks,Spascriptions Cucumber Hydrogel Under-Eye Pads,https://www.downsstyle.com/masks/2023/7/6/xgdpt8d1ru6dhzdofhmslbtd1786rh,collection:masks;homepage;sitemap,2023-07-07,200,https://www.downsstyle.com/masks/2023/7/6/xgdpt8d1ru6dhzdofhmslbtd1786rh,Chas Downs,,373,1,2cf0e6cb4fec7c5e443e503eaa1ddd360a15868143377bd3e4d662103e469f48, +2023-07-09,Masks,masks,Peace Out Puffy Eyes Review,https://www.downsstyle.com/masks/2023/7/9/peace-out-puffy-eyes-review,collection:masks;homepage;sitemap,2023-07-10,200,https://www.downsstyle.com/masks/2023/7/9/peace-out-puffy-eyes-review,Chas Downs,5prout;acne healing dots;acne solution;acne treatment;aerosmith peace out;aerosmith peace out tour;aerosmith tour announcement;afrobeat;cosmic kids peace out;cosmic kids time out;disappearing;disappearing dude;dr dray puffy eyes;eliminate puffy eyes;face yoga puffy eyes;how to get rid of puffy eyes;how to reduce puffy eyes;how to rid puffy eyes;joe perry;koreandrill;oceanfromtheblue;out;peace;peace out;peace out balloon;peace out disappearing guy;peace out pores;peace out puffy eyes;peace out puffy under-eye patches;peace out retinol eye stick;peace out retinol eye stick review;peace out skin care;peace out skincare;peace out skincare review;peace out time out;peace out tour;peace out tour aerosmith;peace out tour dates;peaceout;puffy eyes;puffy eyes excercise;puffy eyes makeup;puffy eyes remedies;puffy eyes remedy;puffy eyes treatment;puffy under eyes;quick face yoga puffy eyes massage routine;reduce puffy eyes;reduce puffy eyes fast;reduce puffy eyes massage;relaxing videos for autism;review;time out,336,1,b7cfc068b0b0504d9327bfe8d1ce96e97319f49ee203c23f8e33f81612826df1, +2023-07-19,Skincare,skincare,Piel Eterna Review,https://www.downsstyle.com/skincare/2023/7/19/piel-eterna-review,collection:skincare;sitemap,2023-07-20,200,https://www.downsstyle.com/skincare/2023/7/19/piel-eterna-review,Chas Downs,aclarando la piel;aloe vera para la piel;alquimia interna;chamarras de piel;chamarras de piel hombre;cloasma eterna juventud;como rejuvenecer la piel;crema para piel grasa;cremas para la piel;cremas para piel grasa;cuidado de la piel;cómo tener una piel de porcelana;eterna juventud;eterna juventud medical estetic center;eternal secret;eternal secret protector solar;eternal secret serum;juramento eterno;la vida eterna;manchas en la piel;mejoran la piel;mejores chamarras de piel;melasma eterna juventud;paño eterna juventud;piel;piel chaqueña;piel de la cara;piel de porcelana;piel eterna;piel grasa;piel joven;piel luminosa;piel morena;piel perfecta;piel sana;probando eternal secret;productos eternal secret;rejuvenece tu piel;retinol eternal secret;review;skincare eternal secret,276,1,d9e4f6f7bf15d2bcab1222a550d523787549aa5b2596c95527cea6de1a36c160, +2023-07-22,Skincare,skincare,Dr Jart + Skincare Review,https://www.downsstyle.com/skincare/2023/7/22/dr-jart-skincare-review,collection:skincare;sitemap,2023-07-23,200,https://www.downsstyle.com/skincare/2023/7/22/dr-jart-skincare-review,Chas Downs,dr jart;dr jart +;dr jart bb cream;dr jart camo drops;dr jart ceramidin;dr jart ceramidin cream;dr jart ceramidin skincare;dr jart cicapair;dr jart cicapair color correcting;dr jart cicapair cream;dr jart cicapair mask;dr jart cicapair review;dr jart color correcting cream;dr jart dupe;dr jart mask;dr jart prueba;dr jart review;dr jart rubber mask;dr jart sephora;dr jart skincare;dr jart skincare review;dr jart sunscreen;dr jart+;dr. jart;dr. jart+;dr. jart+ skincare;drjart;korean skincare;skincare;skincare products;skincare review;skincare routine;skincare routines;viral skincare,397,1,42619ec2b70eb23d8c0a3f5cf27137c2288ccbb2bb8ec1cda4a657867536f800, +2023-08-02,Skincare,skincare,My favorite Beauty Tools/Machines,https://www.downsstyle.com/skincare/2023/8/2/my-favorite-beauty-toolsmachines,collection:skincare;sitemap,2023-08-03,200,https://www.downsstyle.com/skincare/2023/8/2/my-favorite-beauty-toolsmachines,Chas Downs,2022 beauty favorites;amazon favorites;amazon favorites 2023;april beauty favorites;april clean beauty favorites;april clean beauty favorites 2023;beauty;beauty favorites 2021;beauty favorites 2022;beauty machine;beauty tools;beauty tools for face;beauty tools worth it;best home beauty machines;body machine;buying beauty machines from china;cavitation machine before and after;cavitation machine best;chinese beauty machines;clean beauty favorites;facial beauty machine;favorite;favorite beauty products;favorite beauty products of 2022;favorite beauty tools;favorite clean beauty products;favorites;favourites;hydrafacial machine;importing chinese beauty machines;monthly beauty favorites;monthly clean beauty favorites;monthly favorites;oxygen beauty machine;professional beauty machines;spray machine;super bubber beauty machine;tech beauty tools,229,6,97fdd4fe3caccb0702a09c41e8d4f9485c3a1598b2e02063df6d5263668e2144, +2023-08-04,Look Book,look-book,My favorite shorts for Summer,https://www.downsstyle.com/look-book/2023/8/4/my-favorite-shorts-for-summer,collection:look-book;homepage;sitemap,2024-07-02,200,https://www.downsstyle.com/look-book/2023/8/4/my-favorite-shorts-for-summer,Chas Downs,#shorts;#shorts #trendingshorts #juice;3d art;adam enfroy's blog growth engine;best mens shorts for summer;best shorts for men;best shorts for summer;best summer shorts for men;blog post;blog post elementor;blog post ideas;blog post ideas shorts;blog post tool;blog posts;crafts;funny shorts;homemade activator;homemade borex powder;how to;how to blog;how to make;how to start a blog;how to style shorts;how to write a blog;how to write a blog post;how to write a blog post fast;how to write a blog post for beginners;how to write content for blog posts;how to write perfect blog posts;how to write quality blog posts;howto;humor;kamwali bai short;mens shorts;mesh shorts;new short;one in a million shots;pablo bruschi shorts;short;shorts;shorts break;shorts break channel;shorts comedia;shorts creator;shorts engraçados;shorts feed;shorts for men;shorts for summer;shorts for summer 2023;shorts for the summer;shorts trending;shorts viral;shortsbrasil;shortsbreak;summer;summer fashion;summer shorts;summer shorts 2021;summer shorts 2022;summer shorts 2023;summer shorts for guys;summer shorts haul;summer shorts men;summer shorts outfit;summer shorts women;the best blog post strategy;the best shorts for summer;tordi;tordishorts;tutorial;viral shorts;wordpress blog post seo;youtube shorts,88,6,b6752022478508f4a57c2d99978f98449ff1218944d1eb7285720fe91044aa94, +2023-08-17,Skincare,skincare,Spalife Gold & Silver Serum Review,https://www.downsstyle.com/skincare/2023/8/17/spalife-gold-amp-silver-serum-review,collection:skincare;sitemap,2023-08-17,200,https://www.downsstyle.com/skincare/2023/8/17/spalife-gold-amp-silver-serum-review,Chas Downs,,514,1,bc1b2433bb8d5bcf8467158754410698328655267cde52cb5fe7060f4f18cae4, +2023-10-03,Skincare,skincare,Santa Maria Novella Sulfur Soap,https://www.downsstyle.com/skincare/2023/10/3/santa-maria-novella-sulfur-soap,collection:skincare;sitemap,2023-10-03,200,https://www.downsstyle.com/skincare/2023/10/3/santa-maria-novella-sulfur-soap,Chas Downs,basilica santa maria novella;easy st. santa maria novella;firenze santa maria novella;lana santa maria novella;piazza santa maria novella;santa maria novela;santa maria novella;santa maria novella 4k;santa maria novella chiesa;santa maria novella church;santa maria novella firenze;santa maria novella florence;santa maria novella perfumes;santa maria novella pharmacy;santa maria novella review;santa maria novella tour;santana maria novella,313,1,9b51c700e193aee2c28b90e020de33099416b27bc7229180f7d4e36b0f4c276a, +2023-11-22,Look Book,look-book,Rag and Bone Essentials,https://www.downsstyle.com/look-book/2023/11/22/rag-and-bone-essentials,collection:look-book;homepage;sitemap,2023-11-22,200,https://www.downsstyle.com/look-book/2023/11/22/rag-and-bone-essentials,Chas Downs,ag and bone;blog;bone;bone & rag;bone haul bandit;fashion blog;fashion haul;haul;rag;rag & bone;rag & bone apollo sandal;rag & bone beck;rag & bone bergamot;rag & bone denim;rag & bone denim brand;rag & bone fragrance;rag & bone fragrance review;rag & bone jeans;rag & bone jeans review;rag & bone logan shopper;rag & bone man;rag & bone new york;rag & bone oddity;rag & bone perfume;rag & bone perfume review;rag & bone sandals;rag & bone wyatt;rag and bone;rag and bone denim review;rag and bone fashion designer new york fashion week review;rag and bone fragrance;rag and bone jeans;rag and bone man;rag and bone runway;rag and bone shirt;rag and bone video;rag and bone vinyl pant review;rag bone;rag n bone;rag n bone man;shoe haul;style haul;try on haul;zara haul,147,7,a1d22e1355971d7047db794fc3398a776d80b28ceacab568b593b50a58383b4e, +2023-11-29,Skincare,skincare,Depology Skincare Review,https://www.downsstyle.com/skincare/2023/11/29/depology-skincare-review,collection:skincare;homepage;sitemap,2023-11-29,200,https://www.downsstyle.com/skincare/2023/11/29/depology-skincare-review,Chas Downs,#depology;anti aging skincare;anti aging skincare product;anti-aging skincare;caviar;caviar serum;caviar stick;collagen skincare;deepology;deepology micro dart patches;depology;depology argireline;depology caviar stick;depology deepcare serum infused micro dart patches;depology eye mask review and test;depology eye patches;depology matrixyl 3000;depology micro dart patches;depology patches review;depology peptide complex;depology review;depology serum;depology skincare;depology skincare honest review;depology skincare reviews;dr shah skincare;peptide skincare;peptides in skincare;skincare;skincare 101;skincare ft. depology;skincare hacks;skincare peptides;skincare review;skincare routine;skincare stick;skincare that works;skincare tips;skincare tips and tricks,287,2,8f649eb5bc9a548f86bfcfaa711740649d1a8c3d99adb9359614112f43ffa3f3, +2024-06-24,Skincare,skincare,DōTERRA Sunscreen Review,https://www.downsstyle.com/skincare/2024/6/24/dterra-sunscreen-review,collection:skincare;homepage;sitemap,2024-06-28,200,https://www.downsstyle.com/skincare/2024/6/24/dterra-sunscreen-review,Chas Downs,doterra review;doterra revire;natural skincare;natural sunscreen;sunscreen for all skin types;sunscreen for oily skin;sunscreen for sensitive skin;sunscreen review;sunscreen that is natural;sunscreen with zinc;zinc sunscreen,201,2,4825af99f79b50abf63c4f49e67c6ef001194c6fbce919c580a6a1928ce144d0, +2024-06-27,Look Book,look-book,My Favorite Bathing Suit Brands,https://www.downsstyle.com/look-book/2024/6/27/my-favorite-bathing-suit-brands,collection:look-book;homepage;sitemap,2024-06-27,200,https://www.downsstyle.com/look-book/2024/6/27/my-favorite-bathing-suit-brands,Chas Downs,alexander mcqueen bathing suit;chaz downs;chazz downs;chazzdowns;downs style;downs style bathing suits;downs style look book;downsstyle;fendi bathing suit;fendi bathing suti;versace bathing suit,487,6,0b4a5983c7ae2db76f113b37e292aff52637cb1ff58b2a40f7a548a44fe9b33f, +2024-06-28,Skincare,skincare,Inn Beauty Pimple Paste Review,https://www.downsstyle.com/skincare/2024/6/28/inn-beauty-pimple-cream-review,collection:skincare;homepage;sitemap,2024-06-29,200,https://www.downsstyle.com/skincare/2024/6/28/inn-beauty-pimple-cream-review,Chas Downs,inn beauty;inn beauty pimple paste;inn beauty pimple paste review;inn beauty review;pimple cream;pimple cream review;pimple paste;pimple paste review,108,2,f25d491e57211d42afef902087b7adcb5d324536c7cb0bb184ea991f02ec345a, +2024-06-29,Skincare,skincare,Tom Ford Shimmering Body Oil Review,https://www.downsstyle.com/skincare/2024/6/29/tom-ford-shimmering-body-oil-review,collection:skincare;homepage;sitemap,2024-06-30,200,https://www.downsstyle.com/skincare/2024/6/29/tom-ford-shimmering-body-oil-review,Chas Downs,tom ford;tom ford beauty;tom ford parfum;tom ford parfum review;tom ford perfume;tom ford perfume review;tom ford shimmering body oil.;tom ford skincare;tom ford soleil blanc;tom ford soleil blanc review;tom ford soleil blanc shimmering body oil;tom ford soleil blanc shimmering body oil review,175,2,56b3e84ee634fc5d83110855657bc2bcb0cdde99dc124fc95b606f74d60cd69c, +2024-06-30,Eat,new-blog-2,Why I switched from Milk to Oat Malk,https://www.downsstyle.com/new-blog-2/2024/6/30/why-i-switched-from-milk-to-oat-malk,collection:new-blog-2;sitemap,2024-07-01,200,https://www.downsstyle.com/new-blog-2/2024/6/30/why-i-switched-from-milk-to-oat-malk,Chas Downs,malk organics;malk organics oat malk review;malk organics review;oat malk ice cream;oat malk review,387,3,419af36f9f690c6a6d69a46f93665fe6fea43a6c73508bc8c39973e3088fd4ac, +2024-06-30,Skincare,skincare,Honest Beauty Skincare Review,https://www.downsstyle.com/skincare/2024/6/29/honest-beauty-skincare-review,collection:skincare;homepage;sitemap,2024-06-30,200,https://www.downsstyle.com/skincare/2024/6/29/honest-beauty-skincare-review,Chas Downs,downs style skincare review;honest beauty;honest beauty vitamin c review;honest skincare;honesty beauty review;skincare review;vitamin c review,346,2,d9268f2ec2dc1bcb7a838231d505307a0e0c1ac4356eb30a48aa43a1490eced1, +2024-07-01,Look Book,look-book,Why I Only Wear Linen in the Summer,https://www.downsstyle.com/look-book/2024/7/1/why-i-only-wear-linen-in-the-summer,collection:look-book;homepage;sitemap,2024-07-02,200,https://www.downsstyle.com/look-book/2024/7/1/why-i-only-wear-linen-in-the-summer,Chas Downs,best linen shirt brands;linen shirt brands;linen shirt review;linen shirts by onia;onia linen;onia linen review,174,6,5a1344987e93bc9f2aa0390275af42eb7e53fb4972c7f8c8cd233b514f61706a, +2024-07-02,Eat,new-blog-2,Meal Prep 101: How to Get Started and Stay Organized,https://www.downsstyle.com/new-blog-2/2024/7/2/meal-prep-101-how-to-get-started-and-stay-organized,collection:new-blog-2;sitemap,2024-07-04,200,https://www.downsstyle.com/new-blog-2/2024/7/2/meal-prep-101-how-to-get-started-and-stay-organized,Chas Downs,how to save money meal prepping;meal prep;meal prep ideas;meal prep review;meal prep salad,313,2,df0de49d2b522ff1c719375a345935eec6cd4df06a206ad2c3f4bcc111bc2e64, +2024-07-02,Eat,new-blog-2,Snack Cravings? Try these Vegan Snacks Out,https://www.downsstyle.com/new-blog-2/2024/7/2/snack-cravings-try-these-vegan-snacks-out,collection:new-blog-2;sitemap,2024-07-04,200,https://www.downsstyle.com/new-blog-2/2024/7/2/snack-cravings-try-these-vegan-snacks-out,Chas Downs,healthy snacks;oatly ice cream review;vegan snacks;vegan snacks review,396,8,05f23290987afee73b74d37bf5ff55e7a9a6581999a3ed0651fefcad4f3de46f, +2024-07-02,Workouts/Diet,workoutsdiet,My favorite Weight-Free Core Exercise,https://www.downsstyle.com/workoutsdiet/2024/7/2/my-ab-workout,collection:workoutsdiet;sitemap,2024-07-03,200,https://www.downsstyle.com/workoutsdiet/2024/7/2/my-ab-workout,Chas Downs,how to workout;how to workout abs;working out routine;workout regimen;workoutroutine,154,1,f1908ed8f82f3e814cddd69f8e65c5c1d68beb3f6221bbf68ec33e4006d7494d, +2024-07-03,Gift Inspo,gifts,Celebrate Independence Day with Incredible Sales: Perfect Gifts for Your Loved Ones,https://www.downsstyle.com/gifts/2024/7/3/celebrate-independence-day-with-incredible-sales-perfect-gifts-for-your-loved-ones,collection:gifts;sitemap,2026-08-01,200,https://www.downsstyle.com/gifts/2024/7/3/celebrate-independence-day-with-incredible-sales-perfect-gifts-for-your-loved-ones,Chas Downs,,655,9,77bd55110ca688e6ae408f92eee18354c00045d37ddc358d59606825e1c542d5, +2024-07-04,Look Book,look-book,How I Score Designer Clothing at Affordable Prices,https://www.downsstyle.com/look-book/2024/7/4/how-i-score-designer-clothing-at-affordable-prices,collection:look-book;homepage;sitemap,2024-07-04,200,https://www.downsstyle.com/look-book/2024/7/4/how-i-score-designer-clothing-at-affordable-prices,Chas Downs,,302,2,3242fed3cb65a98c9b392702b23cf6ed6806673ef78c8f42716927bf518688fb, +2024-07-04,Masks,masks,Burts Bees Renewing Sheet Mask Review,https://www.downsstyle.com/masks/2024/7/4/burts-bees-calming-sheet-mask-review,collection:masks;homepage;sitemap,2024-07-04,200,https://www.downsstyle.com/masks/2024/7/4/burts-bees-calming-sheet-mask-review,Chas Downs,Burts bee's;Burts bees;Burts bees mask;Burts bees mask review;burts bees revew;Burts bees review;dry skin mask review;mask review;masks for dry skin;masks for oily skin,332,2,e0f4eb54d13d38d69d6aefececa6a6e7b483a7b158e9af53d8366a2d9048f75f, +2024-07-04,Skincare,skincare,Ligne St. Barth Vanilla Body Lotion,https://www.downsstyle.com/skincare/2024/7/4/st-barth-vanilla-body-lotion,collection:skincare;homepage;sitemap,2024-07-05,200,https://www.downsstyle.com/skincare/2024/7/4/st-barth-vanilla-body-lotion,Chas Downs,st Barths;st barths products;st barths vanilla body lotion,238,2,88de176b4e38e02bff6180e709ce24e3ae500bc22b9affe63313dcda4ee11717, +2024-07-05,Look Book,look-book,How to Dress for Your Body Type,https://www.downsstyle.com/look-book/2024/7/5/how-to-dress-for-your-body-type,collection:look-book;homepage;sitemap,2024-07-06,200,https://www.downsstyle.com/look-book/2024/7/5/how-to-dress-for-your-body-type,Chas Downs,,568,3,0c278cd3eefdc7c77d5c46c7e0c3686c619ec723445f77d6b7ec5f234145816c, +2024-07-06,Skincare,skincare,Kopari Golden Aura Body Oil Review,https://www.downsstyle.com/skincare/2024/7/5/kopari-golden-aura-body-oil-review,collection:skincare;homepage;sitemap,2024-07-06,200,https://www.downsstyle.com/skincare/2024/7/5/kopari-golden-aura-body-oil-review,Chas Downs,,136,2,7b28ef34e0c18c65c8bd5700f78bc43d33a20c31fe050024e1b47ec7a8209991, +2024-07-08,Skincare,skincare,Biossance Skincare Review,https://www.downsstyle.com/skincare/2024/7/8/biossance-skincare-review,collection:skincare;homepage;sitemap,2024-07-08,200,https://www.downsstyle.com/skincare/2024/7/8/biossance-skincare-review,Chas Downs,biossance;biossance review;biossance skincare review;is biossance a clean brand;is biossance clean;is biossance good,336,2,95a90387e9f37e00795c252f0dd2ab5e63746d6abd49b8c5bc68462e56c77a59, +2024-07-13,Eat,new-blog-2,"Organic Meal Kits: The Solution to Quick, Healthy, and Delicious Meals",https://www.downsstyle.com/new-blog-2/2024/7/13/organic-meal-kits-the-solution-to-quick-healthy-and-delicious-meals,collection:new-blog-2;sitemap,2024-07-14,200,https://www.downsstyle.com/new-blog-2/2024/7/13/organic-meal-kits-the-solution-to-quick-healthy-and-delicious-meals,Chas Downs,best meal kits;meal kits;organic meal kits,364,3,ef0480bd988e53098ff4756ec16c211b9487ad74a3a760ddac310d14a8a32973, +2024-07-15,Travel,travel,Best Credit Cards for Travel,https://www.downsstyle.com/travel/2024/7/15/tx3qv98wj0dtow7f17pbrz8yuyl0b7,collection:travel;sitemap,2024-07-16,200,https://www.downsstyle.com/travel/2024/7/15/tx3qv98wj0dtow7f17pbrz8yuyl0b7,Chas Downs,Best Credit Cards for Travel;best travel cards;travel cards;travel cards for cash back;travel cards for points;travel credit cards,548,4,ec1dd0248d2bf66cab1757b3ea72fa97bf10e3914bb925832c7280fba6edf898, +2024-07-17,Look Book,look-book,Elevate Your Style: Discover 10 Sustainable Fashion Brands That Are Changing the Game!,https://www.downsstyle.com/look-book/2024/7/16/elevate-your-style-discover-10-sustainable-fashion-brands-that-are-changing-the-game,collection:look-book;homepage;sitemap,2024-07-18,200,https://www.downsstyle.com/look-book/2024/7/16/elevate-your-style-discover-10-sustainable-fashion-brands-that-are-changing-the-game,Chas Downs,clean brands in fashion;eco friendly fashion brands;sustainable brands,247,10,80a12ae0e8a0fd7ef5e46174507521e5ce6e8fea137b74e72f6ec6e3871fe662, +2024-07-21,Travel,travel,Discover eco-friendly travel spots for the upcoming year,https://www.downsstyle.com/travel/2024/7/19/to4fztwwiq3s6bqnizcrswuhrz5wrv,collection:travel;sitemap,2024-07-21,200,https://www.downsstyle.com/travel/2024/7/19/to4fztwwiq3s6bqnizcrswuhrz5wrv,Chas Downs,,546,2,c71f147a06ce2aa93d3abfcf80e4f94bcda3a281cb91318c6f79483f9b56d152, +2024-07-25,Look Book,look-book,Why the quality of your clothes has changed in the last 20 years,https://www.downsstyle.com/look-book/2024/7/24/uwy46xpteq1xpy5hmnav5dtyv0dl6k,collection:look-book;homepage;sitemap,2024-08-30,200,https://www.downsstyle.com/look-book/2024/7/24/uwy46xpteq1xpy5hmnav5dtyv0dl6k,Chas Downs,,994,1,3d3a143b78ba6e341be50ecc7a192a4bb1e8996ffd3a07b49aa9637c2fd098fd, +2024-08-05,Candles,new-blog,Alternatives to Scented Candles for Home Fragrance,https://www.downsstyle.com/new-blog/2024/8/5/wrj3wxvoryz1gbpy79jysuiuey4mk1,collection:new-blog;homepage;sitemap,2024-08-06,200,https://www.downsstyle.com/new-blog/2024/8/5/wrj3wxvoryz1gbpy79jysuiuey4mk1,Chas Downs,alternatives to candles;candle alternative;home fragrance;home fragrances;home spray,364,7,cf22d5ac3d974eda0efa7e231f6b34189f6db52003a2945e06b019cc1f2181a1, +2024-08-30,Skincare,skincare,Youth TO The People Superfood Body Cleanser Review,https://www.downsstyle.com/skincare/2024/8/29/youth-to-the-people-superfood-cleanser-review,collection:skincare;homepage;sitemap,2024-08-30,200,https://www.downsstyle.com/skincare/2024/8/29/youth-to-the-people-superfood-cleanser-review,Chas Downs,youth to the people review;youth to the people superfood + nicinamide cleanser;youth to the people superfood cleanser review,397,2,766fa79119899483c39c4c61061b54fd8e47c4fc19b7283c67ba73b42ddc9a46, +2026-08-02,Skincare,skincare,Rose Water and the benefits behind our favorite flower,https://www.downsstyle.com/skincare/2026/8/1/rose-toners-and-the-benefits-behind-our-favorite-scent,collection:skincare;homepage,,200,https://www.downsstyle.com/skincare/2026/8/1/rose-toners-and-the-benefits-behind-our-favorite-scent,Chas Downs,,724,7,f6b16b9f54c9922463017e89c74e7aa2a14ee645c4990b3fccde83c9fb44ba1a, diff --git a/docs/continuations/charles/downs-style-voice-evidence.md b/docs/continuations/charles/downs-style-voice-evidence.md new file mode 100644 index 000000000..cdc0a3486 --- /dev/null +++ b/docs/continuations/charles/downs-style-voice-evidence.md @@ -0,0 +1,89 @@ +# Charles's Downs Style voice: evidence sheet + +This sheet explains how the archive becomes a reusable voice system. It distinguishes what the corpus **measures**, what editorial review **infers**, and what the new system **modernizes**. It does not treat historic product or health claims as factual authority. + +## The voice in one sentence + +Charles writes like a stylish friend who begins with what drew him in, notices the sensory and practical details, lets himself love the thing, admits the drawback, and lands on a personal verdict. + +## Quantitative fingerprint + +The causal baseline is 257 posts published from 2017 through 2024: 76,597 alphabetic tokens, a 265-word median post, a 20.95-word mean sentence, and a 23-word median paragraph. + +| Signal | Baseline result | Editorial consequence | +| --- | ---: | --- | +| First-person singular | 3,448 uses; 45.01 per 1,000 words | Write as `I` when Charles is speaking. | +| First-person plural | 75 uses; 0.98 per 1,000 words | `We` is exceptional, not the house default. | +| Second person | 734 uses; 9.58 per 1,000 words | Help the reader choose without turning every sentence into advice. | +| `I love` | 226 uses | Visible enthusiasm is authentic when attached to a specific reason. | +| `My favorite` | 92 uses | Personal ranking is part of the voice, not a neutral-review defect. | +| `However` | 180 uses | Praise normally makes room for a qualification. Vary the transition in polished copy. | +| `Overall` | 124 uses; `overall I` appears 75 times | End in a personal conclusion rather than an impersonal summary. | +| Shopping cue | 178 of 257 posts | Commerce is historically native, but modern links need a live check and disclosure. | +| Reader thanks | 88 of 257 posts | Warm signoffs are established, though they fade sharply in later years. | +| Numeric rating | 35 of 257 posts | Ratings are available but not required; a use-case verdict is more durable. | +| Review in title | 86 of 257 posts | Direct, searchable review framing is historically grounded. | +| Question title | 6 of 257 posts | Questions should be purposeful, not a default headline trick. | +| Question marks | 0.21 per 1,000 words | Avoid faux-conversational strings of questions. | +| Exclamation marks | 0.52 per 1,000 words | Charles's enthusiasm lives in opinion words, not punctuation volume. | + +The perspective evidence is unusually strong: first-person singular appears about **46 times** as often as first-person plural. A generic `we/our` brand voice would erase the most stable historical feature in the archive. + +## Recurrent narrative movement + +Cross-category review found a dependable emotional sequence: + +1. **Discovery or desire.** A friend, store, trip, need, routine, or visual detail creates the reason to care. +2. **Direct notice.** Charles names how the product feels, smells, fits, looks, behaves, or changes the ritual. +3. **Enthusiasm.** He permits words such as love, favorite, amazing, and obsessed when the feeling is earned. +4. **Qualification.** A price comparison, fit issue, ingredient concern, inconvenience, or mismatch interrupts the praise. +5. **Verdict.** `Overall` often returns the article to Charles's own decision. +6. **Invitation.** A shop cue or reader thanks closes the relationship. + +That arc is an editorial inference supported by the frequency of personal language, qualification markers, verdict markers, shopping cues, signoffs, and ratings. It is more useful than copying any single sentence. + +## The archive changed over time + +| Era | What the measurements show | How to use it | +| --- | --- | --- | +| 2017–2018 foundation | 94 posts; first-person singular 57.12 per 1,000 words; 70 shopping cues; 27 numeric ratings | Strongest evidence for Charles's personal, enthusiastic baseline. Preserve the point of view, not the long paragraphs or rough mechanics. | +| 2019–2020 review engine | 76 posts; 49 review titles; `however` 5.03 per 1,000 words; 53 reader-thanks endings | Strongest evidence for the praise → caveat → verdict review rhythm. | +| 2021–2023 expansion | 63 posts; first-person singular falls to 30.88 while second person rises to 11.06; median paragraph drops to 10.5 words | Useful evidence for shorter modules and reader utility, but less pure as an author fingerprint. | +| 2024 editorial | 24 posts; median length rises to 343 words; first-person singular falls to 20.78; second person rises to 13.01 | Evidence of a reported/SEO-facing channel evolution. Keep the added context, but restore Charles's personal center. | +| 2026 rose-water post | One post, excluded from the baseline | Evaluation material only; it cannot validate the system that helped produce it. | + +The modern house style should therefore combine the early personal center with the later structural clarity: Charles's `I`, one thought per paragraph, stronger sourcing, and none of the inherited run-ons or generic SEO padding. + +## Thematic center + +- Beauty dominates the archive: skincare and masks comprise 163 of 258 public posts, or 63.2%. +- Look Book contributes 36 posts and supports a serious clothing/material lane. +- Candles contribute 18 posts and make home fragrance a recurring ritual rather than a one-off topic. +- Food, interiors, gifts, travel, and workouts broaden the same central question: does this object, place, or habit make everyday life feel better—and is it actually worth it? + +Representative title-level signals include [My Favorite Candles of the Year](https://www.downsstyle.com/new-blog/2017/12/4/my-favorite-candles-of-the-year), [Glossier Skincare as Makeup?](https://www.downsstyle.com/skincare/2017/12/11/glossier-skincare-as-makeup), [Sunday Riley Sulfur Mask Review](https://www.downsstyle.com/masks/2018/8/11/sunday-riley-sulfur-mask-review), [Steak Houses I love in Miami](https://www.downsstyle.com/new-blog-2/2023/6/6/steak-houses-i-love-in-miami), and [Why the quality of your clothes has changed in the last 20 years](https://www.downsstyle.com/look-book/2024/7/24/uwy46xpteq1xpy5hmnav5dtyv0dl6k). Titles are metadata evidence; no article body is reproduced here. + +## What is evidence, and what is a guardrail + +| Class | Meaning | Example | +| --- | --- | --- | +| Observed | Reproducible corpus measurement | `I` greatly exceeds `we`; 178 posts contain shopping language. | +| Inferred | A pattern found by cross-era, cross-category editorial review | Personal hook → sensory evidence → qualification → verdict. | +| Modernized | A deliberate improvement, not an imitation claim | One thought per paragraph; clean syntax; restrained repetition. | +| Prohibited | A truth, safety, or trust boundary | No invented use, unsupported medical promise, or undisclosed paid link. | + +The archive is evidence of **voice**, not a source of current factual truth. Before publication, every material, ingredient, safety, care, performance, health, sustainability, price, and availability claim needs current support. A manufacturer page can establish what a brand says; it does not independently prove the claim. Charles's personal experience must come from Charles, never from the assembler. + +## Editorial acceptance test + +A new Downs Style draft passes the voice gate when: + +- the speaker is recognizably Charles, using `I` unless a real team action requires `we`; +- the opening gives a human reason to care before giving a definition; +- praise is attached to a concrete detail and challenged by at least one honest limitation when relevant; +- sections react to one another instead of forming a catalogue; +- the conclusion makes a use-case decision rather than repeating the list; +- paragraphs carry one thought and the syntax is clean; +- factual claims are sourced independently of the historic corpus; +- no personal use or result is invented; and +- commerce is current, transparent, and disclosed close to the link. diff --git a/docs/continuations/charles/downs-style-voice-metrics.json b/docs/continuations/charles/downs-style-voice-metrics.json new file mode 100644 index 000000000..8b697a120 --- /dev/null +++ b/docs/continuations/charles/downs-style-voice-metrics.json @@ -0,0 +1,4756 @@ +{ + "schema_version": 1, + "source": { + "corpus_sha256": "a0e32a426e74214bed92734a98e4041192f4230446ff521d205981180d4dae0a", + "public_post_count": 258, + "first_publication_date": "2017-12-04", + "last_publication_date": "2026-08-02", + "contains_verbatim_article_text": false + }, + "baseline": { + "cutoff": "2024-12-31", + "rationale": "Causal baseline excludes posts published after the historical corpus that prompted this voice audit.", + "included_posts": 257, + "excluded_posts": 1, + "excluded_urls": [ + "https://www.downsstyle.com/skincare/2026/8/1/rose-toners-and-the-benefits-behind-our-favorite-scent" + ], + "metrics": { + "posts": 257, + "words": 76597, + "median_post_words": 265, + "mean_sentence_words": 20.95, + "median_paragraph_words": 23, + "pronouns": { + "first_person_singular": { + "count": 3448, + "per_1000_words": 45.01 + }, + "first_person_plural": { + "count": 75, + "per_1000_words": 0.98 + }, + "second_person": { + "count": 734, + "per_1000_words": 9.58 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.21, + "exclamation_marks": 0.52 + }, + "structural_post_counts": { + "first_person_title": 27, + "question_title": 6, + "review_title": 86, + "shop_cue": 178, + "reader_thanks": 88, + "numeric_rating": 35 + }, + "lexical_markers": { + "love": { + "count": 255, + "per_1000_words": 3.33 + }, + "loved": { + "count": 104, + "per_1000_words": 1.36 + }, + "favorite": { + "count": 112, + "per_1000_words": 1.46 + }, + "obsessed": { + "count": 25, + "per_1000_words": 0.33 + }, + "amazing": { + "count": 65, + "per_1000_words": 0.85 + }, + "great": { + "count": 93, + "per_1000_words": 1.21 + }, + "beautiful": { + "count": 25, + "per_1000_words": 0.33 + }, + "cute": { + "count": 20, + "per_1000_words": 0.26 + }, + "luxury": { + "count": 33, + "per_1000_words": 0.43 + }, + "luxurious": { + "count": 22, + "per_1000_words": 0.29 + }, + "glowing": { + "count": 27, + "per_1000_words": 0.35 + }, + "healthy": { + "count": 37, + "per_1000_words": 0.48 + }, + "natural": { + "count": 128, + "per_1000_words": 1.67 + }, + "organic": { + "count": 90, + "per_1000_words": 1.17 + }, + "personally": { + "count": 54, + "per_1000_words": 0.7 + }, + "however": { + "count": 180, + "per_1000_words": 2.35 + }, + "overall": { + "count": 124, + "per_1000_words": 1.62 + } + }, + "phrase_markers": { + "i love": { + "count": 226, + "per_1000_words": 2.95 + }, + "i loved": { + "count": 72, + "per_1000_words": 0.94 + }, + "i like": { + "count": 55, + "per_1000_words": 0.72 + }, + "i think": { + "count": 46, + "per_1000_words": 0.6 + }, + "i feel": { + "count": 29, + "per_1000_words": 0.38 + }, + "i recommend": { + "count": 8, + "per_1000_words": 0.1 + }, + "i personally": { + "count": 38, + "per_1000_words": 0.5 + }, + "i have to say": { + "count": 20, + "per_1000_words": 0.26 + }, + "my favorite": { + "count": 92, + "per_1000_words": 1.2 + }, + "one of my favorite": { + "count": 36, + "per_1000_words": 0.47 + }, + "for me": { + "count": 41, + "per_1000_words": 0.54 + }, + "of course": { + "count": 7, + "per_1000_words": 0.09 + }, + "so i decided": { + "count": 26, + "per_1000_words": 0.34 + }, + "had to try": { + "count": 14, + "per_1000_words": 0.18 + }, + "fell in love": { + "count": 15, + "per_1000_words": 0.2 + }, + "made my skin feel": { + "count": 17, + "per_1000_words": 0.22 + }, + "left my skin feeling": { + "count": 12, + "per_1000_words": 0.16 + }, + "overall i": { + "count": 75, + "per_1000_words": 0.98 + }, + "thanks so much for reading": { + "count": 62, + "per_1000_words": 0.81 + }, + "shop below": { + "count": 140, + "per_1000_words": 1.83 + }, + "click to shop": { + "count": 6, + "per_1000_words": 0.08 + } + } + } + }, + "all_public_posts": { + "posts": 258, + "words": 77334, + "median_post_words": 265.0, + "mean_sentence_words": 20.96, + "median_paragraph_words": 23.0, + "pronouns": { + "first_person_singular": { + "count": 3448, + "per_1000_words": 44.59 + }, + "first_person_plural": { + "count": 89, + "per_1000_words": 1.15 + }, + "second_person": { + "count": 746, + "per_1000_words": 9.65 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.25, + "exclamation_marks": 0.52 + }, + "structural_post_counts": { + "first_person_title": 27, + "question_title": 6, + "review_title": 86, + "shop_cue": 178, + "reader_thanks": 88, + "numeric_rating": 35 + }, + "lexical_markers": { + "love": { + "count": 256, + "per_1000_words": 3.31 + }, + "loved": { + "count": 104, + "per_1000_words": 1.34 + }, + "favorite": { + "count": 114, + "per_1000_words": 1.47 + }, + "obsessed": { + "count": 25, + "per_1000_words": 0.32 + }, + "amazing": { + "count": 65, + "per_1000_words": 0.84 + }, + "great": { + "count": 94, + "per_1000_words": 1.22 + }, + "beautiful": { + "count": 25, + "per_1000_words": 0.32 + }, + "cute": { + "count": 20, + "per_1000_words": 0.26 + }, + "luxury": { + "count": 33, + "per_1000_words": 0.43 + }, + "luxurious": { + "count": 22, + "per_1000_words": 0.28 + }, + "glowing": { + "count": 27, + "per_1000_words": 0.35 + }, + "healthy": { + "count": 37, + "per_1000_words": 0.48 + }, + "natural": { + "count": 129, + "per_1000_words": 1.67 + }, + "organic": { + "count": 91, + "per_1000_words": 1.18 + }, + "personally": { + "count": 54, + "per_1000_words": 0.7 + }, + "however": { + "count": 180, + "per_1000_words": 2.33 + }, + "overall": { + "count": 125, + "per_1000_words": 1.62 + } + }, + "phrase_markers": { + "i love": { + "count": 226, + "per_1000_words": 2.92 + }, + "i loved": { + "count": 72, + "per_1000_words": 0.93 + }, + "i like": { + "count": 55, + "per_1000_words": 0.71 + }, + "i think": { + "count": 46, + "per_1000_words": 0.59 + }, + "i feel": { + "count": 29, + "per_1000_words": 0.37 + }, + "i recommend": { + "count": 8, + "per_1000_words": 0.1 + }, + "i personally": { + "count": 38, + "per_1000_words": 0.49 + }, + "i have to say": { + "count": 20, + "per_1000_words": 0.26 + }, + "my favorite": { + "count": 92, + "per_1000_words": 1.19 + }, + "one of my favorite": { + "count": 36, + "per_1000_words": 0.47 + }, + "for me": { + "count": 41, + "per_1000_words": 0.53 + }, + "of course": { + "count": 8, + "per_1000_words": 0.1 + }, + "so i decided": { + "count": 26, + "per_1000_words": 0.34 + }, + "had to try": { + "count": 14, + "per_1000_words": 0.18 + }, + "fell in love": { + "count": 15, + "per_1000_words": 0.19 + }, + "made my skin feel": { + "count": 17, + "per_1000_words": 0.22 + }, + "left my skin feeling": { + "count": 12, + "per_1000_words": 0.16 + }, + "overall i": { + "count": 75, + "per_1000_words": 0.97 + }, + "thanks so much for reading": { + "count": 62, + "per_1000_words": 0.8 + }, + "shop below": { + "count": 140, + "per_1000_words": 1.81 + }, + "click to shop": { + "count": 6, + "per_1000_words": 0.08 + } + } + }, + "by_era": { + "2017-2018_foundation": { + "posts": 94, + "words": 22042, + "median_post_words": 221.5, + "mean_sentence_words": 18.88, + "median_paragraph_words": 42, + "pronouns": { + "first_person_singular": { + "count": 1259, + "per_1000_words": 57.12 + }, + "first_person_plural": { + "count": 18, + "per_1000_words": 0.82 + }, + "second_person": { + "count": 237, + "per_1000_words": 10.75 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.05, + "exclamation_marks": 0.64 + }, + "structural_post_counts": { + "first_person_title": 10, + "question_title": 3, + "review_title": 10, + "shop_cue": 70, + "reader_thanks": 33, + "numeric_rating": 27 + }, + "lexical_markers": { + "love": { + "count": 99, + "per_1000_words": 4.49 + }, + "loved": { + "count": 42, + "per_1000_words": 1.91 + }, + "favorite": { + "count": 35, + "per_1000_words": 1.59 + }, + "obsessed": { + "count": 5, + "per_1000_words": 0.23 + }, + "amazing": { + "count": 26, + "per_1000_words": 1.18 + }, + "great": { + "count": 13, + "per_1000_words": 0.59 + }, + "beautiful": { + "count": 13, + "per_1000_words": 0.59 + }, + "cute": { + "count": 8, + "per_1000_words": 0.36 + }, + "luxury": { + "count": 14, + "per_1000_words": 0.64 + }, + "luxurious": { + "count": 2, + "per_1000_words": 0.09 + }, + "glowing": { + "count": 8, + "per_1000_words": 0.36 + }, + "healthy": { + "count": 4, + "per_1000_words": 0.18 + }, + "natural": { + "count": 25, + "per_1000_words": 1.13 + }, + "organic": { + "count": 4, + "per_1000_words": 0.18 + }, + "personally": { + "count": 10, + "per_1000_words": 0.45 + }, + "however": { + "count": 21, + "per_1000_words": 0.95 + }, + "overall": { + "count": 36, + "per_1000_words": 1.63 + } + }, + "phrase_markers": { + "i love": { + "count": 90, + "per_1000_words": 4.08 + }, + "i loved": { + "count": 32, + "per_1000_words": 1.45 + }, + "i like": { + "count": 11, + "per_1000_words": 0.5 + }, + "i think": { + "count": 12, + "per_1000_words": 0.54 + }, + "i feel": { + "count": 4, + "per_1000_words": 0.18 + }, + "i recommend": { + "count": 3, + "per_1000_words": 0.14 + }, + "i personally": { + "count": 6, + "per_1000_words": 0.27 + }, + "i have to say": { + "count": 4, + "per_1000_words": 0.18 + }, + "my favorite": { + "count": 28, + "per_1000_words": 1.27 + }, + "one of my favorite": { + "count": 11, + "per_1000_words": 0.5 + }, + "for me": { + "count": 10, + "per_1000_words": 0.45 + }, + "of course": { + "count": 2, + "per_1000_words": 0.09 + }, + "so i decided": { + "count": 10, + "per_1000_words": 0.45 + }, + "had to try": { + "count": 1, + "per_1000_words": 0.05 + }, + "fell in love": { + "count": 12, + "per_1000_words": 0.54 + }, + "made my skin feel": { + "count": 1, + "per_1000_words": 0.05 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 23, + "per_1000_words": 1.04 + }, + "thanks so much for reading": { + "count": 12, + "per_1000_words": 0.54 + }, + "shop below": { + "count": 40, + "per_1000_words": 1.81 + }, + "click to shop": { + "count": 6, + "per_1000_words": 0.27 + } + } + }, + "2019-2020_reviews": { + "posts": 76, + "words": 26266, + "median_post_words": 294.5, + "mean_sentence_words": 23.4, + "median_paragraph_words": 27, + "pronouns": { + "first_person_singular": { + "count": 1404, + "per_1000_words": 53.45 + }, + "first_person_plural": { + "count": 20, + "per_1000_words": 0.76 + }, + "second_person": { + "count": 167, + "per_1000_words": 6.36 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.0, + "exclamation_marks": 0.61 + }, + "structural_post_counts": { + "first_person_title": 5, + "question_title": 2, + "review_title": 49, + "shop_cue": 59, + "reader_thanks": 53, + "numeric_rating": 8 + }, + "lexical_markers": { + "love": { + "count": 80, + "per_1000_words": 3.05 + }, + "loved": { + "count": 37, + "per_1000_words": 1.41 + }, + "favorite": { + "count": 30, + "per_1000_words": 1.14 + }, + "obsessed": { + "count": 9, + "per_1000_words": 0.34 + }, + "amazing": { + "count": 26, + "per_1000_words": 0.99 + }, + "great": { + "count": 13, + "per_1000_words": 0.49 + }, + "beautiful": { + "count": 7, + "per_1000_words": 0.27 + }, + "cute": { + "count": 6, + "per_1000_words": 0.23 + }, + "luxury": { + "count": 2, + "per_1000_words": 0.08 + }, + "luxurious": { + "count": 6, + "per_1000_words": 0.23 + }, + "glowing": { + "count": 10, + "per_1000_words": 0.38 + }, + "healthy": { + "count": 14, + "per_1000_words": 0.53 + }, + "natural": { + "count": 46, + "per_1000_words": 1.75 + }, + "organic": { + "count": 34, + "per_1000_words": 1.29 + }, + "personally": { + "count": 18, + "per_1000_words": 0.69 + }, + "however": { + "count": 132, + "per_1000_words": 5.03 + }, + "overall": { + "count": 51, + "per_1000_words": 1.94 + } + }, + "phrase_markers": { + "i love": { + "count": 83, + "per_1000_words": 3.16 + }, + "i loved": { + "count": 27, + "per_1000_words": 1.03 + }, + "i like": { + "count": 31, + "per_1000_words": 1.18 + }, + "i think": { + "count": 32, + "per_1000_words": 1.22 + }, + "i feel": { + "count": 6, + "per_1000_words": 0.23 + }, + "i recommend": { + "count": 2, + "per_1000_words": 0.08 + }, + "i personally": { + "count": 9, + "per_1000_words": 0.34 + }, + "i have to say": { + "count": 10, + "per_1000_words": 0.38 + }, + "my favorite": { + "count": 22, + "per_1000_words": 0.84 + }, + "one of my favorite": { + "count": 9, + "per_1000_words": 0.34 + }, + "for me": { + "count": 21, + "per_1000_words": 0.8 + }, + "of course": { + "count": 1, + "per_1000_words": 0.04 + }, + "so i decided": { + "count": 12, + "per_1000_words": 0.46 + }, + "had to try": { + "count": 11, + "per_1000_words": 0.42 + }, + "fell in love": { + "count": 3, + "per_1000_words": 0.11 + }, + "made my skin feel": { + "count": 14, + "per_1000_words": 0.53 + }, + "left my skin feeling": { + "count": 12, + "per_1000_words": 0.46 + }, + "overall i": { + "count": 36, + "per_1000_words": 1.37 + }, + "thanks so much for reading": { + "count": 49, + "per_1000_words": 1.87 + }, + "shop below": { + "count": 62, + "per_1000_words": 2.36 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "2021-2023_expansion": { + "posts": 63, + "words": 19529, + "median_post_words": 282, + "mean_sentence_words": 22.28, + "median_paragraph_words": 10.5, + "pronouns": { + "first_person_singular": { + "count": 603, + "per_1000_words": 30.88 + }, + "first_person_plural": { + "count": 29, + "per_1000_words": 1.48 + }, + "second_person": { + "count": 216, + "per_1000_words": 11.06 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.31, + "exclamation_marks": 0.41 + }, + "structural_post_counts": { + "first_person_title": 7, + "question_title": 0, + "review_title": 19, + "shop_cue": 37, + "reader_thanks": 2, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 59, + "per_1000_words": 3.02 + }, + "loved": { + "count": 20, + "per_1000_words": 1.02 + }, + "favorite": { + "count": 37, + "per_1000_words": 1.89 + }, + "obsessed": { + "count": 11, + "per_1000_words": 0.56 + }, + "amazing": { + "count": 11, + "per_1000_words": 0.56 + }, + "great": { + "count": 52, + "per_1000_words": 2.66 + }, + "beautiful": { + "count": 4, + "per_1000_words": 0.2 + }, + "cute": { + "count": 5, + "per_1000_words": 0.26 + }, + "luxury": { + "count": 5, + "per_1000_words": 0.26 + }, + "luxurious": { + "count": 8, + "per_1000_words": 0.41 + }, + "glowing": { + "count": 7, + "per_1000_words": 0.36 + }, + "healthy": { + "count": 9, + "per_1000_words": 0.46 + }, + "natural": { + "count": 35, + "per_1000_words": 1.79 + }, + "organic": { + "count": 40, + "per_1000_words": 2.05 + }, + "personally": { + "count": 26, + "per_1000_words": 1.33 + }, + "however": { + "count": 17, + "per_1000_words": 0.87 + }, + "overall": { + "count": 25, + "per_1000_words": 1.28 + } + }, + "phrase_markers": { + "i love": { + "count": 39, + "per_1000_words": 2.0 + }, + "i loved": { + "count": 10, + "per_1000_words": 0.51 + }, + "i like": { + "count": 12, + "per_1000_words": 0.61 + }, + "i think": { + "count": 1, + "per_1000_words": 0.05 + }, + "i feel": { + "count": 18, + "per_1000_words": 0.92 + }, + "i recommend": { + "count": 2, + "per_1000_words": 0.1 + }, + "i personally": { + "count": 23, + "per_1000_words": 1.18 + }, + "i have to say": { + "count": 5, + "per_1000_words": 0.26 + }, + "my favorite": { + "count": 35, + "per_1000_words": 1.79 + }, + "one of my favorite": { + "count": 14, + "per_1000_words": 0.72 + }, + "for me": { + "count": 5, + "per_1000_words": 0.26 + }, + "of course": { + "count": 4, + "per_1000_words": 0.2 + }, + "so i decided": { + "count": 3, + "per_1000_words": 0.15 + }, + "had to try": { + "count": 2, + "per_1000_words": 0.1 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 2, + "per_1000_words": 0.1 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 15, + "per_1000_words": 0.77 + }, + "thanks so much for reading": { + "count": 1, + "per_1000_words": 0.05 + }, + "shop below": { + "count": 28, + "per_1000_words": 1.43 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "2024_editorial": { + "posts": 24, + "words": 8760, + "median_post_words": 343.0, + "mean_sentence_words": 17.85, + "median_paragraph_words": 54, + "pronouns": { + "first_person_singular": { + "count": 182, + "per_1000_words": 20.78 + }, + "first_person_plural": { + "count": 8, + "per_1000_words": 0.91 + }, + "second_person": { + "count": 114, + "per_1000_words": 13.01 + } + }, + "punctuation_per_1000_words": { + "question_marks": 1.03, + "exclamation_marks": 0.23 + }, + "structural_post_counts": { + "first_person_title": 5, + "question_title": 1, + "review_title": 8, + "shop_cue": 12, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 17, + "per_1000_words": 1.94 + }, + "loved": { + "count": 5, + "per_1000_words": 0.57 + }, + "favorite": { + "count": 10, + "per_1000_words": 1.14 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 2, + "per_1000_words": 0.23 + }, + "great": { + "count": 15, + "per_1000_words": 1.71 + }, + "beautiful": { + "count": 1, + "per_1000_words": 0.11 + }, + "cute": { + "count": 1, + "per_1000_words": 0.11 + }, + "luxury": { + "count": 12, + "per_1000_words": 1.37 + }, + "luxurious": { + "count": 6, + "per_1000_words": 0.68 + }, + "glowing": { + "count": 2, + "per_1000_words": 0.23 + }, + "healthy": { + "count": 10, + "per_1000_words": 1.14 + }, + "natural": { + "count": 22, + "per_1000_words": 2.51 + }, + "organic": { + "count": 12, + "per_1000_words": 1.37 + }, + "personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "however": { + "count": 10, + "per_1000_words": 1.14 + }, + "overall": { + "count": 12, + "per_1000_words": 1.37 + } + }, + "phrase_markers": { + "i love": { + "count": 14, + "per_1000_words": 1.6 + }, + "i loved": { + "count": 3, + "per_1000_words": 0.34 + }, + "i like": { + "count": 1, + "per_1000_words": 0.11 + }, + "i think": { + "count": 1, + "per_1000_words": 0.11 + }, + "i feel": { + "count": 1, + "per_1000_words": 0.11 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.11 + }, + "i personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "i have to say": { + "count": 1, + "per_1000_words": 0.11 + }, + "my favorite": { + "count": 7, + "per_1000_words": 0.8 + }, + "one of my favorite": { + "count": 2, + "per_1000_words": 0.23 + }, + "for me": { + "count": 5, + "per_1000_words": 0.57 + }, + "of course": { + "count": 0, + "per_1000_words": 0.0 + }, + "so i decided": { + "count": 1, + "per_1000_words": 0.11 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 1, + "per_1000_words": 0.11 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 10, + "per_1000_words": 1.14 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "2025_plus": { + "posts": 1, + "words": 737, + "median_post_words": 737, + "mean_sentence_words": 23.03, + "median_paragraph_words": 107, + "pronouns": { + "first_person_singular": { + "count": 0, + "per_1000_words": 0.0 + }, + "first_person_plural": { + "count": 14, + "per_1000_words": 19.0 + }, + "second_person": { + "count": 12, + "per_1000_words": 16.28 + } + }, + "punctuation_per_1000_words": { + "question_marks": 4.07, + "exclamation_marks": 0.0 + }, + "structural_post_counts": { + "first_person_title": 0, + "question_title": 0, + "review_title": 0, + "shop_cue": 0, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 1, + "per_1000_words": 1.36 + }, + "loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "favorite": { + "count": 2, + "per_1000_words": 2.71 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 0, + "per_1000_words": 0.0 + }, + "great": { + "count": 1, + "per_1000_words": 1.36 + }, + "beautiful": { + "count": 0, + "per_1000_words": 0.0 + }, + "cute": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxury": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxurious": { + "count": 0, + "per_1000_words": 0.0 + }, + "glowing": { + "count": 0, + "per_1000_words": 0.0 + }, + "healthy": { + "count": 0, + "per_1000_words": 0.0 + }, + "natural": { + "count": 1, + "per_1000_words": 1.36 + }, + "organic": { + "count": 1, + "per_1000_words": 1.36 + }, + "personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "however": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall": { + "count": 1, + "per_1000_words": 1.36 + } + }, + "phrase_markers": { + "i love": { + "count": 0, + "per_1000_words": 0.0 + }, + "i loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "i like": { + "count": 0, + "per_1000_words": 0.0 + }, + "i think": { + "count": 0, + "per_1000_words": 0.0 + }, + "i feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "i recommend": { + "count": 0, + "per_1000_words": 0.0 + }, + "i personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 0, + "per_1000_words": 0.0 + }, + "one of my favorite": { + "count": 0, + "per_1000_words": 0.0 + }, + "for me": { + "count": 0, + "per_1000_words": 0.0 + }, + "of course": { + "count": 1, + "per_1000_words": 1.36 + }, + "so i decided": { + "count": 0, + "per_1000_words": 0.0 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 0, + "per_1000_words": 0.0 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 0, + "per_1000_words": 0.0 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + } + }, + "by_year": { + "2017": { + "posts": 16, + "words": 3670, + "median_post_words": 225.5, + "mean_sentence_words": 16.08, + "median_paragraph_words": 49, + "pronouns": { + "first_person_singular": { + "count": 197, + "per_1000_words": 53.68 + }, + "first_person_plural": { + "count": 4, + "per_1000_words": 1.09 + }, + "second_person": { + "count": 54, + "per_1000_words": 14.71 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.27, + "exclamation_marks": 0.54 + }, + "structural_post_counts": { + "first_person_title": 3, + "question_title": 1, + "review_title": 1, + "shop_cue": 10, + "reader_thanks": 1, + "numeric_rating": 3 + }, + "lexical_markers": { + "love": { + "count": 18, + "per_1000_words": 4.9 + }, + "loved": { + "count": 4, + "per_1000_words": 1.09 + }, + "favorite": { + "count": 7, + "per_1000_words": 1.91 + }, + "obsessed": { + "count": 1, + "per_1000_words": 0.27 + }, + "amazing": { + "count": 2, + "per_1000_words": 0.54 + }, + "great": { + "count": 1, + "per_1000_words": 0.27 + }, + "beautiful": { + "count": 1, + "per_1000_words": 0.27 + }, + "cute": { + "count": 4, + "per_1000_words": 1.09 + }, + "luxury": { + "count": 1, + "per_1000_words": 0.27 + }, + "luxurious": { + "count": 0, + "per_1000_words": 0.0 + }, + "glowing": { + "count": 0, + "per_1000_words": 0.0 + }, + "healthy": { + "count": 1, + "per_1000_words": 0.27 + }, + "natural": { + "count": 3, + "per_1000_words": 0.82 + }, + "organic": { + "count": 0, + "per_1000_words": 0.0 + }, + "personally": { + "count": 2, + "per_1000_words": 0.54 + }, + "however": { + "count": 3, + "per_1000_words": 0.82 + }, + "overall": { + "count": 5, + "per_1000_words": 1.36 + } + }, + "phrase_markers": { + "i love": { + "count": 13, + "per_1000_words": 3.54 + }, + "i loved": { + "count": 3, + "per_1000_words": 0.82 + }, + "i like": { + "count": 2, + "per_1000_words": 0.54 + }, + "i think": { + "count": 3, + "per_1000_words": 0.82 + }, + "i feel": { + "count": 3, + "per_1000_words": 0.82 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.27 + }, + "i personally": { + "count": 1, + "per_1000_words": 0.27 + }, + "i have to say": { + "count": 1, + "per_1000_words": 0.27 + }, + "my favorite": { + "count": 5, + "per_1000_words": 1.36 + }, + "one of my favorite": { + "count": 1, + "per_1000_words": 0.27 + }, + "for me": { + "count": 3, + "per_1000_words": 0.82 + }, + "of course": { + "count": 1, + "per_1000_words": 0.27 + }, + "so i decided": { + "count": 3, + "per_1000_words": 0.82 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 1, + "per_1000_words": 0.27 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 3, + "per_1000_words": 0.82 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 3, + "per_1000_words": 0.82 + }, + "click to shop": { + "count": 2, + "per_1000_words": 0.54 + } + } + }, + "2018": { + "posts": 78, + "words": 18372, + "median_post_words": 221.5, + "mean_sentence_words": 19.56, + "median_paragraph_words": 34.5, + "pronouns": { + "first_person_singular": { + "count": 1062, + "per_1000_words": 57.81 + }, + "first_person_plural": { + "count": 14, + "per_1000_words": 0.76 + }, + "second_person": { + "count": 183, + "per_1000_words": 9.96 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.0, + "exclamation_marks": 0.65 + }, + "structural_post_counts": { + "first_person_title": 7, + "question_title": 2, + "review_title": 9, + "shop_cue": 60, + "reader_thanks": 32, + "numeric_rating": 24 + }, + "lexical_markers": { + "love": { + "count": 81, + "per_1000_words": 4.41 + }, + "loved": { + "count": 38, + "per_1000_words": 2.07 + }, + "favorite": { + "count": 28, + "per_1000_words": 1.52 + }, + "obsessed": { + "count": 4, + "per_1000_words": 0.22 + }, + "amazing": { + "count": 24, + "per_1000_words": 1.31 + }, + "great": { + "count": 12, + "per_1000_words": 0.65 + }, + "beautiful": { + "count": 12, + "per_1000_words": 0.65 + }, + "cute": { + "count": 4, + "per_1000_words": 0.22 + }, + "luxury": { + "count": 13, + "per_1000_words": 0.71 + }, + "luxurious": { + "count": 2, + "per_1000_words": 0.11 + }, + "glowing": { + "count": 8, + "per_1000_words": 0.44 + }, + "healthy": { + "count": 3, + "per_1000_words": 0.16 + }, + "natural": { + "count": 22, + "per_1000_words": 1.2 + }, + "organic": { + "count": 4, + "per_1000_words": 0.22 + }, + "personally": { + "count": 8, + "per_1000_words": 0.44 + }, + "however": { + "count": 18, + "per_1000_words": 0.98 + }, + "overall": { + "count": 31, + "per_1000_words": 1.69 + } + }, + "phrase_markers": { + "i love": { + "count": 77, + "per_1000_words": 4.19 + }, + "i loved": { + "count": 29, + "per_1000_words": 1.58 + }, + "i like": { + "count": 9, + "per_1000_words": 0.49 + }, + "i think": { + "count": 9, + "per_1000_words": 0.49 + }, + "i feel": { + "count": 1, + "per_1000_words": 0.05 + }, + "i recommend": { + "count": 2, + "per_1000_words": 0.11 + }, + "i personally": { + "count": 5, + "per_1000_words": 0.27 + }, + "i have to say": { + "count": 3, + "per_1000_words": 0.16 + }, + "my favorite": { + "count": 23, + "per_1000_words": 1.25 + }, + "one of my favorite": { + "count": 10, + "per_1000_words": 0.54 + }, + "for me": { + "count": 7, + "per_1000_words": 0.38 + }, + "of course": { + "count": 1, + "per_1000_words": 0.05 + }, + "so i decided": { + "count": 7, + "per_1000_words": 0.38 + }, + "had to try": { + "count": 1, + "per_1000_words": 0.05 + }, + "fell in love": { + "count": 12, + "per_1000_words": 0.65 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 20, + "per_1000_words": 1.09 + }, + "thanks so much for reading": { + "count": 12, + "per_1000_words": 0.65 + }, + "shop below": { + "count": 37, + "per_1000_words": 2.01 + }, + "click to shop": { + "count": 4, + "per_1000_words": 0.22 + } + } + }, + "2019": { + "posts": 22, + "words": 7616, + "median_post_words": 271.5, + "mean_sentence_words": 22.71, + "median_paragraph_words": 98.0, + "pronouns": { + "first_person_singular": { + "count": 408, + "per_1000_words": 53.57 + }, + "first_person_plural": { + "count": 5, + "per_1000_words": 0.66 + }, + "second_person": { + "count": 61, + "per_1000_words": 8.01 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.0, + "exclamation_marks": 0.66 + }, + "structural_post_counts": { + "first_person_title": 1, + "question_title": 0, + "review_title": 15, + "shop_cue": 21, + "reader_thanks": 15, + "numeric_rating": 5 + }, + "lexical_markers": { + "love": { + "count": 24, + "per_1000_words": 3.15 + }, + "loved": { + "count": 18, + "per_1000_words": 2.36 + }, + "favorite": { + "count": 13, + "per_1000_words": 1.71 + }, + "obsessed": { + "count": 3, + "per_1000_words": 0.39 + }, + "amazing": { + "count": 12, + "per_1000_words": 1.58 + }, + "great": { + "count": 5, + "per_1000_words": 0.66 + }, + "beautiful": { + "count": 5, + "per_1000_words": 0.66 + }, + "cute": { + "count": 2, + "per_1000_words": 0.26 + }, + "luxury": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxurious": { + "count": 1, + "per_1000_words": 0.13 + }, + "glowing": { + "count": 5, + "per_1000_words": 0.66 + }, + "healthy": { + "count": 2, + "per_1000_words": 0.26 + }, + "natural": { + "count": 6, + "per_1000_words": 0.79 + }, + "organic": { + "count": 5, + "per_1000_words": 0.66 + }, + "personally": { + "count": 6, + "per_1000_words": 0.79 + }, + "however": { + "count": 27, + "per_1000_words": 3.55 + }, + "overall": { + "count": 20, + "per_1000_words": 2.63 + } + }, + "phrase_markers": { + "i love": { + "count": 29, + "per_1000_words": 3.81 + }, + "i loved": { + "count": 13, + "per_1000_words": 1.71 + }, + "i like": { + "count": 7, + "per_1000_words": 0.92 + }, + "i think": { + "count": 10, + "per_1000_words": 1.31 + }, + "i feel": { + "count": 2, + "per_1000_words": 0.26 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.13 + }, + "i personally": { + "count": 2, + "per_1000_words": 0.26 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 8, + "per_1000_words": 1.05 + }, + "one of my favorite": { + "count": 2, + "per_1000_words": 0.26 + }, + "for me": { + "count": 5, + "per_1000_words": 0.66 + }, + "of course": { + "count": 0, + "per_1000_words": 0.0 + }, + "so i decided": { + "count": 4, + "per_1000_words": 0.53 + }, + "had to try": { + "count": 4, + "per_1000_words": 0.53 + }, + "fell in love": { + "count": 3, + "per_1000_words": 0.39 + }, + "made my skin feel": { + "count": 5, + "per_1000_words": 0.66 + }, + "left my skin feeling": { + "count": 6, + "per_1000_words": 0.79 + }, + "overall i": { + "count": 11, + "per_1000_words": 1.44 + }, + "thanks so much for reading": { + "count": 12, + "per_1000_words": 1.58 + }, + "shop below": { + "count": 21, + "per_1000_words": 2.76 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "2020": { + "posts": 54, + "words": 18650, + "median_post_words": 301.5, + "mean_sentence_words": 23.69, + "median_paragraph_words": 23, + "pronouns": { + "first_person_singular": { + "count": 996, + "per_1000_words": 53.4 + }, + "first_person_plural": { + "count": 15, + "per_1000_words": 0.8 + }, + "second_person": { + "count": 106, + "per_1000_words": 5.68 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.0, + "exclamation_marks": 0.59 + }, + "structural_post_counts": { + "first_person_title": 4, + "question_title": 2, + "review_title": 34, + "shop_cue": 38, + "reader_thanks": 38, + "numeric_rating": 3 + }, + "lexical_markers": { + "love": { + "count": 56, + "per_1000_words": 3.0 + }, + "loved": { + "count": 19, + "per_1000_words": 1.02 + }, + "favorite": { + "count": 17, + "per_1000_words": 0.91 + }, + "obsessed": { + "count": 6, + "per_1000_words": 0.32 + }, + "amazing": { + "count": 14, + "per_1000_words": 0.75 + }, + "great": { + "count": 8, + "per_1000_words": 0.43 + }, + "beautiful": { + "count": 2, + "per_1000_words": 0.11 + }, + "cute": { + "count": 4, + "per_1000_words": 0.21 + }, + "luxury": { + "count": 2, + "per_1000_words": 0.11 + }, + "luxurious": { + "count": 5, + "per_1000_words": 0.27 + }, + "glowing": { + "count": 5, + "per_1000_words": 0.27 + }, + "healthy": { + "count": 12, + "per_1000_words": 0.64 + }, + "natural": { + "count": 40, + "per_1000_words": 2.14 + }, + "organic": { + "count": 29, + "per_1000_words": 1.55 + }, + "personally": { + "count": 12, + "per_1000_words": 0.64 + }, + "however": { + "count": 105, + "per_1000_words": 5.63 + }, + "overall": { + "count": 31, + "per_1000_words": 1.66 + } + }, + "phrase_markers": { + "i love": { + "count": 54, + "per_1000_words": 2.9 + }, + "i loved": { + "count": 14, + "per_1000_words": 0.75 + }, + "i like": { + "count": 24, + "per_1000_words": 1.29 + }, + "i think": { + "count": 22, + "per_1000_words": 1.18 + }, + "i feel": { + "count": 4, + "per_1000_words": 0.21 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.05 + }, + "i personally": { + "count": 7, + "per_1000_words": 0.38 + }, + "i have to say": { + "count": 10, + "per_1000_words": 0.54 + }, + "my favorite": { + "count": 14, + "per_1000_words": 0.75 + }, + "one of my favorite": { + "count": 7, + "per_1000_words": 0.38 + }, + "for me": { + "count": 16, + "per_1000_words": 0.86 + }, + "of course": { + "count": 1, + "per_1000_words": 0.05 + }, + "so i decided": { + "count": 8, + "per_1000_words": 0.43 + }, + "had to try": { + "count": 7, + "per_1000_words": 0.38 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 9, + "per_1000_words": 0.48 + }, + "left my skin feeling": { + "count": 6, + "per_1000_words": 0.32 + }, + "overall i": { + "count": 25, + "per_1000_words": 1.34 + }, + "thanks so much for reading": { + "count": 37, + "per_1000_words": 1.98 + }, + "shop below": { + "count": 41, + "per_1000_words": 2.2 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "2021": { + "posts": 22, + "words": 7277, + "median_post_words": 282.5, + "mean_sentence_words": 25.44, + "median_paragraph_words": 11, + "pronouns": { + "first_person_singular": { + "count": 196, + "per_1000_words": 26.93 + }, + "first_person_plural": { + "count": 16, + "per_1000_words": 2.2 + }, + "second_person": { + "count": 83, + "per_1000_words": 11.41 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.55, + "exclamation_marks": 0.41 + }, + "structural_post_counts": { + "first_person_title": 1, + "question_title": 0, + "review_title": 3, + "shop_cue": 10, + "reader_thanks": 2, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 19, + "per_1000_words": 2.61 + }, + "loved": { + "count": 5, + "per_1000_words": 0.69 + }, + "favorite": { + "count": 9, + "per_1000_words": 1.24 + }, + "obsessed": { + "count": 3, + "per_1000_words": 0.41 + }, + "amazing": { + "count": 4, + "per_1000_words": 0.55 + }, + "great": { + "count": 10, + "per_1000_words": 1.37 + }, + "beautiful": { + "count": 1, + "per_1000_words": 0.14 + }, + "cute": { + "count": 3, + "per_1000_words": 0.41 + }, + "luxury": { + "count": 1, + "per_1000_words": 0.14 + }, + "luxurious": { + "count": 0, + "per_1000_words": 0.0 + }, + "glowing": { + "count": 2, + "per_1000_words": 0.27 + }, + "healthy": { + "count": 2, + "per_1000_words": 0.27 + }, + "natural": { + "count": 15, + "per_1000_words": 2.06 + }, + "organic": { + "count": 29, + "per_1000_words": 3.99 + }, + "personally": { + "count": 10, + "per_1000_words": 1.37 + }, + "however": { + "count": 6, + "per_1000_words": 0.82 + }, + "overall": { + "count": 6, + "per_1000_words": 0.82 + } + }, + "phrase_markers": { + "i love": { + "count": 11, + "per_1000_words": 1.51 + }, + "i loved": { + "count": 2, + "per_1000_words": 0.27 + }, + "i like": { + "count": 4, + "per_1000_words": 0.55 + }, + "i think": { + "count": 0, + "per_1000_words": 0.0 + }, + "i feel": { + "count": 5, + "per_1000_words": 0.69 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.14 + }, + "i personally": { + "count": 10, + "per_1000_words": 1.37 + }, + "i have to say": { + "count": 1, + "per_1000_words": 0.14 + }, + "my favorite": { + "count": 7, + "per_1000_words": 0.96 + }, + "one of my favorite": { + "count": 4, + "per_1000_words": 0.55 + }, + "for me": { + "count": 0, + "per_1000_words": 0.0 + }, + "of course": { + "count": 1, + "per_1000_words": 0.14 + }, + "so i decided": { + "count": 2, + "per_1000_words": 0.27 + }, + "had to try": { + "count": 1, + "per_1000_words": 0.14 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 5, + "per_1000_words": 0.69 + }, + "thanks so much for reading": { + "count": 1, + "per_1000_words": 0.14 + }, + "shop below": { + "count": 8, + "per_1000_words": 1.1 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "2022": { + "posts": 5, + "words": 2219, + "median_post_words": 383, + "mean_sentence_words": 24.93, + "median_paragraph_words": 9.0, + "pronouns": { + "first_person_singular": { + "count": 80, + "per_1000_words": 36.05 + }, + "first_person_plural": { + "count": 0, + "per_1000_words": 0.0 + }, + "second_person": { + "count": 66, + "per_1000_words": 29.74 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.0, + "exclamation_marks": 1.8 + }, + "structural_post_counts": { + "first_person_title": 0, + "question_title": 0, + "review_title": 1, + "shop_cue": 2, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 10, + "per_1000_words": 4.51 + }, + "loved": { + "count": 6, + "per_1000_words": 2.7 + }, + "favorite": { + "count": 7, + "per_1000_words": 3.15 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 0, + "per_1000_words": 0.0 + }, + "great": { + "count": 10, + "per_1000_words": 4.51 + }, + "beautiful": { + "count": 0, + "per_1000_words": 0.0 + }, + "cute": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxury": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxurious": { + "count": 1, + "per_1000_words": 0.45 + }, + "glowing": { + "count": 2, + "per_1000_words": 0.9 + }, + "healthy": { + "count": 2, + "per_1000_words": 0.9 + }, + "natural": { + "count": 0, + "per_1000_words": 0.0 + }, + "organic": { + "count": 2, + "per_1000_words": 0.9 + }, + "personally": { + "count": 5, + "per_1000_words": 2.25 + }, + "however": { + "count": 2, + "per_1000_words": 0.9 + }, + "overall": { + "count": 1, + "per_1000_words": 0.45 + } + }, + "phrase_markers": { + "i love": { + "count": 9, + "per_1000_words": 4.06 + }, + "i loved": { + "count": 4, + "per_1000_words": 1.8 + }, + "i like": { + "count": 0, + "per_1000_words": 0.0 + }, + "i think": { + "count": 0, + "per_1000_words": 0.0 + }, + "i feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.45 + }, + "i personally": { + "count": 3, + "per_1000_words": 1.35 + }, + "i have to say": { + "count": 1, + "per_1000_words": 0.45 + }, + "my favorite": { + "count": 7, + "per_1000_words": 3.15 + }, + "one of my favorite": { + "count": 3, + "per_1000_words": 1.35 + }, + "for me": { + "count": 2, + "per_1000_words": 0.9 + }, + "of course": { + "count": 1, + "per_1000_words": 0.45 + }, + "so i decided": { + "count": 0, + "per_1000_words": 0.0 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 1, + "per_1000_words": 0.45 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 1, + "per_1000_words": 0.45 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "2023": { + "posts": 36, + "words": 10033, + "median_post_words": 281.5, + "mean_sentence_words": 20.0, + "median_paragraph_words": 8, + "pronouns": { + "first_person_singular": { + "count": 327, + "per_1000_words": 32.59 + }, + "first_person_plural": { + "count": 13, + "per_1000_words": 1.3 + }, + "second_person": { + "count": 67, + "per_1000_words": 6.68 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.2, + "exclamation_marks": 0.1 + }, + "structural_post_counts": { + "first_person_title": 6, + "question_title": 0, + "review_title": 15, + "shop_cue": 25, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 30, + "per_1000_words": 2.99 + }, + "loved": { + "count": 9, + "per_1000_words": 0.9 + }, + "favorite": { + "count": 21, + "per_1000_words": 2.09 + }, + "obsessed": { + "count": 8, + "per_1000_words": 0.8 + }, + "amazing": { + "count": 7, + "per_1000_words": 0.7 + }, + "great": { + "count": 32, + "per_1000_words": 3.19 + }, + "beautiful": { + "count": 3, + "per_1000_words": 0.3 + }, + "cute": { + "count": 2, + "per_1000_words": 0.2 + }, + "luxury": { + "count": 4, + "per_1000_words": 0.4 + }, + "luxurious": { + "count": 7, + "per_1000_words": 0.7 + }, + "glowing": { + "count": 3, + "per_1000_words": 0.3 + }, + "healthy": { + "count": 5, + "per_1000_words": 0.5 + }, + "natural": { + "count": 20, + "per_1000_words": 1.99 + }, + "organic": { + "count": 9, + "per_1000_words": 0.9 + }, + "personally": { + "count": 11, + "per_1000_words": 1.1 + }, + "however": { + "count": 9, + "per_1000_words": 0.9 + }, + "overall": { + "count": 18, + "per_1000_words": 1.79 + } + }, + "phrase_markers": { + "i love": { + "count": 19, + "per_1000_words": 1.89 + }, + "i loved": { + "count": 4, + "per_1000_words": 0.4 + }, + "i like": { + "count": 8, + "per_1000_words": 0.8 + }, + "i think": { + "count": 1, + "per_1000_words": 0.1 + }, + "i feel": { + "count": 13, + "per_1000_words": 1.3 + }, + "i recommend": { + "count": 0, + "per_1000_words": 0.0 + }, + "i personally": { + "count": 10, + "per_1000_words": 1.0 + }, + "i have to say": { + "count": 3, + "per_1000_words": 0.3 + }, + "my favorite": { + "count": 21, + "per_1000_words": 2.09 + }, + "one of my favorite": { + "count": 7, + "per_1000_words": 0.7 + }, + "for me": { + "count": 3, + "per_1000_words": 0.3 + }, + "of course": { + "count": 2, + "per_1000_words": 0.2 + }, + "so i decided": { + "count": 1, + "per_1000_words": 0.1 + }, + "had to try": { + "count": 1, + "per_1000_words": 0.1 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 2, + "per_1000_words": 0.2 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 9, + "per_1000_words": 0.9 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 19, + "per_1000_words": 1.89 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "2024": { + "posts": 24, + "words": 8760, + "median_post_words": 343.0, + "mean_sentence_words": 17.85, + "median_paragraph_words": 54, + "pronouns": { + "first_person_singular": { + "count": 182, + "per_1000_words": 20.78 + }, + "first_person_plural": { + "count": 8, + "per_1000_words": 0.91 + }, + "second_person": { + "count": 114, + "per_1000_words": 13.01 + } + }, + "punctuation_per_1000_words": { + "question_marks": 1.03, + "exclamation_marks": 0.23 + }, + "structural_post_counts": { + "first_person_title": 5, + "question_title": 1, + "review_title": 8, + "shop_cue": 12, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 17, + "per_1000_words": 1.94 + }, + "loved": { + "count": 5, + "per_1000_words": 0.57 + }, + "favorite": { + "count": 10, + "per_1000_words": 1.14 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 2, + "per_1000_words": 0.23 + }, + "great": { + "count": 15, + "per_1000_words": 1.71 + }, + "beautiful": { + "count": 1, + "per_1000_words": 0.11 + }, + "cute": { + "count": 1, + "per_1000_words": 0.11 + }, + "luxury": { + "count": 12, + "per_1000_words": 1.37 + }, + "luxurious": { + "count": 6, + "per_1000_words": 0.68 + }, + "glowing": { + "count": 2, + "per_1000_words": 0.23 + }, + "healthy": { + "count": 10, + "per_1000_words": 1.14 + }, + "natural": { + "count": 22, + "per_1000_words": 2.51 + }, + "organic": { + "count": 12, + "per_1000_words": 1.37 + }, + "personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "however": { + "count": 10, + "per_1000_words": 1.14 + }, + "overall": { + "count": 12, + "per_1000_words": 1.37 + } + }, + "phrase_markers": { + "i love": { + "count": 14, + "per_1000_words": 1.6 + }, + "i loved": { + "count": 3, + "per_1000_words": 0.34 + }, + "i like": { + "count": 1, + "per_1000_words": 0.11 + }, + "i think": { + "count": 1, + "per_1000_words": 0.11 + }, + "i feel": { + "count": 1, + "per_1000_words": 0.11 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.11 + }, + "i personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "i have to say": { + "count": 1, + "per_1000_words": 0.11 + }, + "my favorite": { + "count": 7, + "per_1000_words": 0.8 + }, + "one of my favorite": { + "count": 2, + "per_1000_words": 0.23 + }, + "for me": { + "count": 5, + "per_1000_words": 0.57 + }, + "of course": { + "count": 0, + "per_1000_words": 0.0 + }, + "so i decided": { + "count": 1, + "per_1000_words": 0.11 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 1, + "per_1000_words": 0.11 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 10, + "per_1000_words": 1.14 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "2026": { + "posts": 1, + "words": 737, + "median_post_words": 737, + "mean_sentence_words": 23.03, + "median_paragraph_words": 107, + "pronouns": { + "first_person_singular": { + "count": 0, + "per_1000_words": 0.0 + }, + "first_person_plural": { + "count": 14, + "per_1000_words": 19.0 + }, + "second_person": { + "count": 12, + "per_1000_words": 16.28 + } + }, + "punctuation_per_1000_words": { + "question_marks": 4.07, + "exclamation_marks": 0.0 + }, + "structural_post_counts": { + "first_person_title": 0, + "question_title": 0, + "review_title": 0, + "shop_cue": 0, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 1, + "per_1000_words": 1.36 + }, + "loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "favorite": { + "count": 2, + "per_1000_words": 2.71 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 0, + "per_1000_words": 0.0 + }, + "great": { + "count": 1, + "per_1000_words": 1.36 + }, + "beautiful": { + "count": 0, + "per_1000_words": 0.0 + }, + "cute": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxury": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxurious": { + "count": 0, + "per_1000_words": 0.0 + }, + "glowing": { + "count": 0, + "per_1000_words": 0.0 + }, + "healthy": { + "count": 0, + "per_1000_words": 0.0 + }, + "natural": { + "count": 1, + "per_1000_words": 1.36 + }, + "organic": { + "count": 1, + "per_1000_words": 1.36 + }, + "personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "however": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall": { + "count": 1, + "per_1000_words": 1.36 + } + }, + "phrase_markers": { + "i love": { + "count": 0, + "per_1000_words": 0.0 + }, + "i loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "i like": { + "count": 0, + "per_1000_words": 0.0 + }, + "i think": { + "count": 0, + "per_1000_words": 0.0 + }, + "i feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "i recommend": { + "count": 0, + "per_1000_words": 0.0 + }, + "i personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 0, + "per_1000_words": 0.0 + }, + "one of my favorite": { + "count": 0, + "per_1000_words": 0.0 + }, + "for me": { + "count": 0, + "per_1000_words": 0.0 + }, + "of course": { + "count": 1, + "per_1000_words": 1.36 + }, + "so i decided": { + "count": 0, + "per_1000_words": 0.0 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 0, + "per_1000_words": 0.0 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 0, + "per_1000_words": 0.0 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + } + }, + "by_category": { + "Candles": { + "posts": 18, + "words": 4130, + "median_post_words": 235.0, + "mean_sentence_words": 15.92, + "median_paragraph_words": 41.0, + "pronouns": { + "first_person_singular": { + "count": 146, + "per_1000_words": 35.35 + }, + "first_person_plural": { + "count": 3, + "per_1000_words": 0.73 + }, + "second_person": { + "count": 39, + "per_1000_words": 9.44 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.0, + "exclamation_marks": 0.48 + }, + "structural_post_counts": { + "first_person_title": 5, + "question_title": 0, + "review_title": 4, + "shop_cue": 15, + "reader_thanks": 3, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 19, + "per_1000_words": 4.6 + }, + "loved": { + "count": 2, + "per_1000_words": 0.48 + }, + "favorite": { + "count": 10, + "per_1000_words": 2.42 + }, + "obsessed": { + "count": 4, + "per_1000_words": 0.97 + }, + "amazing": { + "count": 2, + "per_1000_words": 0.48 + }, + "great": { + "count": 4, + "per_1000_words": 0.97 + }, + "beautiful": { + "count": 4, + "per_1000_words": 0.97 + }, + "cute": { + "count": 1, + "per_1000_words": 0.24 + }, + "luxury": { + "count": 3, + "per_1000_words": 0.73 + }, + "luxurious": { + "count": 2, + "per_1000_words": 0.48 + }, + "glowing": { + "count": 0, + "per_1000_words": 0.0 + }, + "healthy": { + "count": 0, + "per_1000_words": 0.0 + }, + "natural": { + "count": 16, + "per_1000_words": 3.87 + }, + "organic": { + "count": 5, + "per_1000_words": 1.21 + }, + "personally": { + "count": 4, + "per_1000_words": 0.97 + }, + "however": { + "count": 2, + "per_1000_words": 0.48 + }, + "overall": { + "count": 2, + "per_1000_words": 0.48 + } + }, + "phrase_markers": { + "i love": { + "count": 12, + "per_1000_words": 2.91 + }, + "i loved": { + "count": 1, + "per_1000_words": 0.24 + }, + "i like": { + "count": 4, + "per_1000_words": 0.97 + }, + "i think": { + "count": 1, + "per_1000_words": 0.24 + }, + "i feel": { + "count": 5, + "per_1000_words": 1.21 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.24 + }, + "i personally": { + "count": 4, + "per_1000_words": 0.97 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 9, + "per_1000_words": 2.18 + }, + "one of my favorite": { + "count": 0, + "per_1000_words": 0.0 + }, + "for me": { + "count": 2, + "per_1000_words": 0.48 + }, + "of course": { + "count": 1, + "per_1000_words": 0.24 + }, + "so i decided": { + "count": 2, + "per_1000_words": 0.48 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 3, + "per_1000_words": 0.73 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 1, + "per_1000_words": 0.24 + }, + "thanks so much for reading": { + "count": 1, + "per_1000_words": 0.24 + }, + "shop below": { + "count": 8, + "per_1000_words": 1.94 + }, + "click to shop": { + "count": 1, + "per_1000_words": 0.24 + } + } + }, + "Eat": { + "posts": 12, + "words": 3783, + "median_post_words": 253.5, + "mean_sentence_words": 20.79, + "median_paragraph_words": 14.0, + "pronouns": { + "first_person_singular": { + "count": 80, + "per_1000_words": 21.15 + }, + "first_person_plural": { + "count": 4, + "per_1000_words": 1.06 + }, + "second_person": { + "count": 57, + "per_1000_words": 15.07 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.26, + "exclamation_marks": 0.0 + }, + "structural_post_counts": { + "first_person_title": 4, + "question_title": 1, + "review_title": 0, + "shop_cue": 1, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 3, + "per_1000_words": 0.79 + }, + "loved": { + "count": 1, + "per_1000_words": 0.26 + }, + "favorite": { + "count": 17, + "per_1000_words": 4.49 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 4, + "per_1000_words": 1.06 + }, + "great": { + "count": 6, + "per_1000_words": 1.59 + }, + "beautiful": { + "count": 0, + "per_1000_words": 0.0 + }, + "cute": { + "count": 3, + "per_1000_words": 0.79 + }, + "luxury": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxurious": { + "count": 0, + "per_1000_words": 0.0 + }, + "glowing": { + "count": 1, + "per_1000_words": 0.26 + }, + "healthy": { + "count": 11, + "per_1000_words": 2.91 + }, + "natural": { + "count": 3, + "per_1000_words": 0.79 + }, + "organic": { + "count": 12, + "per_1000_words": 3.17 + }, + "personally": { + "count": 1, + "per_1000_words": 0.26 + }, + "however": { + "count": 3, + "per_1000_words": 0.79 + }, + "overall": { + "count": 2, + "per_1000_words": 0.53 + } + }, + "phrase_markers": { + "i love": { + "count": 1, + "per_1000_words": 0.26 + }, + "i loved": { + "count": 1, + "per_1000_words": 0.26 + }, + "i like": { + "count": 1, + "per_1000_words": 0.26 + }, + "i think": { + "count": 0, + "per_1000_words": 0.0 + }, + "i feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "i recommend": { + "count": 0, + "per_1000_words": 0.0 + }, + "i personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 17, + "per_1000_words": 4.49 + }, + "one of my favorite": { + "count": 5, + "per_1000_words": 1.32 + }, + "for me": { + "count": 0, + "per_1000_words": 0.0 + }, + "of course": { + "count": 1, + "per_1000_words": 0.26 + }, + "so i decided": { + "count": 1, + "per_1000_words": 0.26 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 1, + "per_1000_words": 0.26 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 1, + "per_1000_words": 0.26 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "Gift Inspo": { + "posts": 7, + "words": 1444, + "median_post_words": 104, + "mean_sentence_words": 21.88, + "median_paragraph_words": 13.0, + "pronouns": { + "first_person_singular": { + "count": 33, + "per_1000_words": 22.85 + }, + "first_person_plural": { + "count": 1, + "per_1000_words": 0.69 + }, + "second_person": { + "count": 23, + "per_1000_words": 15.93 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.0, + "exclamation_marks": 0.0 + }, + "structural_post_counts": { + "first_person_title": 3, + "question_title": 0, + "review_title": 0, + "shop_cue": 3, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 3, + "per_1000_words": 2.08 + }, + "loved": { + "count": 2, + "per_1000_words": 1.39 + }, + "favorite": { + "count": 5, + "per_1000_words": 3.46 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 1, + "per_1000_words": 0.69 + }, + "great": { + "count": 4, + "per_1000_words": 2.77 + }, + "beautiful": { + "count": 0, + "per_1000_words": 0.0 + }, + "cute": { + "count": 2, + "per_1000_words": 1.39 + }, + "luxury": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxurious": { + "count": 0, + "per_1000_words": 0.0 + }, + "glowing": { + "count": 0, + "per_1000_words": 0.0 + }, + "healthy": { + "count": 1, + "per_1000_words": 0.69 + }, + "natural": { + "count": 0, + "per_1000_words": 0.0 + }, + "organic": { + "count": 1, + "per_1000_words": 0.69 + }, + "personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "however": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall": { + "count": 0, + "per_1000_words": 0.0 + } + }, + "phrase_markers": { + "i love": { + "count": 1, + "per_1000_words": 0.69 + }, + "i loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "i like": { + "count": 0, + "per_1000_words": 0.0 + }, + "i think": { + "count": 1, + "per_1000_words": 0.69 + }, + "i feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "i recommend": { + "count": 0, + "per_1000_words": 0.0 + }, + "i personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 3, + "per_1000_words": 2.08 + }, + "one of my favorite": { + "count": 2, + "per_1000_words": 1.39 + }, + "for me": { + "count": 2, + "per_1000_words": 1.39 + }, + "of course": { + "count": 0, + "per_1000_words": 0.0 + }, + "so i decided": { + "count": 2, + "per_1000_words": 1.39 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 0, + "per_1000_words": 0.0 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 1, + "per_1000_words": 0.69 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "Interior Design": { + "posts": 8, + "words": 1113, + "median_post_words": 111.0, + "mean_sentence_words": 20.61, + "median_paragraph_words": 5.0, + "pronouns": { + "first_person_singular": { + "count": 59, + "per_1000_words": 53.01 + }, + "first_person_plural": { + "count": 2, + "per_1000_words": 1.8 + }, + "second_person": { + "count": 18, + "per_1000_words": 16.17 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.0, + "exclamation_marks": 0.0 + }, + "structural_post_counts": { + "first_person_title": 1, + "question_title": 0, + "review_title": 0, + "shop_cue": 4, + "reader_thanks": 1, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 8, + "per_1000_words": 7.19 + }, + "loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "favorite": { + "count": 3, + "per_1000_words": 2.7 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 2, + "per_1000_words": 1.8 + }, + "great": { + "count": 1, + "per_1000_words": 0.9 + }, + "beautiful": { + "count": 0, + "per_1000_words": 0.0 + }, + "cute": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxury": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxurious": { + "count": 0, + "per_1000_words": 0.0 + }, + "glowing": { + "count": 0, + "per_1000_words": 0.0 + }, + "healthy": { + "count": 0, + "per_1000_words": 0.0 + }, + "natural": { + "count": 0, + "per_1000_words": 0.0 + }, + "organic": { + "count": 0, + "per_1000_words": 0.0 + }, + "personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "however": { + "count": 1, + "per_1000_words": 0.9 + }, + "overall": { + "count": 0, + "per_1000_words": 0.0 + } + }, + "phrase_markers": { + "i love": { + "count": 5, + "per_1000_words": 4.49 + }, + "i loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "i like": { + "count": 0, + "per_1000_words": 0.0 + }, + "i think": { + "count": 1, + "per_1000_words": 0.9 + }, + "i feel": { + "count": 1, + "per_1000_words": 0.9 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.9 + }, + "i personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 3, + "per_1000_words": 2.7 + }, + "one of my favorite": { + "count": 1, + "per_1000_words": 0.9 + }, + "for me": { + "count": 0, + "per_1000_words": 0.0 + }, + "of course": { + "count": 2, + "per_1000_words": 1.8 + }, + "so i decided": { + "count": 1, + "per_1000_words": 0.9 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 0, + "per_1000_words": 0.0 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 3, + "per_1000_words": 2.7 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "Look Book": { + "posts": 36, + "words": 7751, + "median_post_words": 163.0, + "mean_sentence_words": 17.99, + "median_paragraph_words": 11, + "pronouns": { + "first_person_singular": { + "count": 189, + "per_1000_words": 24.38 + }, + "first_person_plural": { + "count": 5, + "per_1000_words": 0.65 + }, + "second_person": { + "count": 107, + "per_1000_words": 13.8 + } + }, + "punctuation_per_1000_words": { + "question_marks": 1.03, + "exclamation_marks": 1.29 + }, + "structural_post_counts": { + "first_person_title": 6, + "question_title": 0, + "review_title": 0, + "shop_cue": 19, + "reader_thanks": 6, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 24, + "per_1000_words": 3.1 + }, + "loved": { + "count": 1, + "per_1000_words": 0.13 + }, + "favorite": { + "count": 18, + "per_1000_words": 2.32 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 3, + "per_1000_words": 0.39 + }, + "great": { + "count": 11, + "per_1000_words": 1.42 + }, + "beautiful": { + "count": 0, + "per_1000_words": 0.0 + }, + "cute": { + "count": 3, + "per_1000_words": 0.39 + }, + "luxury": { + "count": 17, + "per_1000_words": 2.19 + }, + "luxurious": { + "count": 4, + "per_1000_words": 0.52 + }, + "glowing": { + "count": 0, + "per_1000_words": 0.0 + }, + "healthy": { + "count": 0, + "per_1000_words": 0.0 + }, + "natural": { + "count": 4, + "per_1000_words": 0.52 + }, + "organic": { + "count": 4, + "per_1000_words": 0.52 + }, + "personally": { + "count": 4, + "per_1000_words": 0.52 + }, + "however": { + "count": 8, + "per_1000_words": 1.03 + }, + "overall": { + "count": 3, + "per_1000_words": 0.39 + } + }, + "phrase_markers": { + "i love": { + "count": 13, + "per_1000_words": 1.68 + }, + "i loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "i like": { + "count": 1, + "per_1000_words": 0.13 + }, + "i think": { + "count": 4, + "per_1000_words": 0.52 + }, + "i feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.13 + }, + "i personally": { + "count": 2, + "per_1000_words": 0.26 + }, + "i have to say": { + "count": 1, + "per_1000_words": 0.13 + }, + "my favorite": { + "count": 15, + "per_1000_words": 1.94 + }, + "one of my favorite": { + "count": 6, + "per_1000_words": 0.77 + }, + "for me": { + "count": 3, + "per_1000_words": 0.39 + }, + "of course": { + "count": 0, + "per_1000_words": 0.0 + }, + "so i decided": { + "count": 0, + "per_1000_words": 0.0 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 0, + "per_1000_words": 0.0 + }, + "thanks so much for reading": { + "count": 4, + "per_1000_words": 0.52 + }, + "shop below": { + "count": 16, + "per_1000_words": 2.06 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "Masks": { + "posts": 51, + "words": 14422, + "median_post_words": 260, + "mean_sentence_words": 20.79, + "median_paragraph_words": 145, + "pronouns": { + "first_person_singular": { + "count": 820, + "per_1000_words": 56.86 + }, + "first_person_plural": { + "count": 24, + "per_1000_words": 1.66 + }, + "second_person": { + "count": 110, + "per_1000_words": 7.63 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.21, + "exclamation_marks": 0.14 + }, + "structural_post_counts": { + "first_person_title": 0, + "question_title": 2, + "review_title": 17, + "shop_cue": 47, + "reader_thanks": 29, + "numeric_rating": 20 + }, + "lexical_markers": { + "love": { + "count": 41, + "per_1000_words": 2.84 + }, + "loved": { + "count": 42, + "per_1000_words": 2.91 + }, + "favorite": { + "count": 11, + "per_1000_words": 0.76 + }, + "obsessed": { + "count": 3, + "per_1000_words": 0.21 + }, + "amazing": { + "count": 11, + "per_1000_words": 0.76 + }, + "great": { + "count": 15, + "per_1000_words": 1.04 + }, + "beautiful": { + "count": 5, + "per_1000_words": 0.35 + }, + "cute": { + "count": 1, + "per_1000_words": 0.07 + }, + "luxury": { + "count": 4, + "per_1000_words": 0.28 + }, + "luxurious": { + "count": 3, + "per_1000_words": 0.21 + }, + "glowing": { + "count": 13, + "per_1000_words": 0.9 + }, + "healthy": { + "count": 3, + "per_1000_words": 0.21 + }, + "natural": { + "count": 27, + "per_1000_words": 1.87 + }, + "organic": { + "count": 13, + "per_1000_words": 0.9 + }, + "personally": { + "count": 6, + "per_1000_words": 0.42 + }, + "however": { + "count": 28, + "per_1000_words": 1.94 + }, + "overall": { + "count": 37, + "per_1000_words": 2.57 + } + }, + "phrase_markers": { + "i love": { + "count": 59, + "per_1000_words": 4.09 + }, + "i loved": { + "count": 33, + "per_1000_words": 2.29 + }, + "i like": { + "count": 7, + "per_1000_words": 0.49 + }, + "i think": { + "count": 8, + "per_1000_words": 0.55 + }, + "i feel": { + "count": 5, + "per_1000_words": 0.35 + }, + "i recommend": { + "count": 0, + "per_1000_words": 0.0 + }, + "i personally": { + "count": 5, + "per_1000_words": 0.35 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 9, + "per_1000_words": 0.62 + }, + "one of my favorite": { + "count": 5, + "per_1000_words": 0.35 + }, + "for me": { + "count": 5, + "per_1000_words": 0.35 + }, + "of course": { + "count": 0, + "per_1000_words": 0.0 + }, + "so i decided": { + "count": 8, + "per_1000_words": 0.55 + }, + "had to try": { + "count": 5, + "per_1000_words": 0.35 + }, + "fell in love": { + "count": 3, + "per_1000_words": 0.21 + }, + "made my skin feel": { + "count": 3, + "per_1000_words": 0.21 + }, + "left my skin feeling": { + "count": 1, + "per_1000_words": 0.07 + }, + "overall i": { + "count": 22, + "per_1000_words": 1.53 + }, + "thanks so much for reading": { + "count": 16, + "per_1000_words": 1.11 + }, + "shop below": { + "count": 33, + "per_1000_words": 2.29 + }, + "click to shop": { + "count": 2, + "per_1000_words": 0.14 + } + } + }, + "Skincare": { + "posts": 112, + "words": 40616, + "median_post_words": 314.0, + "mean_sentence_words": 22.57, + "median_paragraph_words": 72.0, + "pronouns": { + "first_person_singular": { + "count": 2001, + "per_1000_words": 49.27 + }, + "first_person_plural": { + "count": 41, + "per_1000_words": 1.01 + }, + "second_person": { + "count": 337, + "per_1000_words": 8.3 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.1, + "exclamation_marks": 0.57 + }, + "structural_post_counts": { + "first_person_title": 5, + "question_title": 3, + "review_title": 65, + "shop_cue": 86, + "reader_thanks": 49, + "numeric_rating": 15 + }, + "lexical_markers": { + "love": { + "count": 152, + "per_1000_words": 3.74 + }, + "loved": { + "count": 56, + "per_1000_words": 1.38 + }, + "favorite": { + "count": 43, + "per_1000_words": 1.06 + }, + "obsessed": { + "count": 18, + "per_1000_words": 0.44 + }, + "amazing": { + "count": 41, + "per_1000_words": 1.01 + }, + "great": { + "count": 48, + "per_1000_words": 1.18 + }, + "beautiful": { + "count": 13, + "per_1000_words": 0.32 + }, + "cute": { + "count": 6, + "per_1000_words": 0.15 + }, + "luxury": { + "count": 8, + "per_1000_words": 0.2 + }, + "luxurious": { + "count": 13, + "per_1000_words": 0.32 + }, + "glowing": { + "count": 13, + "per_1000_words": 0.32 + }, + "healthy": { + "count": 20, + "per_1000_words": 0.49 + }, + "natural": { + "count": 74, + "per_1000_words": 1.82 + }, + "organic": { + "count": 55, + "per_1000_words": 1.35 + }, + "personally": { + "count": 37, + "per_1000_words": 0.91 + }, + "however": { + "count": 132, + "per_1000_words": 3.25 + }, + "overall": { + "count": 75, + "per_1000_words": 1.85 + } + }, + "phrase_markers": { + "i love": { + "count": 129, + "per_1000_words": 3.18 + }, + "i loved": { + "count": 37, + "per_1000_words": 0.91 + }, + "i like": { + "count": 39, + "per_1000_words": 0.96 + }, + "i think": { + "count": 29, + "per_1000_words": 0.71 + }, + "i feel": { + "count": 15, + "per_1000_words": 0.37 + }, + "i recommend": { + "count": 4, + "per_1000_words": 0.1 + }, + "i personally": { + "count": 26, + "per_1000_words": 0.64 + }, + "i have to say": { + "count": 19, + "per_1000_words": 0.47 + }, + "my favorite": { + "count": 30, + "per_1000_words": 0.74 + }, + "one of my favorite": { + "count": 16, + "per_1000_words": 0.39 + }, + "for me": { + "count": 28, + "per_1000_words": 0.69 + }, + "of course": { + "count": 3, + "per_1000_words": 0.07 + }, + "so i decided": { + "count": 11, + "per_1000_words": 0.27 + }, + "had to try": { + "count": 9, + "per_1000_words": 0.22 + }, + "fell in love": { + "count": 9, + "per_1000_words": 0.22 + }, + "made my skin feel": { + "count": 14, + "per_1000_words": 0.34 + }, + "left my skin feeling": { + "count": 11, + "per_1000_words": 0.27 + }, + "overall i": { + "count": 51, + "per_1000_words": 1.26 + }, + "thanks so much for reading": { + "count": 41, + "per_1000_words": 1.01 + }, + "shop below": { + "count": 75, + "per_1000_words": 1.85 + }, + "click to shop": { + "count": 3, + "per_1000_words": 0.07 + } + } + }, + "Travel": { + "posts": 7, + "words": 2811, + "median_post_words": 309, + "mean_sentence_words": 20.47, + "median_paragraph_words": 115, + "pronouns": { + "first_person_singular": { + "count": 51, + "per_1000_words": 18.14 + }, + "first_person_plural": { + "count": 9, + "per_1000_words": 3.2 + }, + "second_person": { + "count": 32, + "per_1000_words": 11.38 + } + }, + "punctuation_per_1000_words": { + "question_marks": 1.07, + "exclamation_marks": 0.71 + }, + "structural_post_counts": { + "first_person_title": 0, + "question_title": 0, + "review_title": 0, + "shop_cue": 1, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 1, + "per_1000_words": 0.36 + }, + "loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "favorite": { + "count": 2, + "per_1000_words": 0.71 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 1, + "per_1000_words": 0.36 + }, + "great": { + "count": 4, + "per_1000_words": 1.42 + }, + "beautiful": { + "count": 3, + "per_1000_words": 1.07 + }, + "cute": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxury": { + "count": 1, + "per_1000_words": 0.36 + }, + "luxurious": { + "count": 0, + "per_1000_words": 0.0 + }, + "glowing": { + "count": 0, + "per_1000_words": 0.0 + }, + "healthy": { + "count": 0, + "per_1000_words": 0.0 + }, + "natural": { + "count": 5, + "per_1000_words": 1.78 + }, + "organic": { + "count": 0, + "per_1000_words": 0.0 + }, + "personally": { + "count": 1, + "per_1000_words": 0.36 + }, + "however": { + "count": 4, + "per_1000_words": 1.42 + }, + "overall": { + "count": 6, + "per_1000_words": 2.13 + } + }, + "phrase_markers": { + "i love": { + "count": 1, + "per_1000_words": 0.36 + }, + "i loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "i like": { + "count": 1, + "per_1000_words": 0.36 + }, + "i think": { + "count": 1, + "per_1000_words": 0.36 + }, + "i feel": { + "count": 2, + "per_1000_words": 0.71 + }, + "i recommend": { + "count": 1, + "per_1000_words": 0.36 + }, + "i personally": { + "count": 1, + "per_1000_words": 0.36 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 2, + "per_1000_words": 0.71 + }, + "one of my favorite": { + "count": 1, + "per_1000_words": 0.36 + }, + "for me": { + "count": 0, + "per_1000_words": 0.0 + }, + "of course": { + "count": 1, + "per_1000_words": 0.36 + }, + "so i decided": { + "count": 1, + "per_1000_words": 0.36 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 0, + "per_1000_words": 0.0 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 1, + "per_1000_words": 0.36 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + }, + "Workouts/Diet": { + "posts": 7, + "words": 1264, + "median_post_words": 120, + "mean_sentence_words": 18.87, + "median_paragraph_words": 9, + "pronouns": { + "first_person_singular": { + "count": 69, + "per_1000_words": 54.59 + }, + "first_person_plural": { + "count": 0, + "per_1000_words": 0.0 + }, + "second_person": { + "count": 23, + "per_1000_words": 18.2 + } + }, + "punctuation_per_1000_words": { + "question_marks": 0.0, + "exclamation_marks": 0.79 + }, + "structural_post_counts": { + "first_person_title": 3, + "question_title": 0, + "review_title": 0, + "shop_cue": 2, + "reader_thanks": 0, + "numeric_rating": 0 + }, + "lexical_markers": { + "love": { + "count": 5, + "per_1000_words": 3.96 + }, + "loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "favorite": { + "count": 5, + "per_1000_words": 3.96 + }, + "obsessed": { + "count": 0, + "per_1000_words": 0.0 + }, + "amazing": { + "count": 0, + "per_1000_words": 0.0 + }, + "great": { + "count": 1, + "per_1000_words": 0.79 + }, + "beautiful": { + "count": 0, + "per_1000_words": 0.0 + }, + "cute": { + "count": 4, + "per_1000_words": 3.16 + }, + "luxury": { + "count": 0, + "per_1000_words": 0.0 + }, + "luxurious": { + "count": 0, + "per_1000_words": 0.0 + }, + "glowing": { + "count": 0, + "per_1000_words": 0.0 + }, + "healthy": { + "count": 2, + "per_1000_words": 1.58 + }, + "natural": { + "count": 0, + "per_1000_words": 0.0 + }, + "organic": { + "count": 1, + "per_1000_words": 0.79 + }, + "personally": { + "count": 1, + "per_1000_words": 0.79 + }, + "however": { + "count": 2, + "per_1000_words": 1.58 + }, + "overall": { + "count": 0, + "per_1000_words": 0.0 + } + }, + "phrase_markers": { + "i love": { + "count": 5, + "per_1000_words": 3.96 + }, + "i loved": { + "count": 0, + "per_1000_words": 0.0 + }, + "i like": { + "count": 2, + "per_1000_words": 1.58 + }, + "i think": { + "count": 1, + "per_1000_words": 0.79 + }, + "i feel": { + "count": 1, + "per_1000_words": 0.79 + }, + "i recommend": { + "count": 0, + "per_1000_words": 0.0 + }, + "i personally": { + "count": 0, + "per_1000_words": 0.0 + }, + "i have to say": { + "count": 0, + "per_1000_words": 0.0 + }, + "my favorite": { + "count": 4, + "per_1000_words": 3.16 + }, + "one of my favorite": { + "count": 0, + "per_1000_words": 0.0 + }, + "for me": { + "count": 1, + "per_1000_words": 0.79 + }, + "of course": { + "count": 0, + "per_1000_words": 0.0 + }, + "so i decided": { + "count": 0, + "per_1000_words": 0.0 + }, + "had to try": { + "count": 0, + "per_1000_words": 0.0 + }, + "fell in love": { + "count": 0, + "per_1000_words": 0.0 + }, + "made my skin feel": { + "count": 0, + "per_1000_words": 0.0 + }, + "left my skin feeling": { + "count": 0, + "per_1000_words": 0.0 + }, + "overall i": { + "count": 0, + "per_1000_words": 0.0 + }, + "thanks so much for reading": { + "count": 0, + "per_1000_words": 0.0 + }, + "shop below": { + "count": 2, + "per_1000_words": 1.58 + }, + "click to shop": { + "count": 0, + "per_1000_words": 0.0 + } + } + } + }, + "method_notes": [ + "Tokens are alphabetic words with internal apostrophes.", + "Sentence and paragraph boundaries are heuristic because historic posts mix prose and shopping lists.", + "Rates are normalized per 1,000 words; phrase counts are literal and case-insensitive.", + "Metrics describe the corpus and are evidence for editorial judgment, not a claim of sole authorship." + ] +} diff --git a/docs/continuations/charles/next-posts.md b/docs/continuations/charles/next-posts.md new file mode 100644 index 000000000..84827a814 --- /dev/null +++ b/docs/continuations/charles/next-posts.md @@ -0,0 +1,191 @@ +# Downs Style next-post slate + +**Immediate sequence:** cotton → silk → cotton versus silk. + +**Queued companion stories:** proper candle burning; Transcend Cosmetics becoming Transcend Essentials. + +These are editorial briefs, not finished drafts. Every factual claim remains open until researched, and every first-person experience remains open until Charles supplies it. + +## The recurring pop-up system + +Every substantive section should carry a small correction when a real misconception affects the choice. If research cannot show that a belief is a common myth, label the box **Common error** instead of inventing one. + +Each box uses the same four-beat form: + +1. **The mistaken idea** in one sentence. +2. **What is actually true** in two or three sourced sentences. +3. **Why the distinction matters** for the garment, product, or ritual. +4. **Charles's takeaway** in one practical sentence. + +Target 40–80 words plus a short primary or authoritative source link. The tone is Charles clearing up something useful, not a textbook scolding the reader. + +## Sequence 1 — cotton, all in one + +### Working title + +**Cotton Tops and Bottoms for Summer: What Kind Are You Actually Wearing?** + +### Editorial promise + +Start with the familiar summer instinct—reach for cotton—and reveal why the label alone does not tell Charles how the garment will feel. Separate the layers people collapse together: cotton species or staple claim, yarn, weave or knit, weight, finish, garment construction, and certification. + +### Movement + +1. Charles's summer-dressing hook: what he wants a top or bottom to do in heat. +2. The vocabulary stack: fiber is not fabric construction, and a marketing name is not automatically a quality grade. +3. Tops: compare relevant constructions and weights by feel, drape, opacity, airflow, and care. +4. Bottoms: compare relevant constructions and weights by structure, abrasion, recovery, and comfort. +5. Labels and sourcing: explain what a named cotton or certification can and cannot establish. +6. Care and longevity: the useful choice is also the one the reader can realistically wash and wear. +7. Charles's verdict: which cotton expression belongs in which summer garment, with no universal winner. + +### Pop-up research candidates + +- **Common error:** treating `100% cotton` as a complete prediction of coolness or comfort. +- **Common error:** treating Pima, Supima, and Egyptian cotton as interchangeable labels. +- **Myth to verify before using:** thread count alone establishes clothing quality. +- **Common error:** calling poplin, jersey, denim, or seersucker “types of cotton” without explaining that they describe construction rather than the fiber itself. +- **Common error:** assuming `natural` automatically proves a lower environmental impact. + +### Truth gate + +Use textile-science, standards, certification-owner, and manufacturer construction sources. Compare garments only after recording weight and construction; do not infer performance from fiber percentage alone. Sustainability claims need a defined boundary—water, chemistry, land, energy, durability, care, or end of life—rather than a universal green ranking. + +## Sequence 2 — silk gets its own post + +### Working title + +**Silk, Satin, and Charmeuse: What Are You Actually Buying?** + +### Editorial reaction + +Cotton proves that a fiber label is not the whole garment. Silk takes the same lesson somewhere more romantic: the vocabulary becomes even easier to confuse, and the care, drape, sheen, and use case matter as much as the word on the tag. + +### Movement + +1. Charles's first silk association and what he actually wants from the garment. +2. Fiber source and grade claims, carefully separated from weave, finish, and garment name. +3. Constructions relevant to tops, bottoms, sleepwear, linings, and occasion pieces. +4. Heat, moisture, opacity, friction, durability, and care—only where current evidence supports the comparison. +5. Price and longevity without pretending the most expensive option always wins. +6. Charles's use-case verdict. + +### Pop-up research candidates + +- **Common error:** using `satin` and `silk` as synonyms. +- **Common error:** putting mulberry, charmeuse, and satin on the same classification level. +- **Myth to verify before using:** silk is always too delicate or too warm for summer. +- **Common error:** treating a glossy photo as proof of fiber content or quality. +- **Common error:** repeating skin or hair benefits as medical fact without appropriate evidence. + +### Truth gate + +Keep fiber, construction, weight, finish, and care distinct. Treat brand language as attribution, not proof. Avoid universal skin, hair, thermoregulation, hypoallergenic, or sustainability claims. + +## Sequence 3 — who wins where? + +### Working title + +**Cotton vs. Silk: Who Wins Each Part of the Wardrobe?** + +### Editorial reaction + +The first two posts teach the materials separately. The finale lets them compete where readers actually make decisions: not “which fiber is better,” but which specific fabric construction earns which specific job. + +### Garment-by-garment scorecard + +- summer shirt or blouse; +- T-shirt or base layer; +- trousers and relaxed bottoms; +- underwear and close-to-body layers; +- sleepwear; +- lining; +- occasion shirt, dress, or matching set; +- travel piece; and +- long-wear everyday staple. + +Score only dimensions supported for the actual fabrics being compared: hand feel, drape, opacity, moisture behavior, abrasion, ease of care, repairability, price context, and expected use frequency. A fiber name by itself is not enough data. + +### Pop-up research candidates + +- **Myth to verify before using:** one fiber can win every garment category. +- **Common error:** comparing a lightweight silk weave with heavy cotton twill and attributing every difference to fiber. +- **Common error:** treating `natural` as synonymous with sustainable, ethical, or biodegradable in every real-world condition. +- **Common error:** making a body-comfort or skin-benefit promise universal. + +### Ending + +Do not recap cotton and then recap silk. Give Charles a reactive wardrobe: cotton wins one job, which exposes the condition under which silk takes the next, until each garment has a reasoned choice. End with the surprising trade—where Charles expected one material to win but the construction changed his verdict—only if the research and his actual reaction support it. + +## Queued post — how to properly let a candle burn + +### Working title + +**How to Properly Let a Candle Burn—Without Wasting the Wax** + +### Charles angle + +The archive already contains 18 candle posts, so this should feel like the useful ritual behind an established obsession. Begin with the moment a beautiful candle tunnels, smokes, or burns unevenly, then separate first-burn folklore from instructions that depend on the vessel, wax, wick, and manufacturer. + +### Movement + +1. Before lighting: vessel, surface, wick, room, and label. +2. The first burn: what the manufacturer specifies and why blanket hour rules are risky. +3. During the burn: flame, soot, wick behavior, drafts, and safe supervision. +4. Between burns: extinguishing, cooling, trimming, centering, and storage. +5. When to stop: end-of-life and damaged-vessel safety. +6. Charles's ritual and verdict, supplied by Charles rather than invented. + +### Pop-up research candidates + +- **Myth to verify before using:** every first burn must last the same fixed number of hours. +- **Common error:** using the wax pool alone while ignoring the maker's maximum burn time. +- **Common error:** trimming, moving, or recentering a hot candle. +- **Common error:** treating a very large flame or visible soot as normal because the candle is expensive. + +### Truth gate + +Safety outranks voice. Use current fire-safety, consumer-safety, and manufacturer instructions; quote no universal timing that the source does not support. Never suggest leaving a flame unattended or improvising around a cracked or overheated vessel. + +## Queued post — Transcend Cosmetics becomes Transcend Essentials + +### Working title + +**Why Transcend Cosmetics Became Transcend Essentials** + +### Charles angle + +This is a founder story, not a press release. The emotional center is the moment the old name stopped holding the whole idea and `Essentials` became more truthful. The article should sound like Charles recognizing the brand more clearly, with specifics about what changed and what stayed. + +### Founder facts required before drafting + +- the original promise behind Transcend Cosmetics; +- the event or accumulated insight that made the name too narrow; +- what `Essentials` means in Charles's own words; +- the exact change date and public rollout sequence; +- products, categories, audience, ownership, and values that changed; +- products, categories, audience, ownership, and values that did not change; and +- what the new name permits next without announcing an unsupported roadmap. + +### Movement + +1. The original name and the need it served. +2. The point where the brand became larger than `Cosmetics`. +3. Why `Essentials` is the precise new container. +4. What customers will notice now. +5. What loyal customers should understand has not been discarded. +6. Charles's invitation into the next chapter. + +### Pop-up system + +Use **What changed / What did not** cards rather than manufactured myths. One useful correction can address the common assumption that a rebrand is only a name or logo change—but only after Charles's confirmed facts show the deeper change. Do not invent motives, dates, customer reactions, or future products. + +## Series-level acceptance test + +- Cotton stands alone, silk stands alone, and the comparison uses both rather than repeating them. +- The third post decides garment by garment or body placement by body placement; it never names a universal fiber winner. +- Every substantive section has a sourced Myth or Common error pop-up when one genuinely exists. +- Charles's personal reactions come from Charles. +- Material categories are technically separated before they are compared. +- No medical promise, universal-suitability claim, unsupported sustainability claim, stale price, or invented performance result survives the fact check. +- Each post moves from a human hook through evidence and a real drawback to Charles's use-case verdict. diff --git a/docs/continuations/charles/rose-toners-share/.gitignore b/docs/continuations/charles/rose-toners-share/.gitignore new file mode 100644 index 000000000..23eba4123 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/.gitignore @@ -0,0 +1,50 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/.vinext/ +/out/ + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +next-env.d.ts +/dist/ +/.wrangler/ +/outputs/ +/work/ + +# Source helper required by vite.config.ts (the repository root ignores build/). +!/build/ +!/build/sites-vite-plugin.ts + +# Editorial artwork is source input, even though the global ignore excludes public/. +!/public/ +!/public/*.png diff --git a/docs/continuations/charles/rose-toners-share/.openai/hosting.json b/docs/continuations/charles/rose-toners-share/.openai/hosting.json new file mode 100644 index 000000000..9f88ffe2c --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/.openai/hosting.json @@ -0,0 +1,5 @@ +{ + "project_id": "appgprj_6a6f989f3d908191aa52562e2f0c212d", + "d1": null, + "r2": null +} diff --git a/docs/continuations/charles/rose-toners-share/README.md b/docs/continuations/charles/rose-toners-share/README.md new file mode 100644 index 000000000..a47f91284 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/README.md @@ -0,0 +1,46 @@ +# Downs Style Studio + +A private, shareable editorial studio for Charles Downs. It brings the complete +public Downs Style history, an evidence-backed voice system, and the current +rosewater article into one coherent review surface. + +## Pages + +- `/` — the six-product rosewater article, including Fresh and its affiliate disclosure +- `/archive` — all 258 public posts, searchable and filterable by category and year +- `/voice` — the corpus → Natural Center → channel-profile voice architecture +- `/compare` — the preserved three-panel rosewater draft comparison + +The archive stores public metadata only: publication date, year, category, +title, canonical Downs Style URL, author, and word count. Article bodies and raw +tags are deliberately excluded. + +## Prerequisites + +- Node.js `>=22.13.0` + +## Quick Start + +```bash +npm install +npm run dev +npm run build +``` + +This starter does not use `wrangler.jsonc`. + +## Project shape + +- `app/` contains the article, archive, voice, comparison, and shared navigation +- `data/posts.json` is the bounded 258-record public ledger +- `tests/rendered-html.test.mjs` verifies complete server-rendered routes and data integrity +- `.openai/hosting.json` preserves the existing Sites project identity + +## Useful Commands + +- `npm run dev`: start local development +- `npm run build`: verify the vinext build output +- `npm test`: build and verify all four rendered routes plus archive integrity + +The studio is a review artifact. It does not modify or publish the live +Squarespace site. diff --git a/docs/continuations/charles/rose-toners-share/app/archive/archive-explorer.tsx b/docs/continuations/charles/rose-toners-share/app/archive/archive-explorer.tsx new file mode 100644 index 000000000..753ef6449 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/app/archive/archive-explorer.tsx @@ -0,0 +1,180 @@ +"use client"; + +import { useMemo, useState } from "react"; + +export type ArchivePost = { + publishedDate: string; + year: string; + category: string; + title: string; + url: string; + author: string; + wordCount: number; +}; + +type CategoryCount = { + label: string; + count: number; +}; + +const monthNames = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +]; + +function formatDate(value: string) { + const [year, month, day] = value.split("-").map(Number); + return `${monthNames[month - 1]} ${day}, ${year}`; +} + +export function ArchiveExplorer({ + posts, + categories, + years, +}: { + posts: ArchivePost[]; + categories: CategoryCount[]; + years: string[]; +}) { + const [query, setQuery] = useState(""); + const [category, setCategory] = useState("All"); + const [year, setYear] = useState("All"); + + const filteredPosts = useMemo(() => { + const needle = query.trim().toLocaleLowerCase(); + return posts.filter((post) => { + const matchesQuery = + !needle || + `${post.title} ${post.category}`.toLocaleLowerCase().includes(needle); + const matchesCategory = + category === "All" || post.category === category; + const matchesYear = year === "All" || post.year === year; + return matchesQuery && matchesCategory && matchesYear; + }); + }, [category, posts, query, year]); + + const resetFilters = () => { + setQuery(""); + setCategory("All"); + setYear("All"); + }; + + return ( +
+
+ + + + +
+ {filteredPosts.length} + {filteredPosts.length === 1 ? "post" : "posts"} in view +
+
+ +
+ + {categories.map((item) => ( + + ))} +
+ +
+
+

The complete public record

+

Every post, newest first.

+
+ {query || category !== "All" || year !== "All" ? ( + + ) : null} +
+ + {filteredPosts.length ? ( +
+ {filteredPosts.map((post, index) => ( +
+ + {String(index + 1).padStart(3, "0")} + +
+

+ {post.category} + +

+

+ + {post.title} + + +

+
+ + {post.wordCount.toLocaleString("en-US")} words + +
+ ))} +
+ ) : ( +
+

No post matches that combination yet.

+ +
+ )} +
+ ); +} diff --git a/docs/continuations/charles/rose-toners-share/app/archive/page.tsx b/docs/continuations/charles/rose-toners-share/app/archive/page.tsx new file mode 100644 index 000000000..320320dd0 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/app/archive/page.tsx @@ -0,0 +1,119 @@ +import type { Metadata } from "next"; +import postsData from "../../data/posts.json"; +import { SiteHeader } from "../site-header"; +import { ArchiveExplorer, type ArchivePost } from "./archive-explorer"; + +export const metadata: Metadata = { + title: "The complete archive | Downs Style Studio", + description: + "Search and filter all 258 public Downs Style posts by Charles Downs, spanning skincare, candles, clothing, travel, food, interiors, and wellness.", + openGraph: { + title: "The complete Downs Style archive", + description: + "258 posts, nine editorial categories, and the full public history from 2017 onward.", + images: [ + { + url: "/og-archive.png", + width: 1672, + height: 941, + alt: "Downs Style Studio archive and voice system", + }, + ], + }, + twitter: { + card: "summary_large_image", + images: ["/og-archive.png"], + }, +}; + +const posts: ArchivePost[] = postsData.map((post) => ({ + publishedDate: post.publishedDate, + year: post.year, + category: post.category, + title: post.title, + url: post.url, + author: post.author, + wordCount: post.wordCount, +})); + +const categoryCounts = Array.from( + posts.reduce((counts, post) => { + counts.set(post.category, (counts.get(post.category) ?? 0) + 1); + return counts; + }, new Map()), +) + .map(([label, count]) => ({ label, count })) + .sort((left, right) => right.count - left.count); + +const years = Array.from(new Set(posts.map((post) => post.year))).sort( + (left, right) => Number(right) - Number(left), +); + +export default function ArchivePage() { + return ( +
+ + +
+
+

Downs Style · 2017—2026

+

+ The whole history, + finally in one room. +

+

+ Every public post by Charles Downs is here: 258 pieces across nine + editorial worlds. Search a subject, enter a category, or follow the + chronology all the way back to the first candle story. +

+
+ +
+
+
Public posts
+
258
+
+
+
Editorial categories
+
09
+
+
+
Calendar span
+
10
+
+
+
+ +
+
+ Latest · August 2, 2026 +

Rose Water and the benefits behind our favorite flower

+
+
+ Where it began · December 4, 2017 +

My Favorite Candles of the Year

+
+
+ + + + +
+ ); +} diff --git a/docs/continuations/charles/rose-toners-share/app/chatgpt-auth.ts b/docs/continuations/charles/rose-toners-share/app/chatgpt-auth.ts new file mode 100644 index 000000000..a0ae2ed9a --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/app/chatgpt-auth.ts @@ -0,0 +1,90 @@ +import { headers } from "next/headers"; +import { redirect } from "next/navigation"; + +export type ChatGPTUser = { + userId: string; + displayName: string; + email: string; + fullName: string | null; +}; + +const USER_ID_HEADER = "oai-authenticated-user-id"; +const USER_EMAIL_HEADER = "oai-authenticated-user-email"; +const USER_FULL_NAME_HEADER = "oai-authenticated-user-full-name"; +const USER_FULL_NAME_ENCODING_HEADER = + "oai-authenticated-user-full-name-encoding"; +const PERCENT_ENCODED_UTF8 = "percent-encoded-utf-8"; +const SIGN_IN_PATH = "/signin-with-chatgpt"; +const SIGN_OUT_PATH = "/signout-with-chatgpt"; +const CALLBACK_PATH = "/callback"; + +export async function getChatGPTUser(): Promise { + const requestHeaders = await headers(); + const userId = requestHeaders.get(USER_ID_HEADER); + const email = requestHeaders.get(USER_EMAIL_HEADER); + if (!userId || !email) return null; + + const encodedFullName = requestHeaders.get(USER_FULL_NAME_HEADER); + const fullName = + encodedFullName && + requestHeaders.get(USER_FULL_NAME_ENCODING_HEADER) === PERCENT_ENCODED_UTF8 + ? safeDecodeURIComponent(encodedFullName) + : null; + + return { + userId, + displayName: fullName ?? email, + email, + fullName, + }; +} + +export async function requireChatGPTUser( + returnTo: string, +): Promise { + const user = await getChatGPTUser(); + if (user) return user; + + redirect(chatGPTSignInPath(returnTo)); +} + +export function chatGPTSignInPath(returnTo: string): string { + const safeReturnTo = safeRelativeReturnPath(returnTo); + return `${SIGN_IN_PATH}?return_to=${encodeURIComponent(safeReturnTo)}`; +} + +export function chatGPTSignOutPath(returnTo = "/"): string { + const safeReturnTo = safeRelativeReturnPath(returnTo); + return `${SIGN_OUT_PATH}?return_to=${encodeURIComponent(safeReturnTo)}`; +} + +function safeRelativeReturnPath(value: string): string { + if (!value.startsWith("/") || value.startsWith("//")) return "/"; + + let url: URL; + try { + url = new URL(value, "https://app.local"); + } catch { + return "/"; + } + if (url.origin !== "https://app.local") return "/"; + if (isReservedAuthPath(url.pathname)) return "/"; + + return `${url.pathname}${url.search}${url.hash}`; +} + +function isReservedAuthPath(pathname: string): boolean { + return ( + pathname === SIGN_IN_PATH || + pathname === SIGN_OUT_PATH || + pathname === CALLBACK_PATH + ); +} + +function safeDecodeURIComponent(value: string): string | null { + try { + return decodeURIComponent(value); + } catch { + return null; + } +} diff --git a/docs/continuations/charles/rose-toners-share/app/compare/page.tsx b/docs/continuations/charles/rose-toners-share/app/compare/page.tsx new file mode 100644 index 000000000..33a20a8ab --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/app/compare/page.tsx @@ -0,0 +1,424 @@ +import type { Metadata } from "next"; +import Link from "next/link"; +import { SiteHeader } from "../site-header"; + +export const metadata: Metadata = { + title: "Compare the rosewater drafts | Downs Style Studio", + description: + "Read the original, human, and edited rosewater drafts side by side, with every editorial decision in view.", + openGraph: { + title: "One ingredient. Three versions.", + description: + "A complete three-panel editorial comparison for the Downs Style rosewater story.", + images: [ + { + url: "/og-comparison.png", + width: 1536, + height: 804, + alt: "Three versions of the Downs Style rosewater article", + }, + ], + }, + twitter: { + card: "summary_large_image", + images: ["/og-comparison.png"], + }, +}; + +type ComparisonSection = { + id: string; + number: string; + title: string; + original: string; + human: string; + edited: string; + decision: string; +}; + +function thoughtClusters(...clusters: string[]) { + return clusters.join("\n\n"); +} + +const sections: ComparisonSection[] = [ + { + id: "title", + number: "00", + title: "Article title", + original: + "Rose Toners and the Benefits Behind Our Favorite Scent", + human: + "Rose Toners and the Benefits Behind Our Favorite Scent", + edited: + "Rosewater and the Benefits Behind Our Favorite Flower", + decision: + "Applied the newer spoken title: rosewater is now the searchable subject, while favorite flower keeps the warmth Charles approved. Benefits remain carefully qualified in the article.", + }, + { + id: "opening", + number: "01", + title: "Seasonal opening", + original: + "With summer upon us here, the sweltering heat has left our skin with the need for some consistent refreshment, perhaps you noticed the heat making your usual skin care routine a bit futile in the face of this extreme weather we’re facing. If this is the case then here we offer an oasis of skincare that we think will help you cope with this unruly weather.", + human: + "With summer upon us here, the sweltering heat has left our skin with the need for some consistent refreshment, perhaps you noticed the heat making your usual skin care routine a bit futile in the face of this extreme weather we’re facing. If this is the case then here we offer an oasis of skincare that we think will help you cope with this unruly weather.", + edited: thoughtClusters( + "With summer upon us, the sweltering heat has left our skin in need of some consistent refreshment.", + "Perhaps you have noticed the heat making your usual skincare routine feel a bit futile in the face of this extreme weather.", + "If this is the case, then here we offer an oasis of skincare that we think will help you cope with this unruly weather.", + "Rose has always been one of our favorite skincare ingredients, partly because it smells wonderful and partly because it makes an ordinary face mist feel a little more special.", + "The scent gets our attention, but the formula is what makes us stay.", + "Mario Badescu keeps the flower light and familiar, whereas Whamisa turns it into a toner so rich it is almost pretending to be a serum.", + "Then Chantecaille takes the drama away again and leaves us with two ingredients, only for Fresh to bring the whole toner ritual roaring back. Same favorite flower, completely different personalities.", + ), + decision: + "Kept Charles's season, we/our perspective, affection for rose, and slightly dramatic reactions. The new sentences still answer one another, but they now sound like his original introduction instead of an editor's summary.", + }, + { + id: "rosewater-note", + number: "02", + title: "Why rosewater belongs here", + original: "", + human: "", + edited: thoughtClusters( + "So why does rosewater keep finding its way back into our routines?", + "It is the fragrant water collected when rose petals are distilled, which helps explain why it is more interesting than perfumed tap water.", + "Laboratory studies have measured antioxidant activity in rose distillation products, which sounds extremely glamorous.", + "Still, that result belongs to the material studied and not automatically to every pink bottle on a shelf.", + "The type of rose matters, but so do the way it was distilled and the amount inside; after that, every other ingredient gets a chance to help the flower or completely crowd it out.", + "Rose starts the story, but the whole bottle gets the final word.", + ), + decision: + "Kept the evidence and its limitation, but translated the textbook language into Charles's habit of getting excited and then checking himself with an honest aside.", + }, + { + id: "mario", + number: "03", + title: "Mario Badescu", + original: + "Mario Badescu’s Facial Spray With Aloe, Herbs And Rosewater\n\nIf you had any sort of affliction with skincare like we did in the late 2010’s then you already know about Mario Badescu’s iconic skincare products. From your favorite celebrities to your next door neighbors someone you knew owned at least one of their products (if not this toner specifically) . Not without good cause of course, their au natural formulation was the much needed counter balance to the heavy makeup looks frequently worn in that era. We love this product for its rejuvenating effect on the skin which is due to its Bladderwrack (Seaweed) Extract, this ingredient is known for nourishing and hydrating skin, it’s said to improve evenness in overall skin tone and help with skin texture. With the sweet subtle aroma of the Damascan rose flower water this product features alongside aloe vera which contains anti inflammatory properties its easy to see why this is one of our summertime essentials.", + human: + "Mario Badescu’s Facial Spray With Aloe, Herbs And Rosewater\n\nIf you had any sort of affliction with skincare like we did in the late 2010’s then you already know about Mario Badescu’s iconic skincare products. From your favorite celebrities to your next door neighbors someone you knew owned at least one of their products (if not this toner specifically) . Not without good cause of course, their au natural formulation was the much needed counter balance to the heavy makeup looks frequently worn in that era. We love this product for its rejuvenating effect on the skin which is due to its Bladderwrack (Seaweed) Extract, this ingredient is known for nourishing and hydrating skin, it’s said to improve evenness in overall skin tone and help with skin texture. With the sweet subtle aroma of the Damascan rose flower water this product features alongside aloe vera which contains anti inflammatory properties its easy to see why this is one of our summertime essentials.", + edited: thoughtClusters( + "Mario Badescu Facial Spray With Aloe, Herbs And Rosewater", + "If you had any sort of affliction with skincare like we did in the late 2010s, then you already know this bottle. From your favorite celebrities to your next-door neighbor, someone you knew owned at least one Mario Badescu product, if not this one specifically.", + "Not without good cause, of course. Rosewater and aloe give the facial spray the light, refreshing personality we all remember, while the supporting botanicals keep it from feeling like plain floral water.", + "The nostalgia is real, although it cannot answer what is in the bottle now. The current label lists Red 40 and Yellow 5, which does not need to become a medical panic to be worth mentioning.", + "If you want a dye-free mist, this romance ends here; if you do not, the bottle is still very easy to understand. We just cannot call the formula all-natural anymore.", + ), + decision: + "Restored the original affliction, celebrity-to-neighbor scale, and Not without good cause aside. Unsupported treatment claims still came out, while the current dye disclosure stays factual and calm.", + }, + { + id: "whamisa", + number: "04", + title: "Whamisa", + original: + "Whamsica organic’s Organic Flowers Toner Deep Rich\n\nThis South Korean brand has been on our radar this last year for many reasons...", + human: + "Whamsica organic’s Organic Flowers Toner Deep Rich\n\nThis South Korean brand has been on our radar for its botanical formulas and thoughtful packaging. Instead of beginning with water, this toner uses an aloe vera extract base, then adds glycerin and a fermented complex of rosebud, calendula, dandelion, hibiscus, jasmine, lavender, chamomile, and lotus. The texture is rich, bouncy, and closer to a thin serum than the watery toners many of us grew up using. The drawback is also part of its personality: rosewood, bergamot, bitter orange, Damask rose, and geranium oils give it a full essential-oil bouquet. Choose this when you want cushion and scent, not a barely-there, fragrance-minimal step.", + edited: thoughtClusters( + "Whamisa Organic Flowers Toner Deep Rich", + "Whamisa does not even try to be Mario. This toner begins with an aloe base, which gives it a rich, bouncy texture much closer to a thin serum than the watery toners many of us grew up using.", + "The fermented flower complex makes the formula even more interesting, but the real surprise is that all of that richness does not stay quiet.", + "Several essential oils make the Damask rose smell full and obvious, which is fun when you want skincare to feel like an actual event.", + "That same bouquet may be too much if you want a fragrance-minimal step; then again, a whisper was clearly never the point.", + ), + decision: + "Treated the phone-call comment as criticism: removed the brand-site language and ingredient inventory, kept the texture Charles liked, and restored his excited reaction before admitting the scent drawback.", + }, + { + id: "santa-maria-novella", + number: "05", + title: "Santa Maria Novella", + original: "", + human: "", + edited: thoughtClusters( + "Santa Maria Novella Acqua di Rose", + "Whamisa makes rose feel modern and fermented, whereas Santa Maria Novella makes it feel as though we should be applying it in a Florentine apothecary.", + "The brand says Acqua di Rose has been documented at its Officina since 1381, which is so old it almost makes the rest of our routines look impatient.", + "Distilled Damask rose water keeps the flower at the center of that history. History is romantic, but it does not make the formula minimal.", + "Added fragrance and fragrant rose components turn this into the full apothecary experience, so we would choose it for the ritual rather than pretend it is a modern, active-driven treatment.", + ), + decision: + "Added the missing heritage option in Charles's delighted, personal register, while still attributing the history to the brand and disclosing fragrance instead of repeating old medicinal claims.", + }, + { + id: "chantecaille", + number: "06", + title: "Chantecaille", + original: "", + human: + "Chantecaille Pure Rosewater\n\nChantecaille offers a great choice out of the group with a two-ingredient list: Rose de Mai flower water and lactobacillus ferment. The brand steam-distills the whole Rose de Mai blossom in artesian well water in the South of France, giving this mist its naturally rosy aroma. We like the clarity of knowing exactly what is in the bottle. Still, this is a light mist, not a substantial lotion, so it may feel almost too simple if you want a toner with a richer texture or a broader botanical blend.", + edited: thoughtClusters( + "Chantecaille Pure Rosewater", + "After nearly seven centuries of history, Chantecaille makes two ingredients feel almost rebellious.", + "Pure Rosewater pairs Rose de Mai flower water with lactobacillus ferment, and that is actually the entire formula.", + "The brand steam-distills the whole blossom in artesian well water in the South of France, so the aroma comes from the rose rather than an added fragrance blend.", + "We love knowing exactly what is in the bottle, although that clarity can feel almost suspiciously simple when you expect a toner to bring more texture.", + "If a simple formula makes you super excited, this is probably the one; if you want something more substantial, two ingredients may feel almost too simple.", + ), + decision: + "Kept the two-ingredient fact, but framed it through Charles's genuine excitement and a playful qualification rather than a bare inventory.", + }, + { + id: "sisley", + number: "07", + title: "Sisley-Paris", + original: "", + human: + "Sisley-Paris Floral Toning Lotion\n\nSisley-Paris lands on the traditional side with a classic wipe-on lotion made with rose, cornflower, and witch-hazel floral waters. It is the option for anyone who likes the familiar feeling of finishing a cleanse with a cotton pad before moving on to serum and moisturizer.", + edited: thoughtClusters( + "Sisley-Paris Floral Toning Lotion", + "If Chantecaille makes two ingredients feel exciting, Sisley-Paris has no interest in stopping there.", + "Rose opens the formula, but cornflower and witch-hazel floral waters turn it into the kind of classic wipe-on lotion that finishes a cleanse before serum and moisturizer.", + "That fuller formula is less minimal, although that is not automatically an insult. Some routines want a light mist, while others want the familiar satisfaction of a cotton pad.", + "Fragrance comes along with that traditional experience because Sisley was clearly not trying to be shy either.", + ), + decision: + "Retained the traditional toner framing and added the missing fragrance disclosure and comparison point.", + }, + { + id: "fresh", + number: "08", + title: "Fresh", + original: "Not present in Charles's original draft.", + human: "Not present in Charles's original draft.", + edited: thoughtClusters( + "Fresh Rose Deep Hydration Facial Toner", + "If Sisley-Paris is the toner for someone who misses a cotton pad, Fresh is what happens when that same ritual wants to look a little more romantic.", + "The current formula combines Damask rose water and extracts with glycerin and hyaluronic acid, so the hydration story is more built out than the floral waters before it.", + "That fullness is also the drawback: rose flower oil and fragrant rose components make this a very committed rose bottle, not a minimal one pretending to be invisible.", + "Choose it when you want the flower and the toner step to feel equally obvious; click the photo to inspect the full formula or shop the bottle.", + ), + decision: + "Added the supplied sixth product after Sisley-Paris and kept the reaction connected: the cotton-pad ritual returns with more hydration, more romance, and a clearer fragrance drawback.", + }, + { + id: "affiliate-disclosure", + number: "09", + title: "Affiliate disclosure", + original: "Not present in Charles's original draft.", + human: "Not present in Charles's original draft.", + edited: thoughtClusters( + "Affiliate disclosure: This post contains an affiliate link. If you buy through it, Downs Style may earn a commission at no extra cost to you. As an Amazon Associate I earn from qualifying purchases.", + "Paid link — Downs Style may earn a commission if you shop this product", + ), + decision: + "Placed the general disclosure before every shopping link and the paid-link notice directly beside Fresh, where the reader makes the shopping decision.", + }, + { + id: "closing", + number: "10", + title: "Closing comparison", + original: "", + human: + "So, which rose is for you? Mario Badescu is the nostalgic mist, with a clear dye caveat. Whamisa is the rich, fermented, essential-oil bouquet. Santa Maria Novella brings Damask rose and centuries of apothecary history. Chantecaille keeps things to two ingredients, while Sisley-Paris gives us the most traditional floral-toner experience. We will keep testing the bottles that make skincare feel less like a chore and more like a small daily ritual, so come back for more honest skincare reviews soon.", + edited: thoughtClusters( + "By now, the right rose is probably obvious: the bottle whose drawback annoys you the least and whose personality sounds the most like your own.", + "If the late-2010s nostalgia still has you, the Mario Badescu photo is worth one more click so you can look at the current formula yourself before deciding whether the dyes end the romance.", + "Whamisa answers that light little mist with a toner that almost behaves like a serum, which makes its photo the one to click when you want to see whether the aloe base and fermented flowers are rich enough to earn an extra step.", + "That modern richness makes Santa Maria Novella feel even more old-world by comparison; click its photo for the Damask-rose apothecary ritual, because sometimes the ritual is honestly the entire point.", + "Chantecaille takes the drama away again and gives minimalists a very good reason to click its photo: two ingredients, Rose de Mai, and nowhere for the formula to hide.", + "Sisley-Paris brings us back to the traditional toner, so its photo is the one to open if rose, cornflower, witch hazel, and a cotton pad sound more satisfying than another mist.", + "Fresh makes that traditional step feel a little more romantic again, so its photo is the one to click if glycerin, hyaluronic acid, and a very committed rose formula sound like your kind of finale.", + "To shop, click any product photo above. Each of the six goes straight to the same product page we used while reviewing it, so you can compare the formulas for yourself before choosing—and then come back, because we will keep testing the bottles that make skincare feel less like a chore and more like a small daily ritual.", + ), + decision: + "Removed the product-by-product recap and replaced it with one continuous sequence in which each bottle answers the last, then carried Fresh through the final invitation as the sixth and final reaction.", + }, +]; + +type DiffPart = { + type: "same" | "added" | "removed"; + value: string; +}; + +function tokenize(text: string) { + return text.match(/\s+|[\p{L}\p{N}’'-]+|[^\s]/gu) ?? []; +} + +function diffWords(before: string, after: string): DiffPart[] { + const left = tokenize(before); + const right = tokenize(after); + const rows = left.length + 1; + const columns = right.length + 1; + const matrix = Array.from({ length: rows }, () => + Array(columns).fill(0), + ); + + for (let i = left.length - 1; i >= 0; i -= 1) { + for (let j = right.length - 1; j >= 0; j -= 1) { + matrix[i][j] = + left[i] === right[j] + ? matrix[i + 1][j + 1] + 1 + : Math.max(matrix[i + 1][j], matrix[i][j + 1]); + } + } + + const parts: DiffPart[] = []; + const push = (type: DiffPart["type"], value: string) => { + const previous = parts.at(-1); + if (previous?.type === type) previous.value += value; + else parts.push({ type, value }); + }; + + let i = 0; + let j = 0; + while (i < left.length && j < right.length) { + if (left[i] === right[j]) { + push("same", left[i]); + i += 1; + j += 1; + } else if (matrix[i + 1][j] >= matrix[i][j + 1]) { + push("removed", left[i]); + i += 1; + } else { + push("added", right[j]); + j += 1; + } + } + while (i < left.length) push("removed", left[i++]); + while (j < right.length) push("added", right[j++]); + return parts; +} + +function DraftText({ text }: { text: string }) { + if (!text) { + return ( +

+ Not written yet + This section was absent from this version. +

+ ); + } + + return

{text}

; +} + +function EditedDiff({ before, after }: { before: string; after: string }) { + const parts = diffWords(before, after); + return ( +

+ {parts.map((part, index) => { + if (part.type === "added") { + return {part.value}; + } + if (part.type === "removed") { + return {part.value}; + } + return {part.value}; + })} +

+ ); +} + +export default function CompareDrafts() { + return ( +
+ + +
+

Rose as an ingredient · Three-panel comparison

+

+ One ingredient. Three versions. + Every change in view. +

+
+

+ Read each section left to right: the unfinished snapshot we first + received, the human copy currently live on Downs Style, and the + proposed ingredient-led edit with every insertion and deletion + marked—including the new title. The added white space is also an + edit: each paragraph now holds one long sentence or one short, + connected thought cluster. +

+ + See the changes + +
+
+ +
+ + + {sections.map((section) => ( +
+
+ {section.number} +

{section.title}

+
+ +
+

Original draft

+ +
+ +
+

Human draft

+ +
+ +
+

All edits

+ + +
+
+ ))} +
+ +
+

Ready to review

+

The full edited story is on page one.

+

+ The comparison stays attached so Charles can approve the voice, + verify the ingredient-first language, and see exactly what was + retained. +

+ + Read the finished article + +
+ + +
+ ); +} diff --git a/docs/continuations/charles/rose-toners-share/app/globals.css b/docs/continuations/charles/rose-toners-share/app/globals.css new file mode 100644 index 000000000..745bd905f --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/app/globals.css @@ -0,0 +1,2313 @@ +@import "tailwindcss"; + +:root { + --ink: #2c201e; + --muted: #746560; + --paper: #fbf7f0; + --paper-deep: #f3e9df; + --rose: #a94354; + --rose-dark: #78313f; + --petal: #e5b9b5; + --line: rgb(92 58 52 / 0.18); +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + margin: 0; + color: var(--ink); + background: + radial-gradient(circle at 95% 5%, rgb(225 176 178 / 0.28), transparent 22rem), + var(--paper); + font-family: var(--font-sans), sans-serif; + text-rendering: optimizeLegibility; +} + +body::before { + position: fixed; + z-index: 20; + top: 0; + right: 0; + left: 0; + height: 3px; + background: linear-gradient(90deg, var(--rose-dark), var(--petal), #d79b73); + content: ""; +} + +a { + color: inherit; + text-decoration: none; +} + +img { + display: block; + width: 100%; +} + +::selection { + color: #fff; + background: var(--rose-dark); +} + +.site-header { + position: relative; + z-index: 10; + display: flex; + width: min(92vw, 1440px); + min-height: 88px; + margin: 0 auto; + align-items: center; + justify-content: space-between; + border-bottom: 1px solid var(--line); +} + +.wordmark { + display: inline-flex; + align-items: center; + gap: 14px; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.wordmark span, +.footer-mark { + display: grid; + width: 38px; + height: 38px; + place-items: center; + border: 1px solid var(--ink); + border-radius: 50%; + font-family: var(--font-display), serif; + font-size: 17px; + letter-spacing: 0; +} + +.wordmark strong { + font-size: 11px; +} + +.site-header nav { + display: flex; + gap: 32px; + color: var(--muted); + font-size: 11px; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.site-header nav a { + position: relative; + padding: 12px 0; +} + +.site-header nav a::after, +.shop-link::after, +footer > a::after { + position: absolute; + right: 0; + bottom: 7px; + left: 0; + height: 1px; + background: currentColor; + content: ""; + transform: scaleX(0); + transform-origin: right; + transition: transform 180ms ease; +} + +.site-header nav a:hover::after, +.site-header nav a:focus-visible::after, +.shop-link:hover::after, +.shop-link:focus-visible::after, +footer > a:hover::after, +footer > a:focus-visible::after { + transform: scaleX(1); + transform-origin: left; +} + +.site-header nav a[aria-current="page"] { + color: var(--ink); +} + +.site-header nav a[aria-current="page"]::after { + transform: scaleX(1); +} + +.hero { + display: grid; + width: min(92vw, 1440px); + min-height: calc(100svh - 88px); + margin: 0 auto; + padding: 7vw 0 8vw; + grid-template-columns: minmax(0, 1.04fr) minmax(430px, 0.86fr); + align-items: center; + gap: clamp(42px, 7vw, 120px); +} + +.kicker, +.product-label { + margin: 0 0 26px; + color: var(--rose-dark); + font-size: 11px; + font-weight: 700; + letter-spacing: 0.16em; + text-transform: uppercase; +} + +.hero h1 { + max-width: 770px; + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(62px, 7.1vw, 118px); + font-weight: 500; + letter-spacing: -0.055em; + line-height: 0.79; +} + +.hero h1 em { + display: block; + margin: 0.25em 0 0.2em 0.55em; + color: var(--rose); + font-size: 0.54em; + font-weight: 400; + letter-spacing: -0.035em; + line-height: 1; +} + +.dek { + max-width: 650px; + margin: 44px 0 0; + color: #574845; + font-family: var(--font-display), serif; + font-size: clamp(22px, 2.1vw, 31px); + line-height: 1.28; +} + +.hero-actions { + display: flex; + margin-top: 46px; + align-items: center; + gap: 28px; +} + +.primary-link { + display: inline-flex; + min-height: 50px; + padding: 0 23px; + align-items: center; + justify-content: center; + gap: 18px; + color: #fff; + background: var(--ink); + font-size: 12px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + transition: background 180ms ease, transform 180ms ease; +} + +.primary-link:hover, +.primary-link:focus-visible { + background: var(--rose-dark); + transform: translateY(-2px); +} + +.secondary-link { + display: inline-flex; + min-height: 50px; + padding: 0 4px; + align-items: center; + gap: 12px; + border-bottom: 1px solid var(--ink); + font-size: 11px; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; + transition: color 180ms ease, border-color 180ms ease; +} + +.secondary-link:hover, +.secondary-link:focus-visible { + color: var(--rose-dark); + border-color: var(--rose-dark); +} + +.hero-actions > span { + color: var(--muted); + font-size: 11px; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.hero-art { + position: relative; + min-height: 690px; +} + +.hero-photo { + position: absolute; + margin: 0; + overflow: hidden; + background: var(--paper-deep); + box-shadow: 0 24px 70px rgb(78 47 42 / 0.16); +} + +.hero-photo img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform 300ms ease; +} + +.hero-photo > a { + display: block; + width: 100%; + height: 100%; +} + +.hero-photo > a:hover img, +.hero-photo > a:focus-visible img { + transform: scale(1.025); +} + +.hero-photo-main { + top: 0; + right: 2%; + width: 72%; + height: 82%; + transform: rotate(2.5deg); +} + +.hero-photo-secondary { + bottom: 0; + left: 0; + width: 43%; + height: 48%; + border: 10px solid var(--paper); + transform: rotate(-5deg); +} + +.hero-seal { + position: absolute; + right: 0; + bottom: 8%; + display: grid; + width: 132px; + height: 132px; + place-content: center; + border-radius: 50%; + color: #fff; + background: var(--rose-dark); + font-family: var(--font-display), serif; + font-size: 21px; + font-style: italic; + line-height: 0.9; + text-align: center; + transform: rotate(8deg); +} + +.hero-seal span { + display: block; + font-size: 47px; + font-style: normal; + line-height: 0.7; +} + +.opening { + display: grid; + padding: clamp(80px, 10vw, 160px) max(4vw, calc((100vw - 1320px) / 2)); + color: #f9f1e8; + background: var(--ink); + grid-template-columns: 0.7fr 1fr 1fr; + gap: clamp(30px, 5vw, 92px); +} + +.opening-label { + display: flex; + flex-direction: column; + gap: 8px; + color: var(--petal); + font-size: 10px; + font-weight: 700; + letter-spacing: 0.16em; + text-transform: uppercase; +} + +.opening p { + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(22px, 2vw, 31px); + line-height: 1.42; +} + +.opening-cluster, +.opening .ingredient-note { + display: flex; + flex-direction: column; + gap: 1em; +} + +.affiliate-disclosure { + display: grid; + width: min(92vw, 1440px); + margin: 0 auto; + padding: 38px 0; + border-bottom: 1px solid var(--line); + grid-template-columns: minmax(180px, 0.42fr) 1.58fr; + align-items: start; + gap: 36px; +} + +.affiliate-disclosure strong { + color: var(--rose-dark); + font-size: 10px; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.affiliate-disclosure p { + max-width: 860px; + margin: 0; + color: #594a47; + font-family: var(--font-display), serif; + font-size: 18px; + line-height: 1.5; +} + +.opening .ingredient-note { + padding-top: 36px; + border-top: 1px solid rgb(249 241 232 / 0.2); + grid-column: 2 / -1; +} + +.opening .ingredient-note p { + font-size: clamp(19px, 1.65vw, 26px); +} + +.ingredient-note a { + border-bottom: 1px solid var(--petal); + color: var(--petal); +} + +.drop-cap { + float: left; + margin: -0.08em 0.09em -0.12em 0; + color: var(--petal); + font-size: 4.4em; + line-height: 0.8; +} + +.product-list { + width: min(92vw, 1440px); + margin: 0 auto; +} + +.product { + display: grid; + min-height: 820px; + padding: clamp(92px, 11vw, 170px) 0; + border-bottom: 1px solid var(--line); + grid-template-columns: minmax(380px, 0.92fr) minmax(0, 1fr); + align-items: center; + gap: clamp(48px, 9vw, 150px); +} + +.product-reverse { + grid-template-columns: minmax(0, 1fr) minmax(380px, 0.92fr); +} + +.product-reverse .product-media { + grid-column: 2; +} + +.product-reverse .product-copy { + grid-row: 1; + grid-column: 1; +} + +.product-media { + position: relative; +} + +.product-image-link, +.product-placeholder-link, +.photo-placeholder { + display: block; + width: 100%; + aspect-ratio: 4 / 5; +} + +.product-image-link { + overflow: hidden; + box-shadow: 0 22px 60px rgb(72 45 40 / 0.14); +} + +.product-image-link img { + height: 100%; + object-fit: cover; + transition: transform 300ms ease; +} + +.product-image-link:hover img, +.product-image-link:focus-visible img { + transform: scale(1.025); +} + +.product-number { + position: absolute; + right: -30px; + bottom: -30px; + display: grid; + width: 94px; + height: 94px; + place-items: center; + border: 1px solid var(--ink); + border-radius: 50%; + background: var(--paper); + font-family: var(--font-display), serif; + font-size: 31px; +} + +.product-reverse .product-number { + right: auto; + left: -30px; +} + +.product-copy { + max-width: 660px; +} + +.product-copy h2 { + max-width: 650px; + margin: 0 0 40px; + font-family: var(--font-display), serif; + font-size: clamp(47px, 4.7vw, 78px); + font-weight: 500; + letter-spacing: -0.045em; + line-height: 0.98; +} + +.product-copy h2 a { + text-decoration-color: transparent; + text-decoration-line: underline; + text-decoration-thickness: 1px; + text-underline-offset: 0.11em; + transition: color 180ms ease, text-decoration-color 180ms ease; +} + +.product-copy h2 a:hover, +.product-copy h2 a:focus-visible { + color: var(--rose-dark); + text-decoration-color: currentColor; +} + +.paid-link-notice { + display: inline-block; + max-width: 560px; + margin: -16px 0 30px; + padding: 10px 14px; + border: 1px solid rgb(120 49 63 / 0.24); + color: var(--rose-dark); + background: rgb(229 185 181 / 0.2); + font-size: 10px; + font-weight: 700; + letter-spacing: 0.08em; + line-height: 1.5; + text-transform: uppercase; +} + +.product-prose { + columns: 2; + column-gap: 34px; + color: #594a47; + font-family: var(--font-display), serif; + font-size: 19px; + line-height: 1.55; +} + +.product-prose p { + margin: 0; + break-inside: avoid; +} + +.product-prose p + p { + margin-top: 1em; +} + +.shop-link, +footer > a { + position: relative; + display: inline-flex; + padding: 10px 0; + align-items: center; + gap: 18px; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.shop-link::after, +footer > a::after { + bottom: 3px; +} + +.photo-placeholder { + position: relative; + display: flex; + overflow: hidden; + padding: 12%; + flex-direction: column; + justify-content: flex-end; + color: #fffaf5; + background: + radial-gradient(circle at 22% 18%, rgb(255 229 223 / 0.62), transparent 24%), + linear-gradient(142deg, #8e3b49, #d39695 58%, #6a303a); + box-shadow: 0 22px 60px rgb(72 45 40 / 0.14); +} + +.placeholder-3 { + background: + radial-gradient(circle at 75% 25%, rgb(255 242 232 / 0.68), transparent 18%), + linear-gradient(145deg, #b0786c, #e1b9b3 56%, #7b4249); +} + +.placeholder-4 { + color: var(--ink); + background: + radial-gradient(circle at 25% 20%, rgb(255 255 255 / 0.7), transparent 20%), + linear-gradient(150deg, #efe3d1, #d3b27c 54%, #ad6f58); +} + +.placeholder-5 { + color: #fffaf5; + background: + radial-gradient(circle at 68% 22%, rgb(255 239 231 / 0.6), transparent 23%), + linear-gradient(148deg, #6f2938, #c67b81 55%, #e5b9b5); +} + +.photo-placeholder > span { + position: relative; + z-index: 2; + margin-bottom: 14px; + font-size: 10px; + font-weight: 700; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +.photo-placeholder > strong { + position: relative; + z-index: 2; + max-width: 390px; + font-family: var(--font-display), serif; + font-size: clamp(34px, 4vw, 61px); + font-weight: 400; + line-height: 0.96; +} + +.placeholder-orbit { + position: absolute; + top: 12%; + right: -10%; + width: 68%; + aspect-ratio: 1; + border: 1px solid rgb(255 255 255 / 0.5); + border-radius: 50%; +} + +.placeholder-orbit::before, +.placeholder-orbit::after { + position: absolute; + border: 1px solid rgb(255 255 255 / 0.34); + border-radius: 50%; + content: ""; +} + +.placeholder-orbit::before { + inset: 14%; +} + +.placeholder-orbit::after { + inset: 31%; +} + +.comparison { + padding: clamp(100px, 12vw, 180px) max(4vw, calc((100vw - 1440px) / 2)); + color: #fff8f1; + background: var(--rose-dark); +} + +.comparison-heading { + display: grid; + margin-bottom: 70px; + grid-template-columns: 0.55fr 1fr 0.75fr; + align-items: end; + gap: 40px; +} + +.comparison-heading .kicker { + color: var(--petal); +} + +.comparison-heading h2 { + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(54px, 6.5vw, 105px); + font-weight: 400; + letter-spacing: -0.045em; + line-height: 0.84; +} + +.comparison-heading > p:last-child { + margin: 0; + color: #e7cbc5; + font-family: var(--font-display), serif; + font-size: 21px; + line-height: 1.45; +} + +.decision-story { + display: grid; + border-top: 1px solid rgb(255 255 255 / 0.25); + border-bottom: 1px solid rgb(255 255 255 / 0.25); + grid-template-columns: 1fr 1fr; +} + +.decision-story > div { + padding: clamp(34px, 4.5vw, 66px); +} + +.decision-story > div + div { + border-left: 1px solid rgb(255 255 255 / 0.25); +} + +.decision-story p { + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(24px, 2.4vw, 38px); + line-height: 1.28; +} + +.decision-story p + p { + margin-top: 1em; +} + +.decision-story-connected { + display: flex; + padding: clamp(10px, 2vw, 26px) clamp(24px, 5vw, 76px); + flex-direction: column; +} + +.decision-story-connected p { + width: min(82%, 980px); + margin: 0; + padding: clamp(28px, 3vw, 46px) 0; + border-bottom: 1px solid rgb(255 255 255 / 0.18); + font-size: clamp(22px, 2.15vw, 34px); +} + +.decision-story-connected p + p { + margin-top: 0; +} + +.decision-story-connected p:nth-child(even) { + align-self: flex-end; +} + +.decision-story-connected p:last-child { + border-bottom: 0; +} + +.closing-copy { + max-width: 900px; + margin: 92px auto 0; + font-family: var(--font-display), serif; + font-size: clamp(29px, 3.2vw, 48px); + font-style: italic; + line-height: 1.18; + text-align: center; +} + +footer { + display: flex; + min-height: 230px; + padding: 60px max(4vw, calc((100vw - 1440px) / 2)); + align-items: center; + justify-content: space-between; + background: #201715; + color: #f9f1e8; +} + +footer > div { + display: flex; + align-items: center; + gap: 20px; +} + +footer p { + margin: 0; + color: #bcaeaa; + font-size: 11px; + letter-spacing: 0.04em; + line-height: 1.7; + text-transform: uppercase; +} + +footer > a { + color: var(--petal); +} + +/* Three-panel editorial comparison */ + +.compare-page { + background: + radial-gradient(circle at 85% 0%, rgb(229 185 181 / 0.34), transparent 25rem), + linear-gradient(180deg, var(--paper) 0, #f6eee6 35rem, var(--paper) 58rem); +} + +.compare-header nav a[aria-current="page"] { + color: var(--ink); +} + +.compare-header nav a[aria-current="page"]::after { + transform: scaleX(1); +} + +.compare-hero { + display: grid; + width: min(92vw, 1440px); + min-height: 690px; + margin: 0 auto; + padding: clamp(90px, 10vw, 155px) 0 110px; + grid-template-columns: minmax(0, 1.25fr) minmax(330px, 0.55fr); + align-items: end; + gap: clamp(60px, 9vw, 150px); +} + +.compare-hero > .kicker { + grid-column: 1 / -1; + align-self: start; +} + +.compare-hero h1 { + max-width: 900px; + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(74px, 8.6vw, 136px); + font-weight: 500; + letter-spacing: -0.065em; + line-height: 0.76; +} + +.compare-hero h1 em { + display: block; + margin-top: 0.24em; + color: var(--rose); + font-size: 0.52em; + font-weight: 400; + letter-spacing: -0.04em; + line-height: 0.95; +} + +.compare-intro { + padding-bottom: 4px; +} + +.compare-intro > p { + margin: 0 0 34px; + color: #584a46; + font-family: var(--font-display), serif; + font-size: 23px; + line-height: 1.45; +} + +.comparison-board { + width: min(96vw, 1720px); + margin: clamp(70px, 8vw, 130px) auto; + border-right: 1px solid var(--line); + border-left: 1px solid var(--line); + background: rgb(255 252 247 / 0.72); + box-shadow: 0 32px 90px rgb(78 47 42 / 0.09); +} + +.panel-headings { + position: sticky; + z-index: 12; + top: 0; + display: grid; + border-top: 1px solid var(--line); + border-bottom: 1px solid var(--line); + background: rgb(251 247 240 / 0.95); + grid-template-columns: repeat(3, minmax(0, 1fr)); + backdrop-filter: blur(16px); +} + +.panel-headings > div { + display: grid; + min-height: 104px; + padding: 22px clamp(18px, 2.6vw, 42px); + border-right: 1px solid var(--line); + grid-template-columns: 30px 1fr; + align-content: center; + column-gap: 12px; +} + +.panel-headings > div:last-child { + border-right: 0; +} + +.panel-headings span { + grid-row: 1 / span 2; + color: var(--rose); + font-family: var(--font-display), serif; + font-size: 20px; +} + +.panel-headings strong { + font-family: var(--font-display), serif; + font-size: 25px; + font-weight: 500; +} + +.panel-headings small { + display: flex; + margin-top: 2px; + align-items: center; + gap: 10px; + color: var(--muted); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.panel-headings i { + padding: 4px 7px; + border-radius: 999px; + font-style: normal; +} + +.legend-added { + color: #365e47; + background: #dcebdd; +} + +.legend-removed { + color: #88424d; + background: #f2dbdd; + text-decoration: line-through; +} + +.comparison-row { + display: grid; + border-bottom: 1px solid var(--line); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.row-heading { + display: flex; + padding: 42px clamp(22px, 2.6vw, 44px) 24px; + align-items: baseline; + gap: 16px; + border-bottom: 1px solid var(--line); + grid-column: 1 / -1; +} + +.row-heading span { + color: var(--rose); + font-family: var(--font-display), serif; + font-size: 21px; +} + +.row-heading h2 { + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(36px, 3vw, 54px); + font-weight: 500; + letter-spacing: -0.035em; +} + +.version-panel { + min-width: 0; + padding: clamp(28px, 3.2vw, 52px) clamp(20px, 2.8vw, 46px); + border-right: 1px solid var(--line); +} + +.version-panel:last-child { + border-right: 0; +} + +.original-panel { + background: rgb(241 233 225 / 0.5); +} + +.human-panel { + background: rgb(255 253 249 / 0.58); +} + +.edited-panel { + background: rgb(237 245 238 / 0.52); +} + +.mobile-panel-label { + display: none; +} + +.version-copy { + margin: 0; + color: #4f423f; + font-family: var(--font-display), serif; + font-size: clamp(16px, 1.28vw, 19px); + line-height: 1.62; + white-space: pre-wrap; +} + +.diff-copy ins, +.diff-copy del { + padding: 0.09em 0.16em; + border-radius: 3px; + text-decoration-thickness: 1px; +} + +.diff-copy ins { + color: #254d38; + background: #dcebdd; + text-decoration: none; +} + +.diff-copy del { + color: #88424d; + background: #f2dbdd; +} + +.empty-copy { + display: grid; + min-height: 190px; + margin: 0; + place-content: center; + color: #9a8984; + font-family: var(--font-display), serif; + font-size: 17px; + font-style: italic; + line-height: 1.5; + text-align: center; +} + +.empty-copy span { + display: block; + margin-bottom: 7px; + color: var(--rose-dark); + font-family: var(--font-sans), sans-serif; + font-size: 9px; + font-style: normal; + font-weight: 700; + letter-spacing: 0.13em; + text-transform: uppercase; +} + +.editor-decision { + margin-top: 34px; + padding-top: 20px; + border-top: 1px solid rgb(54 94 71 / 0.22); +} + +.editor-decision > span { + display: block; + margin-bottom: 9px; + color: #365e47; + font-size: 9px; + font-weight: 700; + letter-spacing: 0.13em; + text-transform: uppercase; +} + +.editor-decision p { + margin: 0; + color: #506a58; + font-size: 11px; + line-height: 1.65; +} + +.comparison-cta { + display: grid; + padding: clamp(100px, 12vw, 180px) max(4vw, calc((100vw - 1220px) / 2)); + color: #fff8f1; + background: var(--rose-dark); + grid-template-columns: 0.42fr 1fr 0.6fr; + align-items: end; + gap: 44px; +} + +.comparison-cta .kicker { + align-self: start; + color: var(--petal); +} + +.comparison-cta h2 { + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(54px, 6vw, 94px); + font-weight: 400; + letter-spacing: -0.05em; + line-height: 0.88; +} + +.comparison-cta > p:not(.kicker) { + margin: 0; + color: #e7cbc5; + font-family: var(--font-display), serif; + font-size: 20px; + line-height: 1.5; +} + +.comparison-cta .primary-link { + width: fit-content; + grid-column: 2; + background: #fff8f1; + color: var(--rose-dark); +} + +.comparison-cta .primary-link:hover, +.comparison-cta .primary-link:focus-visible { + background: var(--petal); +} + +/* Complete archive */ + +.archive-page { + background: + radial-gradient(circle at 88% 4%, rgb(229 185 181 / 0.32), transparent 25rem), + var(--paper); +} + +.archive-hero { + display: grid; + width: min(92vw, 1440px); + min-height: 640px; + margin: 0 auto; + padding: clamp(86px, 10vw, 150px) 0; + grid-template-columns: minmax(0, 1fr) minmax(260px, 0.38fr); + align-items: end; + gap: clamp(70px, 10vw, 170px); +} + +.archive-hero-copy h1, +.voice-hero h1 { + max-width: 960px; + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(74px, 9vw, 145px); + font-weight: 500; + letter-spacing: -0.065em; + line-height: 0.76; +} + +.archive-hero-copy h1 em, +.voice-hero h1 em { + display: block; + margin-top: 0.25em; + color: var(--rose); + font-size: 0.5em; + font-weight: 400; + letter-spacing: -0.04em; + line-height: 0.94; +} + +.archive-hero-copy > p:last-child { + max-width: 770px; + margin: 54px 0 0; + color: #594a47; + font-family: var(--font-display), serif; + font-size: clamp(22px, 2.1vw, 31px); + line-height: 1.42; +} + +.archive-hero-stats { + margin: 0; + border-top: 1px solid var(--line); +} + +.archive-hero-stats > div { + display: grid; + padding: 23px 0; + border-bottom: 1px solid var(--line); + grid-template-columns: 1fr auto; + align-items: end; + gap: 24px; +} + +.archive-hero-stats dt { + color: var(--muted); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.archive-hero-stats dd { + margin: 0; + color: var(--rose-dark); + font-family: var(--font-display), serif; + font-size: 48px; + line-height: 0.8; +} + +.archive-bookends { + display: grid; + padding: 0 max(4vw, calc((100vw - 1440px) / 2)); + color: #fff8f1; + background: var(--ink); + grid-template-columns: 1fr 1fr; +} + +.archive-bookends article { + min-height: 270px; + padding: clamp(42px, 5vw, 74px); +} + +.archive-bookends article + article { + border-left: 1px solid rgb(255 255 255 / 0.18); +} + +.archive-bookends span { + color: var(--petal); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.14em; + text-transform: uppercase; +} + +.archive-bookends h2 { + max-width: 560px; + margin: 28px 0 0; + font-family: var(--font-display), serif; + font-size: clamp(34px, 3.6vw, 55px); + font-weight: 400; + letter-spacing: -0.035em; + line-height: 1; +} + +.archive-explorer { + width: min(92vw, 1440px); + margin: 0 auto; + padding: clamp(85px, 10vw, 150px) 0; +} + +.archive-toolbar { + display: grid; + padding: 25px; + border: 1px solid var(--line); + background: rgb(255 252 247 / 0.75); + box-shadow: 0 18px 60px rgb(78 47 42 / 0.07); + grid-template-columns: minmax(260px, 1fr) 190px 150px; + align-items: end; + gap: 20px; +} + +.archive-search, +.archive-year { + display: grid; + gap: 9px; +} + +.archive-search > span, +.archive-year > span { + color: var(--rose-dark); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.13em; + text-transform: uppercase; +} + +.archive-search input, +.archive-year select { + width: 100%; + height: 54px; + padding: 0 16px; + border: 1px solid var(--line); + border-radius: 0; + outline: none; + color: var(--ink); + background: var(--paper); + font-family: var(--font-display), serif; + font-size: 18px; +} + +.archive-search input:focus, +.archive-year select:focus { + border-color: var(--rose-dark); + box-shadow: 0 0 0 2px rgb(120 49 63 / 0.12); +} + +.archive-result-count { + display: flex; + height: 54px; + padding: 0 8px; + align-items: center; + justify-content: center; + gap: 10px; + color: #fff8f1; + background: var(--rose-dark); +} + +.archive-result-count strong { + font-family: var(--font-display), serif; + font-size: 26px; + font-weight: 500; +} + +.archive-result-count span { + font-size: 8px; + font-weight: 700; + letter-spacing: 0.09em; + text-transform: uppercase; +} + +.archive-category-strip { + display: grid; + margin-top: 22px; + border-top: 1px solid var(--line); + border-left: 1px solid var(--line); + grid-template-columns: repeat(5, minmax(0, 1fr)); +} + +.archive-category-strip button { + display: flex; + min-height: 74px; + padding: 15px; + border: 0; + border-right: 1px solid var(--line); + border-bottom: 1px solid var(--line); + align-items: center; + justify-content: space-between; + gap: 12px; + color: var(--muted); + background: transparent; + cursor: pointer; + font: inherit; + text-align: left; + transition: color 180ms ease, background 180ms ease; +} + +.archive-category-strip button:hover, +.archive-category-strip button:focus-visible, +.archive-category-strip button.is-active { + color: #fff8f1; + background: var(--ink); +} + +.archive-category-strip button span { + font-size: 9px; + font-weight: 700; + letter-spacing: 0.07em; + text-transform: uppercase; +} + +.archive-category-strip button strong { + font-family: var(--font-display), serif; + font-size: 21px; + font-weight: 500; +} + +.archive-results-heading { + display: flex; + margin: clamp(80px, 9vw, 135px) 0 44px; + align-items: end; + justify-content: space-between; + gap: 30px; +} + +.archive-results-heading .kicker { + margin-bottom: 18px; +} + +.archive-results-heading h2 { + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(48px, 5vw, 78px); + font-weight: 500; + letter-spacing: -0.045em; +} + +.archive-results-heading > button, +.archive-empty button { + padding: 12px 0; + border: 0; + border-bottom: 1px solid currentColor; + color: var(--rose-dark); + background: transparent; + cursor: pointer; + font-size: 9px; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.archive-list { + border-top: 1px solid var(--line); +} + +.archive-entry { + display: grid; + min-height: 152px; + padding: 27px 0; + border-bottom: 1px solid var(--line); + grid-template-columns: 72px minmax(0, 1fr) 110px; + align-items: center; + gap: clamp(20px, 4vw, 60px); + transition: padding 180ms ease, background 180ms ease; +} + +.archive-entry:hover { + padding-right: 22px; + padding-left: 22px; + background: rgb(229 185 181 / 0.12); +} + +.archive-index { + color: var(--rose); + font-family: var(--font-display), serif; + font-size: 23px; +} + +.archive-entry-copy > p { + display: flex; + margin: 0 0 11px; + gap: 18px; + color: var(--muted); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.11em; + text-transform: uppercase; +} + +.archive-entry-copy > p span { + color: var(--rose-dark); +} + +.archive-entry h3 { + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(27px, 2.6vw, 41px); + font-weight: 500; + letter-spacing: -0.025em; + line-height: 1.04; +} + +.archive-entry h3 a { + display: inline-flex; + align-items: baseline; + gap: 14px; +} + +.archive-entry h3 a > span { + color: var(--rose); + font-family: var(--font-sans), sans-serif; + font-size: 14px; + transition: transform 180ms ease; +} + +.archive-entry h3 a:hover > span, +.archive-entry h3 a:focus-visible > span { + transform: translate(3px, -3px); +} + +.archive-word-count { + color: var(--muted); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.08em; + text-align: right; + text-transform: uppercase; +} + +.archive-empty { + display: grid; + min-height: 310px; + place-content: center; + justify-items: center; + border-top: 1px solid var(--line); + border-bottom: 1px solid var(--line); + text-align: center; +} + +.archive-empty p { + margin: 0 0 22px; + font-family: var(--font-display), serif; + font-size: 31px; +} + +/* Evidence-backed voice system */ + +.voice-page { + background: var(--paper); +} + +.voice-hero { + display: grid; + min-height: 690px; + padding: clamp(100px, 11vw, 170px) max(4vw, calc((100vw - 1440px) / 2)); + color: #fff8f1; + background: + radial-gradient(circle at 84% 20%, rgb(229 185 181 / 0.25), transparent 23rem), + var(--ink); + grid-template-columns: minmax(0, 1.2fr) minmax(300px, 0.48fr); + align-items: end; + gap: clamp(70px, 10vw, 160px); +} + +.voice-hero .kicker { + color: var(--petal); +} + +.voice-hero h1 em { + color: var(--petal); +} + +.voice-hero-note { + padding-top: 28px; + border-top: 1px solid rgb(255 255 255 / 0.24); +} + +.voice-hero-note p { + margin: 0 0 32px; + color: #eadbd5; + font-family: var(--font-display), serif; + font-size: clamp(21px, 2vw, 28px); + line-height: 1.45; +} + +.voice-hero-note span { + color: var(--petal); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.13em; + text-transform: uppercase; +} + +.voice-metrics { + display: grid; + padding: 0 max(4vw, calc((100vw - 1440px) / 2)); + border-bottom: 1px solid var(--line); + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.voice-metrics article { + display: flex; + min-height: 230px; + padding: clamp(34px, 4vw, 60px); + flex-direction: column; + justify-content: space-between; + border-left: 1px solid var(--line); +} + +.voice-metrics article:last-child { + border-right: 1px solid var(--line); +} + +.voice-metrics strong { + color: var(--rose-dark); + font-family: var(--font-display), serif; + font-size: clamp(49px, 5vw, 77px); + font-weight: 400; + letter-spacing: -0.045em; + line-height: 0.8; +} + +.voice-metrics span { + max-width: 190px; + color: var(--muted); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.1em; + line-height: 1.6; + text-transform: uppercase; +} + +.voice-proof { + display: grid; + padding: clamp(100px, 13vw, 200px) max(4vw, calc((100vw - 1220px) / 2)); + grid-template-columns: minmax(260px, 0.65fr) 1fr; + gap: clamp(65px, 10vw, 150px); +} + +.voice-proof-heading h2, +.section-intro h2, +.voice-guardrails h2 { + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(54px, 6.4vw, 102px); + font-weight: 400; + letter-spacing: -0.05em; + line-height: 0.88; +} + +.voice-proof-copy { + padding-top: 46px; + border-top: 1px solid var(--line); +} + +.voice-proof-copy p { + margin: 0; + color: #594a47; + font-family: var(--font-display), serif; + font-size: clamp(24px, 2.4vw, 36px); + line-height: 1.36; +} + +.voice-proof-copy p + p { + margin-top: 1em; +} + +.voice-system, +.voice-movement, +.editorial-runway { + padding: clamp(100px, 12vw, 180px) max(4vw, calc((100vw - 1440px) / 2)); +} + +.voice-system { + background: var(--paper-deep); +} + +.section-intro { + display: grid; + margin-bottom: clamp(60px, 8vw, 110px); + grid-template-columns: 0.48fr 1fr 0.55fr; + align-items: end; + gap: clamp(30px, 5vw, 72px); +} + +.section-intro > p:last-child { + margin: 0; + color: var(--muted); + font-family: var(--font-display), serif; + font-size: 20px; + line-height: 1.5; +} + +.voice-system-grid { + display: grid; + border-top: 1px solid var(--line); + border-left: 1px solid var(--line); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.voice-system-grid article, +.runway-grid article { + min-height: 330px; + padding: clamp(30px, 4vw, 58px); + border-right: 1px solid var(--line); + border-bottom: 1px solid var(--line); +} + +.voice-system-grid article:first-child { + grid-column: span 2; +} + +.voice-system-grid article > span, +.runway-grid article > span { + color: var(--rose); + font-family: var(--font-display), serif; + font-size: 23px; +} + +.voice-system-grid h3, +.runway-grid h3 { + margin: 50px 0 22px; + font-family: var(--font-display), serif; + font-size: clamp(32px, 3vw, 46px); + font-weight: 500; + letter-spacing: -0.035em; + line-height: 0.98; +} + +.voice-system-grid p, +.runway-grid p { + max-width: 470px; + margin: 0; + color: var(--muted); + font-family: var(--font-display), serif; + font-size: 18px; + line-height: 1.55; +} + +.voice-architecture { + padding: clamp(100px, 12vw, 180px) max(4vw, calc((100vw - 1440px) / 2)); + color: #fff8f1; + background: var(--rose-dark); +} + +.voice-architecture .section-intro { + grid-template-columns: 0.48fr 1fr; +} + +.voice-architecture .kicker { + color: var(--petal); +} + +.architecture-flow { + display: grid; + border-top: 1px solid rgb(255 255 255 / 0.23); + border-bottom: 1px solid rgb(255 255 255 / 0.23); + grid-template-columns: 1fr 60px 1fr 60px 1fr; + align-items: stretch; +} + +.architecture-flow article { + display: flex; + min-height: 310px; + padding: clamp(35px, 4vw, 60px); + flex-direction: column; +} + +.architecture-flow article > span { + color: var(--petal); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.12em; + text-transform: uppercase; +} + +.architecture-flow strong { + margin: auto 0 22px; + font-family: var(--font-display), serif; + font-size: clamp(35px, 3.5vw, 52px); + font-weight: 400; + line-height: 0.95; +} + +.architecture-flow p { + margin: 0; + color: #e7cbc5; + font-family: var(--font-display), serif; + font-size: 18px; + line-height: 1.5; +} + +.architecture-flow > i { + display: grid; + place-items: center; + border-right: 1px solid rgb(255 255 255 / 0.23); + border-left: 1px solid rgb(255 255 255 / 0.23); + color: var(--petal); + font-family: var(--font-display), serif; + font-size: 31px; + font-style: normal; +} + +.voice-movement ol { + margin: 0; + padding: 0; + border-top: 1px solid var(--line); + list-style: none; +} + +.voice-movement li { + display: grid; + min-height: 150px; + padding: 30px 0; + border-bottom: 1px solid var(--line); + grid-template-columns: 85px minmax(210px, 0.52fr) 1fr; + align-items: center; + gap: 30px; +} + +.voice-movement li > span { + color: var(--rose); + font-family: var(--font-display), serif; + font-size: 23px; +} + +.voice-movement h3 { + margin: 0; + font-family: var(--font-display), serif; + font-size: clamp(34px, 3.5vw, 54px); + font-weight: 500; + letter-spacing: -0.035em; +} + +.voice-movement li > p { + max-width: 720px; + margin: 0; + color: var(--muted); + font-family: var(--font-display), serif; + font-size: 19px; + line-height: 1.55; +} + +.voice-guardrails { + display: grid; + grid-template-columns: 1fr 1fr; +} + +.voice-guardrails > div { + padding: clamp(80px, 10vw, 150px) max(4vw, calc((100vw - 1320px) / 4)); +} + +.voice-guardrails > div:first-child { + color: #fff8f1; + background: var(--ink); +} + +.voice-guardrails > div:last-child { + color: var(--ink); + background: var(--petal); +} + +.voice-guardrails > div:first-child .kicker { + color: var(--petal); +} + +.voice-guardrails > div:last-child .kicker { + color: var(--rose-dark); +} + +.voice-guardrails ul { + margin: 55px 0 0; + padding: 0; + border-top: 1px solid currentColor; + list-style: none; +} + +.voice-guardrails li { + padding: 21px 0; + border-bottom: 1px solid currentColor; + font-family: var(--font-display), serif; + font-size: 19px; + line-height: 1.4; +} + +.editorial-runway { + background: + radial-gradient(circle at 92% 4%, rgb(229 185 181 / 0.28), transparent 25rem), + var(--paper); +} + +.runway-grid { + display: grid; + border-top: 1px solid var(--line); + border-left: 1px solid var(--line); + grid-template-columns: repeat(3, minmax(0, 1fr)); +} + +.runway-grid article { + min-height: 390px; +} + +@media (max-width: 1050px) { + .hero { + grid-template-columns: minmax(0, 1fr) minmax(340px, 0.8fr); + gap: 44px; + } + + .hero-art { + min-height: 570px; + } + + .opening { + grid-template-columns: 0.45fr 1fr 1fr; + gap: 36px; + } + + .product { + grid-template-columns: minmax(320px, 0.8fr) 1fr; + gap: 70px; + } + + .product-reverse { + grid-template-columns: 1fr minmax(320px, 0.8fr); + } + + .product-prose { + columns: 1; + } + + .compare-hero { + grid-template-columns: 1fr 0.55fr; + } + + .panel-headings strong { + font-size: 21px; + } + + .version-copy { + font-size: 15px; + } + + .comparison-cta { + grid-template-columns: 0.35fr 1fr; + } + + .comparison-cta > p:not(.kicker) { + grid-column: 2; + } + + .archive-hero { + grid-template-columns: minmax(0, 1fr) 250px; + gap: 60px; + } + + .archive-category-strip { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .voice-hero { + grid-template-columns: minmax(0, 1fr) minmax(260px, 0.5fr); + gap: 55px; + } + + .voice-metrics { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .voice-metrics article:nth-child(3) { + border-top: 1px solid var(--line); + } + + .voice-metrics article:nth-child(4) { + border-top: 1px solid var(--line); + border-right: 1px solid var(--line); + } + + .section-intro { + grid-template-columns: 0.42fr 1fr; + } + + .section-intro > p:last-child { + grid-column: 2; + } + + .voice-system-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .voice-system-grid article:first-child { + grid-column: auto; + } + + .architecture-flow { + grid-template-columns: 1fr 42px 1fr 42px 1fr; + } + + .architecture-flow article { + padding: 32px 24px; + } + + .runway-grid article { + padding: 36px 30px; + } +} + +@media (max-width: 760px) { + .site-header { + min-height: 0; + padding: 16px 0 12px; + align-items: flex-start; + flex-direction: column; + gap: 8px; + } + + .site-header nav { + display: flex; + width: 100%; + padding-bottom: 2px; + gap: 20px; + overflow-x: auto; + white-space: nowrap; + scrollbar-width: none; + } + + .site-header nav::-webkit-scrollbar { + display: none; + } + + .site-header nav a { + flex: 0 0 auto; + } + + .hero { + min-height: auto; + padding: 64px 0 90px; + grid-template-columns: 1fr; + } + + .hero h1 { + font-size: clamp(58px, 18vw, 86px); + } + + .hero h1 em { + margin-left: 0.1em; + } + + .hero-actions { + align-items: flex-start; + flex-direction: column; + } + + .hero-art { + min-height: 550px; + } + + .opening { + grid-template-columns: 1fr; + } + + .opening .ingredient-note { + grid-column: auto; + } + + .opening-label { + flex-direction: row; + justify-content: space-between; + } + + .affiliate-disclosure { + padding: 30px 0; + grid-template-columns: 1fr; + gap: 12px; + } + + .product, + .product-reverse { + min-height: 0; + padding: 90px 0; + grid-template-columns: 1fr; + gap: 70px; + } + + .product-reverse .product-media, + .product-reverse .product-copy { + grid-row: auto; + grid-column: auto; + } + + .product-number, + .product-reverse .product-number { + right: 18px; + bottom: -28px; + left: auto; + } + + .product-copy h2 { + font-size: clamp(44px, 14vw, 68px); + } + + .comparison-heading { + grid-template-columns: 1fr; + } + + .decision-story { + grid-template-columns: 1fr; + } + + .decision-story > div + div { + border-top: 1px solid rgb(255 255 255 / 0.25); + border-left: 0; + } + + .decision-story-connected { + padding: 10px 24px; + } + + .decision-story-connected p, + .decision-story-connected p:nth-child(even) { + width: 100%; + align-self: stretch; + } + + footer { + align-items: flex-start; + flex-direction: column; + gap: 32px; + } + + .compare-hero { + min-height: 0; + padding: 72px 0 86px; + grid-template-columns: 1fr; + gap: 38px; + } + + .compare-hero > .kicker { + grid-column: auto; + } + + .compare-hero h1 { + font-size: clamp(62px, 19vw, 92px); + } + + .compare-intro > p { + font-size: 20px; + } + + .comparison-board { + width: min(94vw, 680px); + border-top: 1px solid var(--line); + } + + .panel-headings { + display: none; + } + + .comparison-row { + grid-template-columns: 1fr; + } + + .row-heading { + position: sticky; + z-index: 8; + top: 0; + padding: 24px 22px 18px; + background: rgb(251 247 240 / 0.96); + backdrop-filter: blur(14px); + } + + .row-heading h2 { + font-size: 35px; + } + + .version-panel { + padding: 34px 24px 42px; + border-right: 0; + border-bottom: 1px solid var(--line); + } + + .mobile-panel-label { + display: block; + margin: 0 0 22px; + color: var(--rose-dark); + font-size: 9px; + font-weight: 700; + letter-spacing: 0.13em; + text-transform: uppercase; + } + + .version-copy { + font-size: 17px; + } + + .comparison-cta { + grid-template-columns: 1fr; + gap: 28px; + } + + .comparison-cta > p:not(.kicker), + .comparison-cta .primary-link { + grid-column: auto; + } + + .archive-hero { + min-height: 0; + padding: 72px 0 88px; + grid-template-columns: 1fr; + gap: 58px; + } + + .archive-hero-copy h1, + .voice-hero h1 { + font-size: clamp(62px, 19vw, 92px); + } + + .archive-hero-copy > p:last-child { + margin-top: 38px; + font-size: 22px; + } + + .archive-bookends { + grid-template-columns: 1fr; + } + + .archive-bookends article { + min-height: 0; + padding: 50px 0; + } + + .archive-bookends article + article { + border-top: 1px solid rgb(255 255 255 / 0.18); + border-left: 0; + } + + .archive-explorer { + padding: 78px 0 96px; + } + + .archive-toolbar { + padding: 18px; + grid-template-columns: 1fr; + } + + .archive-result-count { + justify-content: flex-start; + } + + .archive-category-strip { + display: flex; + padding-bottom: 8px; + border-left: 0; + overflow-x: auto; + scroll-snap-type: x proximity; + } + + .archive-category-strip button { + min-width: 145px; + border-left: 1px solid var(--line); + flex: 0 0 145px; + scroll-snap-align: start; + } + + .archive-results-heading { + margin-top: 72px; + align-items: flex-start; + flex-direction: column; + } + + .archive-results-heading h2 { + font-size: 47px; + } + + .archive-entry { + padding: 26px 0; + grid-template-columns: 46px 1fr; + gap: 16px; + } + + .archive-entry:hover { + padding-right: 10px; + padding-left: 10px; + } + + .archive-word-count { + display: none; + } + + .archive-entry-copy > p { + align-items: flex-start; + flex-direction: column; + gap: 5px; + } + + .archive-entry h3 { + font-size: 28px; + } + + .voice-hero { + min-height: 0; + padding: 80px 4vw 95px; + grid-template-columns: 1fr; + gap: 58px; + } + + .voice-metrics { + grid-template-columns: 1fr; + } + + .voice-metrics article, + .voice-metrics article:nth-child(3), + .voice-metrics article:nth-child(4) { + min-height: 180px; + border-top: 0; + border-right: 1px solid var(--line); + border-bottom: 1px solid var(--line); + } + + .voice-proof { + padding: 95px 4vw; + grid-template-columns: 1fr; + gap: 58px; + } + + .voice-proof-copy { + padding-top: 32px; + } + + .voice-system, + .voice-movement, + .editorial-runway, + .voice-architecture { + padding: 95px 4vw; + } + + .section-intro, + .voice-architecture .section-intro { + margin-bottom: 62px; + grid-template-columns: 1fr; + gap: 28px; + } + + .section-intro > p:last-child { + grid-column: auto; + } + + .voice-system-grid, + .runway-grid { + grid-template-columns: 1fr; + } + + .voice-system-grid article, + .runway-grid article { + min-height: 0; + padding: 38px 30px 46px; + } + + .voice-system-grid h3, + .runway-grid h3 { + margin-top: 42px; + } + + .architecture-flow { + grid-template-columns: 1fr; + } + + .architecture-flow article { + min-height: 270px; + padding: 38px 28px; + } + + .architecture-flow > i { + min-height: 52px; + border-top: 1px solid rgb(255 255 255 / 0.23); + border-right: 0; + border-bottom: 1px solid rgb(255 255 255 / 0.23); + border-left: 0; + transform: rotate(90deg); + } + + .voice-movement li { + padding: 30px 0 36px; + grid-template-columns: 46px 1fr; + gap: 12px 18px; + } + + .voice-movement li > p { + grid-column: 2; + } + + .voice-guardrails { + grid-template-columns: 1fr; + } + + .voice-guardrails > div { + padding: 85px 4vw; + } +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + + *, + *::before, + *::after { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + } +} diff --git a/docs/continuations/charles/rose-toners-share/app/layout.tsx b/docs/continuations/charles/rose-toners-share/app/layout.tsx new file mode 100644 index 000000000..acb70d7be --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/app/layout.tsx @@ -0,0 +1,71 @@ +import type { Metadata } from "next"; +import { Cormorant_Garamond, Manrope } from "next/font/google"; +import { headers } from "next/headers"; +import "./globals.css"; + +const display = Cormorant_Garamond({ + variable: "--font-display", + subsets: ["latin"], + weight: ["400", "500", "600"], + style: ["normal", "italic"], +}); + +const sans = Manrope({ + variable: "--font-sans", + subsets: ["latin"], + weight: ["400", "500", "600", "700"], +}); + +export async function generateMetadata(): Promise { + const requestHeaders = await headers(); + const host = + requestHeaders.get("x-forwarded-host") ?? + requestHeaders.get("host") ?? + "localhost:3000"; + const protocol = + requestHeaders.get("x-forwarded-proto") ?? + (host.startsWith("localhost") ? "http" : "https"); + const origin = `${protocol}://${host}`; + const title = "Downs Style Studio | Archive & Voice"; + const socialTitle = "Downs Style Studio"; + const description = + "The complete 258-post Downs Style archive, Charles Downs's evidence-backed voice system, and a working editorial studio for what comes next."; + const socialImage = `${origin}/og-archive.png`; + + return { + metadataBase: new URL(origin), + title, + description, + openGraph: { + title: socialTitle, + description, + type: "website", + images: [ + { + url: socialImage, + width: 1672, + height: 941, + alt: "Downs Style Studio archive and voice system", + }, + ], + }, + twitter: { + card: "summary_large_image", + title: socialTitle, + description, + images: [socialImage], + }, + }; +} + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + {children} + + ); +} diff --git a/docs/continuations/charles/rose-toners-share/app/page.tsx b/docs/continuations/charles/rose-toners-share/app/page.tsx new file mode 100644 index 000000000..ad983d11d --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/app/page.tsx @@ -0,0 +1,523 @@ +import type { Metadata } from "next"; +import { SiteHeader } from "./site-header"; + +export const metadata: Metadata = { + title: { + absolute: + "Rosewater and the Benefits Behind Our Favorite Flower | Downs Style", + }, + description: + "An ingredient-aware look at rosewater across six toners and face mists, with honest notes on formula, texture, fragrance, and what sets each one apart.", + openGraph: { + title: "Rosewater and the Benefits Behind Our Favorite Flower", + description: + "Six rose toners and face mists, compared through formula, texture, fragrance, and ritual.", + type: "article", + images: [ + { + url: "/og-comparison.png", + width: 1536, + height: 804, + alt: "Rosewater and the Benefits Behind Our Favorite Flower", + }, + ], + }, + twitter: { + card: "summary_large_image", + images: ["/og-comparison.png"], + }, +}; + +const marioImage = + "https://images.squarespace-cdn.com/content/v1/5a249e6ad74cff08266045cf/551c3ea4-1b1c-482e-9a1d-806cc31225ee/IMG_3034.jpeg?format=1500w"; + +const whamisaImage = + "https://images.squarespace-cdn.com/content/v1/5a249e6ad74cff08266045cf/2f254341-77c6-44d3-b3d8-ef92582ece40/whamsica.webp?format=1500w"; + +const products = [ + { + number: "01", + slug: "mario-badescu", + label: "The nostalgic mist", + title: "Mario Badescu Facial Spray With Aloe, Herbs And Rosewater", + link: "https://www.mariobadescu.com/products/facial-spray-with-aloe-herbs-and-rosewater", + image: marioImage, + imageAlt: "Mario Badescu rose facial spray photographed by Charles", + copy: ( + <> +

+ If you had any sort of affliction with skincare like we did in the + late 2010s, then you already know this bottle. From your favorite + celebrities to your next-door neighbor, someone you knew owned at + least one Mario Badescu product, if not this one specifically. +

+

+ Not without good cause, of course. Rosewater and aloe give the facial + spray the light, refreshing personality we all remember, while the + supporting botanicals kept it from feeling like plain floral water. +

+

+ The nostalgia is real, although it cannot answer what is in the + bottle now. The current label lists Red 40 and Yellow 5, which does + not need to become a medical panic to be worth mentioning. +

+

+ If you want a dye-free mist, this romance ends here; if you do not, + the bottle is still very easy to understand. We just cannot call + the formula all-natural anymore. +

+ + ), + }, + { + number: "02", + slug: "whamisa", + label: "The rich fermented toner", + title: "Whamisa Organic Flowers Toner Deep Rich", + link: "https://whamisa.us/products/organic-flowers-toner-deep-rich", + image: whamisaImage, + imageAlt: "Whamisa Organic Flowers Toner Deep Rich photographed by Charles", + copy: ( + <> +

+ Whamisa does not even try to be Mario. This toner begins with an aloe + base, which gives it a rich, bouncy texture much closer to a thin + serum than the watery toners many of us grew up using. +

+

+ The fermented flower complex makes the formula even more interesting, + but the real surprise is that all of that richness does not stay + quiet. +

+

+ Several essential oils make the Damask rose smell full and obvious, + which is fun when you want skincare to feel like an actual event. +

+

+ That same bouquet may be too much if you want a fragrance-minimal + step; then again, a whisper was clearly never the point. +

+ + ), + }, + { + number: "03", + slug: "santa-maria-novella", + label: "The heritage rosewater", + title: "Santa Maria Novella Acqua di Rose", + link: "https://us.smnovella.com/products/adr", + imageAlt: "Photo placeholder for Santa Maria Novella Acqua di Rose", + copy: ( + <> +

+ Whamisa makes rose feel modern and fermented, whereas Santa Maria + Novella makes it feel as though we should be applying it in a + Florentine apothecary. +

+

+ The brand says Acqua di Rose has been documented at its Officina + since 1381, which is so old it almost makes the rest of our routines + look impatient. +

+

+ Distilled Damask rose water keeps the flower at the center of that + history. History is romantic, but it does not make the formula + minimal. +

+

+ Added fragrance and fragrant rose components turn this into the full + apothecary experience, so we would choose it for the ritual rather + than pretend it is a modern, active-driven treatment. +

+ + ), + }, + { + number: "04", + slug: "chantecaille", + label: "The minimalist mist", + title: "Chantecaille Pure Rosewater", + link: "https://chantecaille.com/products/pure-rosewater", + imageAlt: "Photo placeholder for Chantecaille Pure Rosewater", + copy: ( + <> +

+ After nearly seven centuries of history, Chantecaille makes two + ingredients feel almost rebellious. +

+

+ Pure Rosewater pairs Rose de Mai flower water with lactobacillus + ferment, and that is actually the entire formula. +

+

+ The brand steam-distills the whole blossom in artesian well water in + the South of France, so the aroma comes from the rose rather than an + added fragrance blend. +

+

+ We love knowing exactly what is in the bottle, although that clarity + can feel almost suspiciously simple when you expect a toner to bring + more texture. +

+

+ If a simple formula makes you super excited, this is probably the + one; if you want something more substantial, two ingredients may + feel almost too simple. +

+ + ), + }, + { + number: "05", + slug: "sisley-paris", + label: "The traditional floral lotion", + title: "Sisley-Paris Floral Toning Lotion", + link: "https://www.saksfifthavenue.com/product/sisley-paris-floral-toning-lotion-0446264201031.html", + imageAlt: "Photo placeholder for Sisley-Paris Floral Toning Lotion", + copy: ( + <> +

+ If Chantecaille makes two ingredients feel exciting, Sisley-Paris + has no interest in stopping there. +

+

+ Rose opens the formula, but cornflower and witch-hazel floral waters + turn it into the kind of classic wipe-on lotion that finishes a + cleanse before serum and moisturizer. +

+

+ That fuller formula is less minimal, although that is not + automatically an insult. Some routines want a light mist, while + others want the familiar satisfaction of a cotton pad. +

+

+ Fragrance comes along with that traditional experience because + Sisley was clearly not trying to be shy either. +

+ + ), + }, + { + number: "06", + slug: "fresh", + label: "The romantic finale", + title: "Fresh Rose Deep Hydration Facial Toner", + link: "https://on.ltk.com/+IRLNZ3842CX6uNfhjQ9edg", + affiliate: true, + imageAlt: + "Photo placeholder for Fresh Rose Deep Hydration Facial Toner", + copy: ( + <> +

+ If Sisley-Paris is the toner for someone who misses a cotton pad, + Fresh is what happens when that same ritual wants to look a little + more romantic. +

+

+ The current formula combines Damask rose water and extracts with + glycerin and hyaluronic acid, so the hydration story is more built + out than the floral waters before it. +

+

+ That fullness is also the drawback: rose flower oil and fragrant rose + components make this a very committed rose bottle, not a minimal one + pretending to be invisible. +

+

+ Choose it when you want the flower and the toner step to feel equally + obvious; click the photo to inspect the full formula or shop the + bottle. +

+ + ), + }, +] as const; + +function Arrow() { + return ; +} + +export default function Home() { + return ( +
+ + +
+
+

+ Downs Style · Rose in Skincare · Draft for Charles +

+

+ Rosewater + and the Benefits Behind + Our Favorite Flower +

+

+ Six formulas show how rosewater and rose-derived ingredients can + take very different forms—from a late-2010s icon to a + two-ingredient French mist and one very committed rose finale. +

+ +
+ +
+
+ + Mario Badescu rose facial spray + +
+
+ + Whamisa Organic Flowers toner + +
+ +
+
+ +
+
+ Editor's note + August 2026 +
+
+

+ With summer upon us, the sweltering + heat has left our skin in need of some consistent refreshment. +

+

+ Perhaps you have noticed the heat making your usual skincare + routine feel a bit futile in the face of this extreme weather. +

+

+ If this is the case, then here we offer an oasis of skincare that we + think will help you cope with this unruly weather. +

+
+
+

+ Rose has always been one of our favorite skincare ingredients, + partly because it smells wonderful and partly because it makes an + ordinary face mist feel a little more special. +

+

+ The scent gets our attention, but the formula is what makes us stay. +

+

+ Mario Badescu keeps the flower light and familiar, whereas Whamisa + turns it into a toner so rich it is almost pretending to be a serum. +

+

+ Then Chantecaille takes the drama away again and leaves us with two + ingredients, only for Fresh to bring the whole toner ritual roaring + back. Same favorite flower, completely different personalities. +

+
+
+

+ So why does rosewater keep finding its way back into our routines? +

+

+ It is the fragrant water collected when rose petals are distilled, + which helps explain why it is more interesting than perfumed tap + water. +

+

+ + Laboratory studies + {" "} + have measured antioxidant activity in rose distillation products, + which sounds extremely glamorous. +

+

+ Still, that result belongs to the material studied and not + automatically to every pink bottle on a shelf. +

+

+ The type of rose matters, but so do the way it was distilled and + the amount inside; after that, every other ingredient gets a chance + to help the flower or completely crowd it out. +

+

Rose starts the story, but the whole bottle gets the final word.

+
+
+ + + +
+ {products.map((product, index) => ( +
+
+ {"image" in product ? ( + + {product.imageAlt} + + ) : ( + + + + + )} + {product.number} +
+ +
+

{product.label}

+

+ + {product.title} + +

+ {"affiliate" in product && product.affiliate ? ( +

+ Paid link — Downs Style may earn a commission if you shop + this product +

+ ) : null} +
{product.copy}
+
+
+ ))} +
+ +
+
+

The decision

+

Which formula fits your routine?

+

+ Start with the tension you care about most. Simplicity can make + rose clearer, but structure can make the ritual more satisfying. +

+
+ +
+

+ By now, the right rose is probably obvious: the bottle whose + drawback annoys you the least and whose personality sounds the most + like your own. +

+

+ If the late-2010s nostalgia still has you, the Mario Badescu photo + is worth one more click so you can look at the current formula + yourself before deciding whether the dyes end the romance. +

+

+ Whamisa answers that light little mist with a toner that almost + behaves like a serum, which makes its photo the one to click when + you want to see whether the aloe base and fermented flowers are + rich enough to earn an extra step. +

+

+ That modern richness makes Santa Maria Novella feel even more + old-world by comparison; click its photo for the Damask-rose + apothecary ritual, because sometimes the ritual is honestly the + entire point. +

+

+ Chantecaille takes the drama away again and gives minimalists a very + good reason to click its photo: two ingredients, Rose de Mai, and + nowhere for the formula to hide. +

+

+ Sisley-Paris brings us back to the traditional toner, so its photo + is the one to open if rose, cornflower, witch hazel, and a cotton + pad sound more satisfying than another mist. +

+

+ Fresh makes that traditional step feel a little more romantic + again, so its photo is the one to click if glycerin, hyaluronic + acid, and a very committed rose formula sound like your kind of + finale. +

+
+ +

+ To shop, click any product photo above. Each of the six goes straight + to the same product page we used while reviewing it, so you can + compare the formulas for yourself before choosing—and then come back, + because we will keep testing the bottles that make skincare feel less + like a chore and more like a small daily ritual. +

+
+ +
+
+ DS +

+ Downs Style Studio · archive, voice, and editorial preview. +
+ Not yet published on Downs Style. +

+
+ + Explore all 258 posts + +
+
+ ); +} diff --git a/docs/continuations/charles/rose-toners-share/app/site-header.tsx b/docs/continuations/charles/rose-toners-share/app/site-header.tsx new file mode 100644 index 000000000..51781b693 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/app/site-header.tsx @@ -0,0 +1,36 @@ +import Link from "next/link"; + +type StudioSection = "article" | "archive" | "voice" | "compare"; + +const navigation: Array<{ + href: string; + label: string; + section: StudioSection; +}> = [ + { href: "/", label: "Article", section: "article" }, + { href: "/archive", label: "All 258 posts", section: "archive" }, + { href: "/voice", label: "Voice system", section: "voice" }, + { href: "/compare", label: "Compare drafts", section: "compare" }, +]; + +export function SiteHeader({ active }: { active: StudioSection }) { + return ( +
+ + DS + Downs Style Studio + + +
+ ); +} diff --git a/docs/continuations/charles/rose-toners-share/app/voice/page.tsx b/docs/continuations/charles/rose-toners-share/app/voice/page.tsx new file mode 100644 index 000000000..4e3b56caa --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/app/voice/page.tsx @@ -0,0 +1,274 @@ +import type { Metadata } from "next"; +import { SiteHeader } from "../site-header"; + +export const metadata: Metadata = { + title: "Charles's voice system | Downs Style Studio", + description: + "An evidence-backed voice system derived from Charles Downs's complete public archive, with writing moves, guardrails, and channel-ready guidance.", + openGraph: { + title: "Charles's voice was already there", + description: + "The complete Downs Style archive, assembled into a durable Natural Center and practical editorial profile.", + images: [ + { + url: "/og-archive.png", + width: 1672, + height: 941, + alt: "Downs Style Studio archive and voice system", + }, + ], + }, + twitter: { + card: "summary_large_image", + images: ["/og-archive.png"], + }, +}; + +const naturalCenter = [ + { + number: "01", + title: "Thematic core", + copy: "Luxury becomes believable when Charles meets it in a real ritual: a candle at home, a product on skin, or a piece of clothing in motion.", + }, + { + number: "02", + title: "Aesthetic signature", + copy: "Warm, intimate, sensory, and aspirational without becoming remote. High-low comparisons keep beautiful things connected to ordinary life.", + }, + { + number: "03", + title: "Tonal vector", + copy: "Personal discovery moves into genuine excitement, then an honest qualification, and finally a clear verdict.", + }, + { + number: "04", + title: "Narrative bias", + copy: "Experience leads. Charles notices something, tries it, describes what changed, checks the downside, and decides whether it earns a place.", + }, + { + number: "05", + title: "Symbolic markers", + copy: "Favorites, rituals, seasons, texture, scent, glow, comfort, and the small ceremony of making an everyday step feel special.", + }, + { + number: "06", + title: "Negative space", + copy: "No catalogue voice, clinical omniscience, anonymous brand copy, invented results, or enthusiasm that never admits a drawback.", + }, + { + number: "07", + title: "Brand embedding", + copy: "Downs Style is a personal point of view before it is a publication. Write from I by default; use we only when the team is truly speaking.", + }, +]; + +const writingMoves = [ + ["Notice", "Begin with the encounter: where it appeared, who mentioned it, or why this particular moment made it matter."], + ["Try", "Put Charles in the scene. The reader should understand the ritual before receiving the conclusion."], + ["Feel", "Name texture, scent, fit, mood, or atmosphere in plain language before reaching for technical detail."], + ["Qualify", "Let however, although, or an intimate aside complicate the excitement. The drawback is part of the personality."], + ["Decide", "End with a preference, rating, recommendation, or shop cue. Charles does not disappear before the verdict."], +] as const; + +const runway = [ + { + number: "01", + title: "How to properly let a candle burn", + copy: "A practical ritual story: first burn, wick care, tunneling, scent throw, and the common mistakes that waste a beautiful candle.", + }, + { + number: "02", + title: "Transcend Cosmetics becomes Transcend Essentials", + copy: "A rebrand story about the name changing because the world around the product became larger than cosmetics.", + }, + { + number: "03", + title: "The summer fabric sequence", + copy: "Cotton first, silk second, then a head-to-head piece asking which fabric wins each garment and part of the body.", + }, +]; + +export default function VoicePage() { + return ( +
+ + +
+
+

The Charles Downs Natural Center

+

+ His voice was + already there. +

+
+
+

+ We did not invent a persona. We read the full public record, + separated Charles's durable instincts from changing blog formats, + and assembled the pattern into a system future posts can actually + use. +

+ 257-post causal baseline · 2017—2024 +
+
+ +
+
+ 76,597 + alphabetic tokens in the historical baseline +
+
+ 45.01 + I / me / my / mine uses per 1,000 words +
+
+ 0.98 + we / us / our uses per 1,000 words +
+
+ 226× + “I love” across the archive baseline +
+
+ +
+
+

The clearest finding

+

I is the fingerprint.

+
+
+

+ Charles's historical voice is not an anonymous editorial we. His + first-person singular language appears roughly forty-six times as + often as the plural form. +

+

+ That matters. The reader returns for a person making a choice in + public—“my favorite,” “I have to say,” “overall I”—not a brand + smoothing every reaction into consensus. +

+
+
+ +
+
+

The assembled center

+

Seven parts. One recognizable point of view.

+

+ The Natural Center holds what stays true even as the subject shifts + from a face mask to a candle, a hotel, or a cotton shirt. +

+
+
+ {naturalCenter.map((item) => ( +
+ {item.number} +

{item.title}

+

{item.copy}

+
+ ))} +
+
+ +
+
+

The architecture

+

Evidence in. Charles out.

+
+
+
+ 01 · Corpus + 258 public posts +

Titles, dates, categories, structure, cadence, and recurring language.

+
+ +
+ 02 · Natural Center + Durable identity +

The themes, tone, movement, symbols, limits, and brand relationship that persist.

+
+ +
+ 03 · Channel profile + Usable rules +

Paragraph shape, point of view, editorial moves, myth checks, and platform-specific delivery.

+
+
+
+ +
+
+

The sentence-to-sentence movement

+

Excitement earns trust when it checks itself.

+
+
    + {writingMoves.map(([title, copy], index) => ( +
  1. + {String(index + 1).padStart(2, "0")} +

    {title}

    +

    {copy}

    +
  2. + ))} +
+
+ +
+
+

Keep

+

The reaction.

+
    +
  • Personal discovery and specific use context
  • +
  • Enthusiasm before an honest drawback
  • +
  • Plain sensory language and accessible luxury
  • +
  • Single-thought paragraphs with a decisive ending
  • +
+
+
+

Remove

+

The residue.

+
    +
  • Typos, run-ons, and repeated filler
  • +
  • Copied brand language and ingredient catalogues
  • +
  • Medical promises or universal suitability claims
  • +
  • Generic SEO structure mistaken for Charles's voice
  • +
+
+
+ +
+
+

What this system writes next

+

Three ideas. One connected summer sequence.

+

+ Each section gets a compact myth check beside the main story: name + the common error, explain why it persists, and replace it with one + useful decision. +

+
+
+ {runway.map((item) => ( +
+ {item.number} +

{item.title}

+

{item.copy}

+
+ ))} +
+
+ + +
+ ); +} diff --git a/docs/continuations/charles/rose-toners-share/build/sites-vite-plugin.ts b/docs/continuations/charles/rose-toners-share/build/sites-vite-plugin.ts new file mode 100644 index 000000000..26563fdd7 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/build/sites-vite-plugin.ts @@ -0,0 +1,45 @@ +import { access, cp, mkdir, rm } from "node:fs/promises"; +import { resolve } from "node:path"; +import type { Plugin } from "vite"; + +async function exists(path: string): Promise { + try { + await access(path); + return true; + } catch (error) { + if ((error as NodeJS.ErrnoException).code === "ENOENT") { + return false; + } + throw error; + } +} + +// Packages Sites metadata and migrations after Vite finishes compiling. +export function sites(): Plugin { + let root = process.cwd(); + + return { + name: "sites", + apply: "build", + configResolved(config) { + root = config.root; + }, + async closeBundle() { + const outputDirectory = resolve(root, "dist", ".openai"); + const hostingConfig = resolve(root, ".openai", "hosting.json"); + const drizzleSource = resolve(root, "drizzle"); + + await rm(outputDirectory, { recursive: true, force: true }); + await mkdir(outputDirectory, { recursive: true }); + + if (await exists(hostingConfig)) { + await cp(hostingConfig, resolve(outputDirectory, "hosting.json")); + } + if (await exists(drizzleSource)) { + await cp(drizzleSource, resolve(outputDirectory, "drizzle"), { + recursive: true, + }); + } + }, + }; +} diff --git a/docs/continuations/charles/rose-toners-share/data/posts.json b/docs/continuations/charles/rose-toners-share/data/posts.json new file mode 100644 index 000000000..582c3efea --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/data/posts.json @@ -0,0 +1,2324 @@ +[ + { + "publishedDate": "2026-08-02", + "year": "2026", + "category": "Skincare", + "title": "Rose Water and the benefits behind our favorite flower", + "url": "https://www.downsstyle.com/skincare/2026/8/1/rose-toners-and-the-benefits-behind-our-favorite-scent", + "author": "Chas Downs", + "wordCount": 724 + }, + { + "publishedDate": "2024-08-30", + "year": "2024", + "category": "Skincare", + "title": "Youth TO The People Superfood Body Cleanser Review", + "url": "https://www.downsstyle.com/skincare/2024/8/29/youth-to-the-people-superfood-cleanser-review", + "author": "Chas Downs", + "wordCount": 397 + }, + { + "publishedDate": "2024-08-05", + "year": "2024", + "category": "Candles", + "title": "Alternatives to Scented Candles for Home Fragrance", + "url": "https://www.downsstyle.com/new-blog/2024/8/5/wrj3wxvoryz1gbpy79jysuiuey4mk1", + "author": "Chas Downs", + "wordCount": 364 + }, + { + "publishedDate": "2024-07-25", + "year": "2024", + "category": "Look Book", + "title": "Why the quality of your clothes has changed in the last 20 years", + "url": "https://www.downsstyle.com/look-book/2024/7/24/uwy46xpteq1xpy5hmnav5dtyv0dl6k", + "author": "Chas Downs", + "wordCount": 994 + }, + { + "publishedDate": "2024-07-21", + "year": "2024", + "category": "Travel", + "title": "Discover eco-friendly travel spots for the upcoming year", + "url": "https://www.downsstyle.com/travel/2024/7/19/to4fztwwiq3s6bqnizcrswuhrz5wrv", + "author": "Chas Downs", + "wordCount": 546 + }, + { + "publishedDate": "2024-07-17", + "year": "2024", + "category": "Look Book", + "title": "Elevate Your Style: Discover 10 Sustainable Fashion Brands That Are Changing the Game!", + "url": "https://www.downsstyle.com/look-book/2024/7/16/elevate-your-style-discover-10-sustainable-fashion-brands-that-are-changing-the-game", + "author": "Chas Downs", + "wordCount": 247 + }, + { + "publishedDate": "2024-07-15", + "year": "2024", + "category": "Travel", + "title": "Best Credit Cards for Travel", + "url": "https://www.downsstyle.com/travel/2024/7/15/tx3qv98wj0dtow7f17pbrz8yuyl0b7", + "author": "Chas Downs", + "wordCount": 548 + }, + { + "publishedDate": "2024-07-13", + "year": "2024", + "category": "Eat", + "title": "Organic Meal Kits: The Solution to Quick, Healthy, and Delicious Meals", + "url": "https://www.downsstyle.com/new-blog-2/2024/7/13/organic-meal-kits-the-solution-to-quick-healthy-and-delicious-meals", + "author": "Chas Downs", + "wordCount": 364 + }, + { + "publishedDate": "2024-07-08", + "year": "2024", + "category": "Skincare", + "title": "Biossance Skincare Review", + "url": "https://www.downsstyle.com/skincare/2024/7/8/biossance-skincare-review", + "author": "Chas Downs", + "wordCount": 336 + }, + { + "publishedDate": "2024-07-06", + "year": "2024", + "category": "Skincare", + "title": "Kopari Golden Aura Body Oil Review", + "url": "https://www.downsstyle.com/skincare/2024/7/5/kopari-golden-aura-body-oil-review", + "author": "Chas Downs", + "wordCount": 136 + }, + { + "publishedDate": "2024-07-05", + "year": "2024", + "category": "Look Book", + "title": "How to Dress for Your Body Type", + "url": "https://www.downsstyle.com/look-book/2024/7/5/how-to-dress-for-your-body-type", + "author": "Chas Downs", + "wordCount": 568 + }, + { + "publishedDate": "2024-07-04", + "year": "2024", + "category": "Skincare", + "title": "Ligne St. Barth Vanilla Body Lotion", + "url": "https://www.downsstyle.com/skincare/2024/7/4/st-barth-vanilla-body-lotion", + "author": "Chas Downs", + "wordCount": 238 + }, + { + "publishedDate": "2024-07-04", + "year": "2024", + "category": "Masks", + "title": "Burts Bees Renewing Sheet Mask Review", + "url": "https://www.downsstyle.com/masks/2024/7/4/burts-bees-calming-sheet-mask-review", + "author": "Chas Downs", + "wordCount": 332 + }, + { + "publishedDate": "2024-07-04", + "year": "2024", + "category": "Look Book", + "title": "How I Score Designer Clothing at Affordable Prices", + "url": "https://www.downsstyle.com/look-book/2024/7/4/how-i-score-designer-clothing-at-affordable-prices", + "author": "Chas Downs", + "wordCount": 302 + }, + { + "publishedDate": "2024-07-03", + "year": "2024", + "category": "Gift Inspo", + "title": "Celebrate Independence Day with Incredible Sales: Perfect Gifts for Your Loved Ones", + "url": "https://www.downsstyle.com/gifts/2024/7/3/celebrate-independence-day-with-incredible-sales-perfect-gifts-for-your-loved-ones", + "author": "Chas Downs", + "wordCount": 655 + }, + { + "publishedDate": "2024-07-02", + "year": "2024", + "category": "Workouts/Diet", + "title": "My favorite Weight-Free Core Exercise", + "url": "https://www.downsstyle.com/workoutsdiet/2024/7/2/my-ab-workout", + "author": "Chas Downs", + "wordCount": 154 + }, + { + "publishedDate": "2024-07-02", + "year": "2024", + "category": "Eat", + "title": "Snack Cravings? Try these Vegan Snacks Out", + "url": "https://www.downsstyle.com/new-blog-2/2024/7/2/snack-cravings-try-these-vegan-snacks-out", + "author": "Chas Downs", + "wordCount": 396 + }, + { + "publishedDate": "2024-07-02", + "year": "2024", + "category": "Eat", + "title": "Meal Prep 101: How to Get Started and Stay Organized", + "url": "https://www.downsstyle.com/new-blog-2/2024/7/2/meal-prep-101-how-to-get-started-and-stay-organized", + "author": "Chas Downs", + "wordCount": 313 + }, + { + "publishedDate": "2024-07-01", + "year": "2024", + "category": "Look Book", + "title": "Why I Only Wear Linen in the Summer", + "url": "https://www.downsstyle.com/look-book/2024/7/1/why-i-only-wear-linen-in-the-summer", + "author": "Chas Downs", + "wordCount": 174 + }, + { + "publishedDate": "2024-06-30", + "year": "2024", + "category": "Skincare", + "title": "Honest Beauty Skincare Review", + "url": "https://www.downsstyle.com/skincare/2024/6/29/honest-beauty-skincare-review", + "author": "Chas Downs", + "wordCount": 346 + }, + { + "publishedDate": "2024-06-30", + "year": "2024", + "category": "Eat", + "title": "Why I switched from Milk to Oat Malk", + "url": "https://www.downsstyle.com/new-blog-2/2024/6/30/why-i-switched-from-milk-to-oat-malk", + "author": "Chas Downs", + "wordCount": 387 + }, + { + "publishedDate": "2024-06-29", + "year": "2024", + "category": "Skincare", + "title": "Tom Ford Shimmering Body Oil Review", + "url": "https://www.downsstyle.com/skincare/2024/6/29/tom-ford-shimmering-body-oil-review", + "author": "Chas Downs", + "wordCount": 175 + }, + { + "publishedDate": "2024-06-28", + "year": "2024", + "category": "Skincare", + "title": "Inn Beauty Pimple Paste Review", + "url": "https://www.downsstyle.com/skincare/2024/6/28/inn-beauty-pimple-cream-review", + "author": "Chas Downs", + "wordCount": 108 + }, + { + "publishedDate": "2024-06-27", + "year": "2024", + "category": "Look Book", + "title": "My Favorite Bathing Suit Brands", + "url": "https://www.downsstyle.com/look-book/2024/6/27/my-favorite-bathing-suit-brands", + "author": "Chas Downs", + "wordCount": 487 + }, + { + "publishedDate": "2024-06-24", + "year": "2024", + "category": "Skincare", + "title": "DōTERRA Sunscreen Review", + "url": "https://www.downsstyle.com/skincare/2024/6/24/dterra-sunscreen-review", + "author": "Chas Downs", + "wordCount": 201 + }, + { + "publishedDate": "2023-11-29", + "year": "2023", + "category": "Skincare", + "title": "Depology Skincare Review", + "url": "https://www.downsstyle.com/skincare/2023/11/29/depology-skincare-review", + "author": "Chas Downs", + "wordCount": 287 + }, + { + "publishedDate": "2023-11-22", + "year": "2023", + "category": "Look Book", + "title": "Rag and Bone Essentials", + "url": "https://www.downsstyle.com/look-book/2023/11/22/rag-and-bone-essentials", + "author": "Chas Downs", + "wordCount": 147 + }, + { + "publishedDate": "2023-10-03", + "year": "2023", + "category": "Skincare", + "title": "Santa Maria Novella Sulfur Soap", + "url": "https://www.downsstyle.com/skincare/2023/10/3/santa-maria-novella-sulfur-soap", + "author": "Chas Downs", + "wordCount": 313 + }, + { + "publishedDate": "2023-08-17", + "year": "2023", + "category": "Skincare", + "title": "Spalife Gold & Silver Serum Review", + "url": "https://www.downsstyle.com/skincare/2023/8/17/spalife-gold-amp-silver-serum-review", + "author": "Chas Downs", + "wordCount": 514 + }, + { + "publishedDate": "2023-08-04", + "year": "2023", + "category": "Look Book", + "title": "My favorite shorts for Summer", + "url": "https://www.downsstyle.com/look-book/2023/8/4/my-favorite-shorts-for-summer", + "author": "Chas Downs", + "wordCount": 88 + }, + { + "publishedDate": "2023-08-02", + "year": "2023", + "category": "Skincare", + "title": "My favorite Beauty Tools/Machines", + "url": "https://www.downsstyle.com/skincare/2023/8/2/my-favorite-beauty-toolsmachines", + "author": "Chas Downs", + "wordCount": 229 + }, + { + "publishedDate": "2023-07-22", + "year": "2023", + "category": "Skincare", + "title": "Dr Jart + Skincare Review", + "url": "https://www.downsstyle.com/skincare/2023/7/22/dr-jart-skincare-review", + "author": "Chas Downs", + "wordCount": 397 + }, + { + "publishedDate": "2023-07-19", + "year": "2023", + "category": "Skincare", + "title": "Piel Eterna Review", + "url": "https://www.downsstyle.com/skincare/2023/7/19/piel-eterna-review", + "author": "Chas Downs", + "wordCount": 276 + }, + { + "publishedDate": "2023-07-09", + "year": "2023", + "category": "Masks", + "title": "Peace Out Puffy Eyes Review", + "url": "https://www.downsstyle.com/masks/2023/7/9/peace-out-puffy-eyes-review", + "author": "Chas Downs", + "wordCount": 336 + }, + { + "publishedDate": "2023-07-06", + "year": "2023", + "category": "Masks", + "title": "Spascriptions Cucumber Hydrogel Under-Eye Pads", + "url": "https://www.downsstyle.com/masks/2023/7/6/xgdpt8d1ru6dhzdofhmslbtd1786rh", + "author": "Chas Downs", + "wordCount": 373 + }, + { + "publishedDate": "2023-07-01", + "year": "2023", + "category": "Candles", + "title": "Boy Smells Candle Review", + "url": "https://www.downsstyle.com/new-blog/2023/7/1/boy-smells-candle-review", + "author": "Chas Downs", + "wordCount": 396 + }, + { + "publishedDate": "2023-06-30", + "year": "2023", + "category": "Skincare", + "title": "Chanel Skincare Review", + "url": "https://www.downsstyle.com/skincare/2023/6/30/chanel-skincare-review", + "author": "Chas Downs", + "wordCount": 429 + }, + { + "publishedDate": "2023-06-30", + "year": "2023", + "category": "Candles", + "title": "Illuminaria Candle Review", + "url": "https://www.downsstyle.com/new-blog/2023/6/30/illuminaria-candle-review", + "author": "Chas Downs", + "wordCount": 287 + }, + { + "publishedDate": "2023-06-29", + "year": "2023", + "category": "Candles", + "title": "Gourmand Rose Candle Review", + "url": "https://www.downsstyle.com/new-blog/2023/6/29/gourmand-rose-candle-review", + "author": "Chas Downs", + "wordCount": 232 + }, + { + "publishedDate": "2023-06-28", + "year": "2023", + "category": "Skincare", + "title": "Transcend Cosmetics Luxurious Lavender Rollerball Review", + "url": "https://www.downsstyle.com/skincare/2023/6/28/transcend-cosmetics-rose-geranium-rollerball-review", + "author": "Chas Downs", + "wordCount": 406 + }, + { + "publishedDate": "2023-06-28", + "year": "2023", + "category": "Masks", + "title": "Glamglow Brightmud Eye Treatment", + "url": "https://www.downsstyle.com/masks/2023/6/28/glamglow-brightmud-eye-treatment", + "author": "Chas Downs", + "wordCount": 571 + }, + { + "publishedDate": "2023-06-28", + "year": "2023", + "category": "Candles", + "title": "\"Lavitate\" Organic Beeswax Candle Review", + "url": "https://www.downsstyle.com/new-blog/2023/6/28/lavitate-organic-beeswax-candle", + "author": "Chas Downs", + "wordCount": 394 + }, + { + "publishedDate": "2023-06-26", + "year": "2023", + "category": "Skincare", + "title": "Sol de Janiero Bum Bum Cream Review", + "url": "https://www.downsstyle.com/skincare/2023/6/26/sol-de-janiero-skincare-for-body", + "author": "Chas Downs", + "wordCount": 573 + }, + { + "publishedDate": "2023-06-26", + "year": "2023", + "category": "Masks", + "title": "Tata Harper Resurfacing Mask", + "url": "https://www.downsstyle.com/masks/2023/6/26/tata-harper-resurfacing-mask", + "author": "Chas Downs", + "wordCount": 617 + }, + { + "publishedDate": "2023-06-25", + "year": "2023", + "category": "Masks", + "title": "Sulwashoo Radiance Energy Mask", + "url": "https://www.downsstyle.com/masks/2023/6/25/dq73o0f5x4yll5fp4hj8idsavj7a1j", + "author": "Chas Downs", + "wordCount": 581 + }, + { + "publishedDate": "2023-06-24", + "year": "2023", + "category": "Skincare", + "title": "Dr. Barbara Sturm Night Serum", + "url": "https://www.downsstyle.com/skincare/2023/6/24/dr-barbara-sturm", + "author": "Chas Downs", + "wordCount": 412 + }, + { + "publishedDate": "2023-06-15", + "year": "2023", + "category": "Skincare", + "title": "Elf Skin Review", + "url": "https://www.downsstyle.com/skincare/2023/6/15/elf-skin-review", + "author": "Chas Downs", + "wordCount": 265 + }, + { + "publishedDate": "2023-06-13", + "year": "2023", + "category": "Gift Inspo", + "title": "Fathers Day Gift Guide", + "url": "https://www.downsstyle.com/gifts/2023/6/13/fathers-day-gift-guide", + "author": "Chas Downs", + "wordCount": 73 + }, + { + "publishedDate": "2023-06-11", + "year": "2023", + "category": "Skincare", + "title": "Dermalogica Skincare Review", + "url": "https://www.downsstyle.com/skincare/2023/6/11/dermatologica-skincare-review", + "author": "Chas Downs", + "wordCount": 304 + }, + { + "publishedDate": "2023-06-09", + "year": "2023", + "category": "Gift Inspo", + "title": "Crystals I would gift my besties", + "url": "https://www.downsstyle.com/gifts/2023/6/9/crystals-i-would-gift-my-besties", + "author": "Chas Downs", + "wordCount": 311 + }, + { + "publishedDate": "2023-06-08", + "year": "2023", + "category": "Workouts/Diet", + "title": "My Yoga Routine", + "url": "https://www.downsstyle.com/workoutsdiet/2023/6/8/my-yoga-routine", + "author": "Chas Downs", + "wordCount": 108 + }, + { + "publishedDate": "2023-06-08", + "year": "2023", + "category": "Look Book", + "title": "White for Summer", + "url": "https://www.downsstyle.com/look-book/2023/6/8/white-for-summer", + "author": "Chas Downs", + "wordCount": 97 + }, + { + "publishedDate": "2023-06-08", + "year": "2023", + "category": "Eat", + "title": "My favorite Salads", + "url": "https://www.downsstyle.com/new-blog-2/2023/6/8/my-favorite-salads", + "author": "Chas Downs", + "wordCount": 116 + }, + { + "publishedDate": "2023-06-07", + "year": "2023", + "category": "Workouts/Diet", + "title": "Juice Diet", + "url": "https://www.downsstyle.com/workoutsdiet/2023/6/7/juice-diet", + "author": "Chas Downs", + "wordCount": 85 + }, + { + "publishedDate": "2023-06-07", + "year": "2023", + "category": "Look Book", + "title": "Jewelry to level up any outfit", + "url": "https://www.downsstyle.com/look-book/2023/6/7/jewelry-to-level-up-any-outfit", + "author": "Chas Downs", + "wordCount": 282 + }, + { + "publishedDate": "2023-06-06", + "year": "2023", + "category": "Workouts/Diet", + "title": "Keto Diet", + "url": "https://www.downsstyle.com/workoutsdiet/2023/6/6/keto-diet", + "author": "Chas Downs", + "wordCount": 106 + }, + { + "publishedDate": "2023-06-06", + "year": "2023", + "category": "Look Book", + "title": "Summer Outfits", + "url": "https://www.downsstyle.com/look-book/2023/6/6/summer-outfits", + "author": "Chas Downs", + "wordCount": 120 + }, + { + "publishedDate": "2023-06-06", + "year": "2023", + "category": "Interior Design", + "title": "Vases for your flowers", + "url": "https://www.downsstyle.com/new-blog-1/2023/6/6/vases-for-your-flowers", + "author": "Chas Downs", + "wordCount": 73 + }, + { + "publishedDate": "2023-06-06", + "year": "2023", + "category": "Eat", + "title": "Steak Houses I love in Miami", + "url": "https://www.downsstyle.com/new-blog-2/2023/6/6/steak-houses-i-love-in-miami", + "author": "Chas Downs", + "wordCount": 66 + }, + { + "publishedDate": "2023-06-04", + "year": "2023", + "category": "Skincare", + "title": "Savannah Bee Company Review", + "url": "https://www.downsstyle.com/skincare/2023/6/4/savannah-bee-company-review", + "author": "Chas Downs", + "wordCount": 95 + }, + { + "publishedDate": "2023-06-01", + "year": "2023", + "category": "Interior Design", + "title": "Cool finds for Home", + "url": "https://www.downsstyle.com/new-blog-1/2023/6/1/e7xw93oyn2vpts9gix00eg4e0sery2", + "author": "Chas Downs", + "wordCount": 88 + }, + { + "publishedDate": "2022-01-22", + "year": "2022", + "category": "Eat", + "title": "Juice Cleanse & Why", + "url": "https://www.downsstyle.com/new-blog-2/2018/4/28/juice-cleanse-why", + "author": "Chas Downs", + "wordCount": 197 + }, + { + "publishedDate": "2022-01-18", + "year": "2022", + "category": "Eat", + "title": "Best Places to Eat in New York", + "url": "https://www.downsstyle.com/new-blog-2/2018/4/28/best-places-to-eat-in-new-york", + "author": "Chas Downs", + "wordCount": 131 + }, + { + "publishedDate": "2022-01-11", + "year": "2022", + "category": "Skincare", + "title": "Biossance Skincare Review", + "url": "https://www.downsstyle.com/skincare/2022/1/11/j7chyg49uqr314ka1p49xocjxch6zh", + "author": "Chas Downs", + "wordCount": 412 + }, + { + "publishedDate": "2022-01-07", + "year": "2022", + "category": "Look Book", + "title": "Accessories that spice up any outfit", + "url": "https://www.downsstyle.com/look-book/2022/1/7/z7kaewqyypo5yx8q3c93n4cxpo9v07", + "author": "Chas Downs", + "wordCount": 390 + }, + { + "publishedDate": "2022-01-06", + "year": "2022", + "category": "Skincare", + "title": "How to keep glowing skin", + "url": "https://www.downsstyle.com/skincare/2022/1/6/ez455l4mzmxas319jkj47kgjy4okc6", + "author": "Chas Downs", + "wordCount": 1094 + }, + { + "publishedDate": "2021-12-26", + "year": "2021", + "category": "Workouts/Diet", + "title": "At Home Workout Essentials", + "url": "https://www.downsstyle.com/workoutsdiet/2020/4/28/at-home-workout-essentials", + "author": "Chas Downs", + "wordCount": 121 + }, + { + "publishedDate": "2021-12-23", + "year": "2021", + "category": "Interior Design", + "title": "10 Pieces you need in your home", + "url": "https://www.downsstyle.com/new-blog-1/2018/6/27/10-pieces-you-need-in-your-home", + "author": "Chas Downs", + "wordCount": 106 + }, + { + "publishedDate": "2021-12-21", + "year": "2021", + "category": "Look Book", + "title": "Basics You Need In Your Closet", + "url": "https://www.downsstyle.com/look-book/2020/4/28/basics-you-need-in-your-closet", + "author": "Chas Downs", + "wordCount": 231 + }, + { + "publishedDate": "2021-12-21", + "year": "2021", + "category": "Gift Inspo", + "title": "Gifts I would give to friends", + "url": "https://www.downsstyle.com/gifts/2018/4/28/gifts-i-would-give-to-friends", + "author": "Chas Downs", + "wordCount": 131 + }, + { + "publishedDate": "2021-12-11", + "year": "2021", + "category": "Interior Design", + "title": "Cool Lamps to ditch overhead lighting", + "url": "https://www.downsstyle.com/new-blog-1/2021/6/19/eds62j64c2p5tjf3rmj90md6idkdn5", + "author": "Chas Downs", + "wordCount": 50 + }, + { + "publishedDate": "2021-12-11", + "year": "2021", + "category": "Gift Inspo", + "title": "Gifts that are great for all, this Holiday Season", + "url": "https://www.downsstyle.com/gifts/2021/12/11/76hfpq9t6xyhxtd82nhxrg4ou8g0xj", + "author": "Chas Downs", + "wordCount": 102 + }, + { + "publishedDate": "2021-12-10", + "year": "2021", + "category": "Eat", + "title": "Foods to help your skin", + "url": "https://www.downsstyle.com/new-blog-2/2021/12/9/0gu8w9kw5rmz6ucqlczsh0e27drpc0", + "author": "Chas Downs", + "wordCount": 1195 + }, + { + "publishedDate": "2021-11-30", + "year": "2021", + "category": "Eat", + "title": "Organic Ice Cream Recipe", + "url": "https://www.downsstyle.com/new-blog-2/2021/11/30/cj969cmdelgbd5onlq9reazoyd2ywl", + "author": "Chas Downs", + "wordCount": 144 + }, + { + "publishedDate": "2021-11-19", + "year": "2021", + "category": "Skincare", + "title": "5 benefits of Organic Skincare products vs drug store products", + "url": "https://www.downsstyle.com/skincare/2021/11/19/5-benefits-of-organic-skincare-products-vs-drug-store-products", + "author": "Chas Downs", + "wordCount": 457 + }, + { + "publishedDate": "2021-11-19", + "year": "2021", + "category": "Candles", + "title": "Why Organic Beeswax Candles are the best Wax to burn", + "url": "https://www.downsstyle.com/new-blog/2021/11/19/why-organic-beeswax-candles-are-the-best-wax-to-burn", + "author": "Chas Downs", + "wordCount": 464 + }, + { + "publishedDate": "2021-11-15", + "year": "2021", + "category": "Skincare", + "title": "Kate Somerville Anti Aging Skincare Routine Review", + "url": "https://www.downsstyle.com/skincare/2021/11/15/kate-somerville-anti-aging-skincare-routine-review", + "author": "Chas Downs", + "wordCount": 607 + }, + { + "publishedDate": "2021-11-08", + "year": "2021", + "category": "Travel", + "title": "Midterm Portfolio Blog", + "url": "https://www.downsstyle.com/travel/2021/11/8/53uig13g12vetej0dagxp6x9kpy4dd", + "author": "Chas Downs", + "wordCount": 687 + }, + { + "publishedDate": "2021-09-08", + "year": "2021", + "category": "Travel", + "title": "Learning on the Go #ad", + "url": "https://www.downsstyle.com/travel/2021/9/8/jwqfs0xs8k94mtoh1uqhkla68jlhg8", + "author": "Chas Downs", + "wordCount": 280 + }, + { + "publishedDate": "2021-09-03", + "year": "2021", + "category": "Skincare", + "title": "Tatcha Skincare Review", + "url": "https://www.downsstyle.com/skincare/2021/9/3/cnoqrmcsdc734pj1g3ah4o5rl40aqt", + "author": "Chas Downs", + "wordCount": 567 + }, + { + "publishedDate": "2021-06-15", + "year": "2021", + "category": "Travel", + "title": "Water Bottles that are great on the Go", + "url": "https://www.downsstyle.com/travel/2021/6/15/water-bottles-that-are-great-on-the-go", + "author": "Chas Downs", + "wordCount": 319 + }, + { + "publishedDate": "2021-06-15", + "year": "2021", + "category": "Gift Inspo", + "title": "Amazon Gifts that are good for all types of people", + "url": "https://www.downsstyle.com/gifts/2020/7/7/amazon-gifts-that-is-good-for-all-types-of-people", + "author": "Chas Downs", + "wordCount": 104 + }, + { + "publishedDate": "2021-06-14", + "year": "2021", + "category": "Skincare", + "title": "Transcend Cosmetics Sunscreen", + "url": "https://www.downsstyle.com/skincare/2021/6/14/transcend-cosmetics-sunscreen", + "author": "Chas Downs", + "wordCount": 540 + }, + { + "publishedDate": "2021-06-14", + "year": "2021", + "category": "Look Book", + "title": "Sunglasses a way to Spice up your Outfit", + "url": "https://www.downsstyle.com/look-book/2020/8/7/sunglasses-a-way-to-spice-up-your-outfit", + "author": "Chas Downs", + "wordCount": 58 + }, + { + "publishedDate": "2021-06-14", + "year": "2021", + "category": "Look Book", + "title": "Outfits that will keep you cool this Summer", + "url": "https://www.downsstyle.com/look-book/2021/6/14/outfits-that-will-keep-you-cool-this-summer", + "author": "Chas Downs", + "wordCount": 299 + }, + { + "publishedDate": "2021-05-21", + "year": "2021", + "category": "Skincare", + "title": "Chantecaille Skincare Review", + "url": "https://www.downsstyle.com/skincare/2021/5/21/chantecaille-skincare-review", + "author": "Chas Downs", + "wordCount": 376 + }, + { + "publishedDate": "2021-05-21", + "year": "2021", + "category": "Masks", + "title": "Chantecaille Hibiscus Smoothing Mask", + "url": "https://www.downsstyle.com/masks/2021/5/21/chantecaille-hibiscus-smoothing-mask", + "author": "Chas Downs", + "wordCount": 260 + }, + { + "publishedDate": "2021-05-19", + "year": "2021", + "category": "Interior Design", + "title": "Plants that transform your home into a clean environment", + "url": "https://www.downsstyle.com/new-blog-1/2021/5/19/how-plants-transform-your-home-into-a-clean-environment", + "author": "Chas Downs", + "wordCount": 288 + }, + { + "publishedDate": "2020-12-07", + "year": "2020", + "category": "Skincare", + "title": "Amore Pacific Time Response Cream", + "url": "https://www.downsstyle.com/skincare/2020/12/7/amore-pacific-time-response-cream", + "author": "Chas Downs", + "wordCount": 221 + }, + { + "publishedDate": "2020-10-11", + "year": "2020", + "category": "Look Book", + "title": "Spring Outfits I love", + "url": "https://www.downsstyle.com/look-book/2020/10/11/spring-outfits-i-love", + "author": "Chas Downs", + "wordCount": 75 + }, + { + "publishedDate": "2020-10-01", + "year": "2020", + "category": "Skincare", + "title": "Oxy Total Care", + "url": "https://www.downsstyle.com/skincare/2020/10/1/oxy-total-care", + "author": "Chas Downs", + "wordCount": 282 + }, + { + "publishedDate": "2020-09-21", + "year": "2020", + "category": "Skincare", + "title": "Fenty Skin", + "url": "https://www.downsstyle.com/skincare/2020/9/21/fenty-skin", + "author": "Chas Downs", + "wordCount": 278 + }, + { + "publishedDate": "2020-09-18", + "year": "2020", + "category": "Skincare", + "title": "BeautyCounter Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/9/18/counterbeauty-skincare-review", + "author": "Chas Downs", + "wordCount": 456 + }, + { + "publishedDate": "2020-08-15", + "year": "2020", + "category": "Skincare", + "title": "Beekman 1802 Goat milk Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/8/15/beekman-1802-skincare-review", + "author": "Chas Downs", + "wordCount": 816 + }, + { + "publishedDate": "2020-08-12", + "year": "2020", + "category": "Skincare", + "title": "Juice Beauty Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/8/12/juice-beauty", + "author": "Chas Downs", + "wordCount": 682 + }, + { + "publishedDate": "2020-08-12", + "year": "2020", + "category": "Masks", + "title": "Transcend Cosmetics Hydrating and Reparative Mask", + "url": "https://www.downsstyle.com/masks/2020/8/12/transcend-cosmetics-hydrating-and-reparative-mask", + "author": "Chas Downs", + "wordCount": 324 + }, + { + "publishedDate": "2020-08-11", + "year": "2020", + "category": "Look Book", + "title": "Express Haul #ad", + "url": "https://www.downsstyle.com/look-book/2020/8/7/express-haul-ad", + "author": "Chas Downs", + "wordCount": 199 + }, + { + "publishedDate": "2020-08-06", + "year": "2020", + "category": "Look Book", + "title": "Bathing Suits you need to check out", + "url": "https://www.downsstyle.com/look-book/2020/8/6/bathing-suits-you-need-to-check-out", + "author": "Chas Downs", + "wordCount": 119 + }, + { + "publishedDate": "2020-08-03", + "year": "2020", + "category": "Skincare", + "title": "Self/ish Skincare", + "url": "https://www.downsstyle.com/skincare/2020/8/3/selfish-skincare", + "author": "Chas Downs", + "wordCount": 223 + }, + { + "publishedDate": "2020-07-30", + "year": "2020", + "category": "Skincare", + "title": "Glow Recipe Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/7/30/3gxxvcdsyd8wp37y7amv274q8i553d", + "author": "Chas Downs", + "wordCount": 411 + }, + { + "publishedDate": "2020-07-27", + "year": "2020", + "category": "Skincare", + "title": "Tata Harper Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/7/27/tata-harper-skincare-review", + "author": "Chas Downs", + "wordCount": 596 + }, + { + "publishedDate": "2020-07-27", + "year": "2020", + "category": "Look Book", + "title": "Summer Outfits I love", + "url": "https://www.downsstyle.com/look-book/2020/7/27/summer-outfits-i-love", + "author": "Chas Downs", + "wordCount": 119 + }, + { + "publishedDate": "2020-07-27", + "year": "2020", + "category": "Candles", + "title": "Beeswax Candles and why you need to make a switch", + "url": "https://www.downsstyle.com/new-blog/2020/7/27/beeswax-candles-and-why-you-need-to-make-a-switch", + "author": "Chas Downs", + "wordCount": 275 + }, + { + "publishedDate": "2020-07-05", + "year": "2020", + "category": "Skincare", + "title": "SkinFix Vegan Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/7/3/skinfix-vegan-skincare-review", + "author": "Chas Downs", + "wordCount": 516 + }, + { + "publishedDate": "2020-07-01", + "year": "2020", + "category": "Eat", + "title": "My favorite smoothie recipes", + "url": "https://www.downsstyle.com/new-blog-2/2020/7/1/my-favorite-smoothie-recipes", + "author": "Chas Downs", + "wordCount": 177 + }, + { + "publishedDate": "2020-07-01", + "year": "2020", + "category": "Eat", + "title": "Best Places to Eat in Miami", + "url": "https://www.downsstyle.com/new-blog-2/2018/4/28/best-places-to-eat-in-miami", + "author": "Chas Downs", + "wordCount": 387 + }, + { + "publishedDate": "2020-06-11", + "year": "2020", + "category": "Skincare", + "title": "Edible Beauty Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/6/11/edible-beauty-skincare-review", + "author": "Chas Downs", + "wordCount": 623 + }, + { + "publishedDate": "2020-05-29", + "year": "2020", + "category": "Skincare", + "title": "The Ordinary Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/28/the-ordinary-skincare-review", + "author": "Chas Downs", + "wordCount": 471 + }, + { + "publishedDate": "2020-05-26", + "year": "2020", + "category": "Skincare", + "title": "Olay Regenerist Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/26/olay-regenerist-skincare-review", + "author": "Chas Downs", + "wordCount": 497 + }, + { + "publishedDate": "2020-05-25", + "year": "2020", + "category": "Skincare", + "title": "Aveeno Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/25/8ar4dg2ytpyxe79m06gr5vzl4c43mj", + "author": "Chas Downs", + "wordCount": 405 + }, + { + "publishedDate": "2020-05-24", + "year": "2020", + "category": "Masks", + "title": "KORA Organics Noni Glow Sleeping Mask", + "url": "https://www.downsstyle.com/masks/2020/5/24/kora-organics-noni-glow-sleeping-mask", + "author": "Chas Downs", + "wordCount": 286 + }, + { + "publishedDate": "2020-05-23", + "year": "2020", + "category": "Skincare", + "title": "KORA Organics Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/23/kora-organics-skincare-review", + "author": "Chas Downs", + "wordCount": 503 + }, + { + "publishedDate": "2020-05-13", + "year": "2020", + "category": "Skincare", + "title": "Tom Ford Research Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/13/tom-ford-skincare-review-1", + "author": "Chas Downs", + "wordCount": 529 + }, + { + "publishedDate": "2020-05-12", + "year": "2020", + "category": "Skincare", + "title": "Bliss Brightening Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/12/bliss-brightening-skincare-review", + "author": "Chas Downs", + "wordCount": 396 + }, + { + "publishedDate": "2020-05-11", + "year": "2020", + "category": "Skincare", + "title": "La Roche-Posay Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/11/la-roche-posay-skincare-review", + "author": "Chas Downs", + "wordCount": 426 + }, + { + "publishedDate": "2020-05-10", + "year": "2020", + "category": "Skincare", + "title": "Honest Beauty/Company Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/10/honest-beautycompany-skincare-review", + "author": "Chas Downs", + "wordCount": 354 + }, + { + "publishedDate": "2020-05-08", + "year": "2020", + "category": "Skincare", + "title": "Burts Bees Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/8/burts-bees-skincare-review", + "author": "Chas Downs", + "wordCount": 453 + }, + { + "publishedDate": "2020-05-07", + "year": "2020", + "category": "Skincare", + "title": "Sisley Black Rose Precious Serum Review", + "url": "https://www.downsstyle.com/skincare/2020/5/6/sisley-black-rose-precious-serum", + "author": "Chas Downs", + "wordCount": 261 + }, + { + "publishedDate": "2020-05-06", + "year": "2020", + "category": "Skincare", + "title": "La Mer Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/4/28/la-mer-skincare-review", + "author": "Chas Downs", + "wordCount": 726 + }, + { + "publishedDate": "2020-05-05", + "year": "2020", + "category": "Skincare", + "title": "Harry's Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/5/5/harrys-skincare-review", + "author": "Chas Downs", + "wordCount": 315 + }, + { + "publishedDate": "2020-05-03", + "year": "2020", + "category": "Skincare", + "title": "Earth To Skin Review", + "url": "https://www.downsstyle.com/skincare/2020/5/3/i9l4nicj556zy15qbm63nvm93srz4i", + "author": "Chas Downs", + "wordCount": 292 + }, + { + "publishedDate": "2020-05-01", + "year": "2020", + "category": "Candles", + "title": "Tom Ford Candles", + "url": "https://www.downsstyle.com/new-blog/2020/4/28/tom-ford-candles-1", + "author": "Chas Downs", + "wordCount": 170 + }, + { + "publishedDate": "2020-04-28", + "year": "2020", + "category": "Workouts/Diet", + "title": "My Workout Routine", + "url": "https://www.downsstyle.com/workoutsdiet/2017/12/6/my-workout-routine", + "author": "Chas Downs", + "wordCount": 407 + }, + { + "publishedDate": "2020-04-20", + "year": "2020", + "category": "Masks", + "title": "First Aid Beauty Purifying Mask Review", + "url": "https://www.downsstyle.com/masks/2020/4/18/first-aid-beauty-purifying-mask-review", + "author": "Chas Downs", + "wordCount": 165 + }, + { + "publishedDate": "2020-04-18", + "year": "2020", + "category": "Masks", + "title": "Youth To The People Superberry Mask Review", + "url": "https://www.downsstyle.com/masks/2020/4/18/youth-to-the-people-superberry-mask-review", + "author": "Chas Downs", + "wordCount": 160 + }, + { + "publishedDate": "2020-04-18", + "year": "2020", + "category": "Masks", + "title": "Farmacy Vitamin C Mask Review", + "url": "https://www.downsstyle.com/masks/2020/4/18/farmacy-vitamin-c-mask-review", + "author": "Chas Downs", + "wordCount": 218 + }, + { + "publishedDate": "2020-03-17", + "year": "2020", + "category": "Skincare", + "title": "Laneige Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/3/17/y386tpvylmqzy1lqjg6lixehmxjepw", + "author": "Chas Downs", + "wordCount": 307 + }, + { + "publishedDate": "2020-03-15", + "year": "2020", + "category": "Travel", + "title": "CoronaVirus Essentials", + "url": "https://www.downsstyle.com/travel/2020/3/15/coronavirus", + "author": "Chas Downs", + "wordCount": 229 + }, + { + "publishedDate": "2020-03-15", + "year": "2020", + "category": "Skincare", + "title": "Lord Jones Royal Oil CBD Serum Review", + "url": "https://www.downsstyle.com/skincare/2020/3/15/lord-jones-royal-oil-cbd-serum-review", + "author": "Chas Downs", + "wordCount": 207 + }, + { + "publishedDate": "2020-03-15", + "year": "2020", + "category": "Skincare", + "title": "First Aid Beauty Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/3/15/first-aid-beauty-skincare-review", + "author": "Chas Downs", + "wordCount": 459 + }, + { + "publishedDate": "2020-03-14", + "year": "2020", + "category": "Skincare", + "title": "The Inkey List Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/3/10/zjl460v3b2d2xqux4oqughfc4xm3u0", + "author": "Chas Downs", + "wordCount": 276 + }, + { + "publishedDate": "2020-03-14", + "year": "2020", + "category": "Look Book", + "title": "Spring Outfit Inspo", + "url": "https://www.downsstyle.com/look-book/2020/3/14/vdk84jqyb4m64t44jtz02x6whx7m8z", + "author": "Chas Downs", + "wordCount": 78 + }, + { + "publishedDate": "2020-03-13", + "year": "2020", + "category": "Skincare", + "title": "Farmacy Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/3/13/h8z0c8vsgl7s8i0hfbhuf2cpqzswm4", + "author": "Chas Downs", + "wordCount": 354 + }, + { + "publishedDate": "2020-03-12", + "year": "2020", + "category": "Skincare", + "title": "Youth to the People Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/3/12/3qh2vgeu7qqefe8avektggt7uil4za", + "author": "Chas Downs", + "wordCount": 238 + }, + { + "publishedDate": "2020-03-11", + "year": "2020", + "category": "Skincare", + "title": "Caudalie Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/3/10/ml8yudguw8a5kzdm5hfgwv3drb91ir", + "author": "Chas Downs", + "wordCount": 348 + }, + { + "publishedDate": "2020-03-10", + "year": "2020", + "category": "Skincare", + "title": "Lancome Skincare Review", + "url": "https://www.downsstyle.com/skincare/2018/8/23/lancome-moisturizer", + "author": "Chas Downs", + "wordCount": 292 + }, + { + "publishedDate": "2020-03-09", + "year": "2020", + "category": "Skincare", + "title": "Murad Vitamin C Line is it even from an Orange?", + "url": "https://www.downsstyle.com/skincare/2020/3/9/e0hh55enl2ljrxp0a228awsizmwrui", + "author": "Chas Downs", + "wordCount": 281 + }, + { + "publishedDate": "2020-03-09", + "year": "2020", + "category": "Masks", + "title": "Zombie Pack Egg Tightening Mask?", + "url": "https://www.downsstyle.com/masks/2020/3/9/ncngcav0usq8d48u986708xjlbr8xj", + "author": "Chas Downs", + "wordCount": 261 + }, + { + "publishedDate": "2020-03-09", + "year": "2020", + "category": "Look Book", + "title": "Outfit Inspo", + "url": "https://www.downsstyle.com/look-book/2020/3/9/outfit-inspo", + "author": "Chas Downs", + "wordCount": 99 + }, + { + "publishedDate": "2020-03-03", + "year": "2020", + "category": "Skincare", + "title": "Dior Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/3/3/dior-skincare-review", + "author": "Chas Downs", + "wordCount": 596 + }, + { + "publishedDate": "2020-02-20", + "year": "2020", + "category": "Skincare", + "title": "Sunday Riley Power Couple Trio Review", + "url": "https://www.downsstyle.com/skincare/2020/2/20/sunday-riley-power-couple-trio-review", + "author": "Chas Downs", + "wordCount": 453 + }, + { + "publishedDate": "2020-02-11", + "year": "2020", + "category": "Skincare", + "title": "Kielh's Healthy Skin Squad Skincare Review", + "url": "https://www.downsstyle.com/skincare/2020/2/8/kielhs-healthy-skin-squad-skincare-review", + "author": "Chas Downs", + "wordCount": 295 + }, + { + "publishedDate": "2019-12-02", + "year": "2019", + "category": "Skincare", + "title": "Glamglow Review", + "url": "https://www.downsstyle.com/skincare/2019/12/2/yoipa7z83s10ghhwfagm1q3kcpc7tn", + "author": "Chas Downs", + "wordCount": 291 + }, + { + "publishedDate": "2019-10-16", + "year": "2019", + "category": "Skincare", + "title": "Shea Moisture Skincare Review", + "url": "https://www.downsstyle.com/skincare/2019/10/16/shea-moisture-skincare-review", + "author": "Chas Downs", + "wordCount": 531 + }, + { + "publishedDate": "2019-10-04", + "year": "2019", + "category": "Skincare", + "title": "Sol De Janeiro Review", + "url": "https://www.downsstyle.com/skincare/2019/10/4/sol-de-janeiro-review", + "author": "Chas Downs", + "wordCount": 337 + }, + { + "publishedDate": "2019-09-26", + "year": "2019", + "category": "Candles", + "title": "Nest Candles", + "url": "https://www.downsstyle.com/new-blog/2018/6/30/nest-candles", + "author": "Chas Downs", + "wordCount": 251 + }, + { + "publishedDate": "2019-09-24", + "year": "2019", + "category": "Skincare", + "title": "I Dew Skincare Review", + "url": "https://www.downsstyle.com/skincare/2019/9/24/i-dew-skincare", + "author": "Chas Downs", + "wordCount": 676 + }, + { + "publishedDate": "2019-09-10", + "year": "2019", + "category": "Skincare", + "title": "Peter Thomas Roth Skincare Haul", + "url": "https://www.downsstyle.com/skincare/2019/9/10/peter-thomas-roth-skincare-haul", + "author": "Chas Downs", + "wordCount": 873 + }, + { + "publishedDate": "2019-08-08", + "year": "2019", + "category": "Skincare", + "title": "Boscia Full Skincare Haul", + "url": "https://www.downsstyle.com/skincare/2019/8/8/boscia-full-skincare-haul", + "author": "Chas Downs", + "wordCount": 247 + }, + { + "publishedDate": "2019-08-08", + "year": "2019", + "category": "Masks", + "title": "Boscia Matcha Magic Mask", + "url": "https://www.downsstyle.com/masks/2019/8/8/boscia-matcha-magic-mask", + "author": "Chas Downs", + "wordCount": 261 + }, + { + "publishedDate": "2019-08-04", + "year": "2019", + "category": "Skincare", + "title": "GlamGlow Good in Bed Review", + "url": "https://www.downsstyle.com/skincare/2019/4/28/glamglow-good-in-bed-review", + "author": "Chas Downs", + "wordCount": 406 + }, + { + "publishedDate": "2019-07-25", + "year": "2019", + "category": "Skincare", + "title": "Sephora Skincare Collection", + "url": "https://www.downsstyle.com/skincare/2019/7/24/zzttit1p1icxx01hz6y6mrluktrpxv", + "author": "Chas Downs", + "wordCount": 415 + }, + { + "publishedDate": "2019-07-07", + "year": "2019", + "category": "Skincare", + "title": "Algenist MicroAlgae Skincare Review", + "url": "https://www.downsstyle.com/skincare/2019/7/7/kzkcpyr4fgfyn69jllyzdz616hi1kw", + "author": "Chas Downs", + "wordCount": 317 + }, + { + "publishedDate": "2019-06-27", + "year": "2019", + "category": "Masks", + "title": "Algenist Alive Prebiotic Balancing Mask Review", + "url": "https://www.downsstyle.com/masks/2019/6/27/algenist-prebiotic-balancing-mask-review", + "author": "Chas Downs", + "wordCount": 246 + }, + { + "publishedDate": "2019-06-25", + "year": "2019", + "category": "Masks", + "title": "AmorePacific Treatment Peeling Masque Review", + "url": "https://www.downsstyle.com/masks/2019/6/25/amorepacific-treatment-peeling-masque", + "author": "Chas Downs", + "wordCount": 249 + }, + { + "publishedDate": "2019-06-22", + "year": "2019", + "category": "Skincare", + "title": "AmorePacific Enzyme Cleansing Powder", + "url": "https://www.downsstyle.com/skincare/2019/6/22/amorepacific-enzyme-cleansing-powder", + "author": "Chas Downs", + "wordCount": 235 + }, + { + "publishedDate": "2019-06-21", + "year": "2019", + "category": "Skincare", + "title": "Fresh Sugar Strawberry Exfoliating Face Wash Review", + "url": "https://www.downsstyle.com/skincare/2019/6/21/fresh-su", + "author": "Chas Downs", + "wordCount": 199 + }, + { + "publishedDate": "2019-06-20", + "year": "2019", + "category": "Masks", + "title": "T.L.C. Sukari Babyfacial Mask and Drunk Elephant Virgin Marulia Luxury Facial Oil Review", + "url": "https://www.downsstyle.com/masks/2019/6/20/tlc-sukari-babyfacial-mask-review", + "author": "Chas Downs", + "wordCount": 279 + }, + { + "publishedDate": "2019-06-13", + "year": "2019", + "category": "Skincare", + "title": "Cane + Austin Skincare Review", + "url": "https://www.downsstyle.com/skincare/2019/6/13/cane-austin-skincare", + "author": "Chas Downs", + "wordCount": 226 + }, + { + "publishedDate": "2019-05-24", + "year": "2019", + "category": "Skincare", + "title": "Glow Recipe Pineapple + C Bright Serum Review", + "url": "https://www.downsstyle.com/skincare/2019/5/24/glow-recipe-pineapple-c-bright-serum-review", + "author": "Chas Downs", + "wordCount": 267 + }, + { + "publishedDate": "2019-05-23", + "year": "2019", + "category": "Masks", + "title": "Dr. Brant Oxygen Facial Review", + "url": "https://www.downsstyle.com/masks/2019/5/23/dr-brant-oxygen-facial-review", + "author": "Chas Downs", + "wordCount": 433 + }, + { + "publishedDate": "2019-05-21", + "year": "2019", + "category": "Skincare", + "title": "Shiseido Waso New Product Line Review", + "url": "https://www.downsstyle.com/skincare/2019/5/21/shiseido-waso-new-product-line-review", + "author": "Chas Downs", + "wordCount": 496 + }, + { + "publishedDate": "2019-05-21", + "year": "2019", + "category": "Masks", + "title": "Shiseido Waso Purifying Peel off Mask Review", + "url": "https://www.downsstyle.com/masks/2019/5/21/shiseido-waso-purifying-peel-off-mask-review", + "author": "Chas Downs", + "wordCount": 169 + }, + { + "publishedDate": "2019-04-28", + "year": "2019", + "category": "Skincare", + "title": "Glossier PopUp Shop Miami", + "url": "https://www.downsstyle.com/skincare/2019/4/28/glossier-popup-shop-miami", + "author": "Chas Downs", + "wordCount": 218 + }, + { + "publishedDate": "2018-12-03", + "year": "2018", + "category": "Skincare", + "title": "Creating a Skincare Line at 18... What I’ve Learned", + "url": "https://www.downsstyle.com/skincare/2018/12/3/creating-a-skincare-line-at-18-what-i-ve-learned", + "author": "Chas Downs", + "wordCount": 604 + }, + { + "publishedDate": "2018-11-28", + "year": "2018", + "category": "Skincare", + "title": "Holiday Skincare Sephora Haul", + "url": "https://www.downsstyle.com/skincare/2018/11/27/holiday-skincare-sephora-haul", + "author": "Chas Downs", + "wordCount": 193 + }, + { + "publishedDate": "2018-11-11", + "year": "2018", + "category": "Masks", + "title": "Sisley Eye Contour Mask Review", + "url": "https://www.downsstyle.com/masks/2018/11/11/sisley-eye-contour-mask-review", + "author": "Chas Downs", + "wordCount": 266 + }, + { + "publishedDate": "2018-11-07", + "year": "2018", + "category": "Masks", + "title": "Jet Lag Mask in First Class", + "url": "https://www.downsstyle.com/masks/2018/11/6/jet-lag-mask-in-first-class", + "author": "Chas Downs", + "wordCount": 303 + }, + { + "publishedDate": "2018-10-25", + "year": "2018", + "category": "Skincare", + "title": "Rosehip seed oil and why I love it 😍", + "url": "https://www.downsstyle.com/skincare/2018/10/16/oil", + "author": "Chas Downs", + "wordCount": 138 + }, + { + "publishedDate": "2018-10-20", + "year": "2018", + "category": "Skincare", + "title": "Pixi Rose Ceramide Cream", + "url": "https://www.downsstyle.com/skincare/2018/10/15/pixi-rose-ceramide-cream", + "author": "Chas Downs", + "wordCount": 185 + }, + { + "publishedDate": "2018-10-10", + "year": "2018", + "category": "Masks", + "title": "Ren Evercalm Ultra Comforting Rescue Mask", + "url": "https://www.downsstyle.com/masks/2018/10/10/ren-evercalm-ultra-comforting-rescue-mask", + "author": "Chas Downs", + "wordCount": 303 + }, + { + "publishedDate": "2018-10-06", + "year": "2018", + "category": "Masks", + "title": "Origins using alcohol in products/ Ginzing Peel-Off Mask", + "url": "https://www.downsstyle.com/masks/2018/10/6/origins-using-alcohol-in-products-peel-off-mask", + "author": "Chas Downs", + "wordCount": 346 + }, + { + "publishedDate": "2018-09-22", + "year": "2018", + "category": "Skincare", + "title": "Kiehls Midnight Recovery Serum Review", + "url": "https://www.downsstyle.com/skincare/2018/9/22/kiehls-midnight-recovery-serum-review", + "author": "Chas Downs", + "wordCount": 122 + }, + { + "publishedDate": "2018-09-21", + "year": "2018", + "category": "Masks", + "title": "Glamglow Bubblesheet Mask", + "url": "https://www.downsstyle.com/masks/2018/9/21/glamglow-bubblesheet-mask", + "author": "Chas Downs", + "wordCount": 217 + }, + { + "publishedDate": "2018-09-10", + "year": "2018", + "category": "Masks", + "title": "$135 SKII Facial Treatment Mask Review", + "url": "https://www.downsstyle.com/masks/2018/9/9/135-skii-facial-treatment-mask-review", + "author": "Chas Downs", + "wordCount": 264 + }, + { + "publishedDate": "2018-09-09", + "year": "2018", + "category": "Look Book", + "title": "Dior Lookbook", + "url": "https://www.downsstyle.com/look-book/2018/6/13/dior", + "author": "Chas Downs", + "wordCount": 381 + }, + { + "publishedDate": "2018-08-23", + "year": "2018", + "category": "Skincare", + "title": "La Prarie $205 Tinted Moisturizer", + "url": "https://www.downsstyle.com/skincare/2018/8/23/la-prarie-205-tinted-moisturizer", + "author": "Chas Downs", + "wordCount": 276 + }, + { + "publishedDate": "2018-08-21", + "year": "2018", + "category": "Travel", + "title": "Ode To Miami", + "url": "https://www.downsstyle.com/travel/2018/8/21/ode-to-miami", + "author": "Chas Downs", + "wordCount": 243 + }, + { + "publishedDate": "2018-08-12", + "year": "2018", + "category": "Skincare", + "title": "The Best Drugstore Drug Store Skincare Approved by Dermatologists", + "url": "https://www.downsstyle.com/skincare/2018/8/12/the-best-drugstore-drug-store-skincare-approved-by-dermatologists", + "author": "Chas Downs", + "wordCount": 346 + }, + { + "publishedDate": "2018-08-12", + "year": "2018", + "category": "Look Book", + "title": "The 5 next outfits for my next vacation", + "url": "https://www.downsstyle.com/look-book/2018/8/12/the-3-next-outfits-for-my-next-vacation", + "author": "Chas Downs", + "wordCount": 76 + }, + { + "publishedDate": "2018-08-11", + "year": "2018", + "category": "Masks", + "title": "Sunday Riley Sulfur Mask Review", + "url": "https://www.downsstyle.com/masks/2018/8/11/sunday-riley-sulfur-mask-review", + "author": "Chas Downs", + "wordCount": 252 + }, + { + "publishedDate": "2018-08-08", + "year": "2018", + "category": "Masks", + "title": "Ole Henricksen 3 step Mask", + "url": "https://www.downsstyle.com/masks/2018/8/8/ole-henricksen-3-step-mask", + "author": "Chas Downs", + "wordCount": 262 + }, + { + "publishedDate": "2018-07-31", + "year": "2018", + "category": "Skincare", + "title": "$8 vs. $100 razor", + "url": "https://www.downsstyle.com/skincare/2018/7/31/8-vs-100-razor", + "author": "Chas Downs", + "wordCount": 219 + }, + { + "publishedDate": "2018-07-31", + "year": "2018", + "category": "Masks", + "title": "Kora Organics Turmeric Mask", + "url": "https://www.downsstyle.com/masks/2018/7/31/kora-beauty-tumeric-mask", + "author": "Chas Downs", + "wordCount": 247 + }, + { + "publishedDate": "2018-07-29", + "year": "2018", + "category": "Skincare", + "title": "Bath soaps to help you relax during this stressful week", + "url": "https://www.downsstyle.com/skincare/2018/7/29/bath-soaps-to-help-you-relax-during-this-stressful-week", + "author": "Chas Downs", + "wordCount": 167 + }, + { + "publishedDate": "2018-07-26", + "year": "2018", + "category": "Masks", + "title": "Ole Henrickensen cold plunge mask", + "url": "https://www.downsstyle.com/masks/2018/7/25/ole-henrickensen-cold-plunge-mask", + "author": "Chas Downs", + "wordCount": 203 + }, + { + "publishedDate": "2018-07-23", + "year": "2018", + "category": "Skincare", + "title": "DRUG STORE SKINCARE?", + "url": "https://www.downsstyle.com/skincare/2018/7/23/drug-store-skincare", + "author": "Chas Downs", + "wordCount": 238 + }, + { + "publishedDate": "2018-07-19", + "year": "2018", + "category": "Masks", + "title": "Same Product different formula? Why one works and the other is a Dupe!", + "url": "https://www.downsstyle.com/masks/2018/7/19/same-product-different-formula-why-one-works-and-the-other-is-a-dupe", + "author": "Chas Downs", + "wordCount": 203 + }, + { + "publishedDate": "2018-07-18", + "year": "2018", + "category": "Masks", + "title": "Sheet masks under $10", + "url": "https://www.downsstyle.com/masks/2018/7/18/sheet-masks-under-10", + "author": "Chas Downs", + "wordCount": 298 + }, + { + "publishedDate": "2018-07-17", + "year": "2018", + "category": "Masks", + "title": "Clarins SOS Nourishing Balm Mask", + "url": "https://www.downsstyle.com/masks/2018/7/17/clarins-sos-balm-nourishing-mask", + "author": "Chas Downs", + "wordCount": 243 + }, + { + "publishedDate": "2018-07-16", + "year": "2018", + "category": "Masks", + "title": "Glow Recipe Watermelon Mask", + "url": "https://www.downsstyle.com/masks/2018/7/16/glow-recipe-watermelon-mask", + "author": "Chas Downs", + "wordCount": 252 + }, + { + "publishedDate": "2018-07-15", + "year": "2018", + "category": "Skincare", + "title": "Why sunscreen is vital to beauty", + "url": "https://www.downsstyle.com/skincare/2018/7/15/why-sunscreen-is-vital-to-beauty", + "author": "Chas Downs", + "wordCount": 178 + }, + { + "publishedDate": "2018-07-14", + "year": "2018", + "category": "Candles", + "title": "CANDLES I RESTOCK ON WHEN ON SALE", + "url": "https://www.downsstyle.com/new-blog/2018/7/14/candles-i-restock-on-when-on-sale", + "author": "Chas Downs", + "wordCount": 141 + }, + { + "publishedDate": "2018-07-11", + "year": "2018", + "category": "Masks", + "title": "Glamglow Instamud 60 second Mask", + "url": "https://www.downsstyle.com/masks/2018/7/10/glamglow-instamud-60-second-mask", + "author": "Chas Downs", + "wordCount": 356 + }, + { + "publishedDate": "2018-07-10", + "year": "2018", + "category": "Skincare", + "title": "Dr. Brant Skincare", + "url": "https://www.downsstyle.com/skincare/2018/3/17/dr-brant", + "author": "Chas Downs", + "wordCount": 223 + }, + { + "publishedDate": "2018-07-02", + "year": "2018", + "category": "Candles", + "title": "Voluspa Candles", + "url": "https://www.downsstyle.com/new-blog/2018/4/7/voluspa-candles", + "author": "Chas Downs", + "wordCount": 84 + }, + { + "publishedDate": "2018-07-01", + "year": "2018", + "category": "Masks", + "title": "Boscia Charcoal Mask", + "url": "https://www.downsstyle.com/masks/2018/6/30/boscia-charcoal-mask", + "author": "Chas Downs", + "wordCount": 183 + }, + { + "publishedDate": "2018-06-30", + "year": "2018", + "category": "Skincare", + "title": "Sisley $500 Moistuzier", + "url": "https://www.downsstyle.com/skincare/2018/6/20/sisley-500-moistuzier", + "author": "Chas Downs", + "wordCount": 210 + }, + { + "publishedDate": "2018-06-30", + "year": "2018", + "category": "Look Book", + "title": "Yves Saint Laurent a Legend", + "url": "https://www.downsstyle.com/look-book/2018/6/13/yves-saint-laurent-a-legend", + "author": "Chas Downs", + "wordCount": 193 + }, + { + "publishedDate": "2018-06-29", + "year": "2018", + "category": "Look Book", + "title": "James Perse", + "url": "https://www.downsstyle.com/look-book/2018/6/25/james-perse", + "author": "Chas Downs", + "wordCount": 178 + }, + { + "publishedDate": "2018-06-26", + "year": "2018", + "category": "Look Book", + "title": "Transcendent Clothing Exclusive Sneak Peek Season 1", + "url": "https://www.downsstyle.com/look-book/2018/6/26/transcendental-clothing-exclusive-sneak-peek-season-1", + "author": "Chas Downs", + "wordCount": 243 + }, + { + "publishedDate": "2018-06-25", + "year": "2018", + "category": "Masks", + "title": "Sisley Black Rose Cream Mask Review", + "url": "https://www.downsstyle.com/masks/2018/6/20/sisley-black-rose-cream-mask", + "author": "Chas Downs", + "wordCount": 254 + }, + { + "publishedDate": "2018-06-22", + "year": "2018", + "category": "Masks", + "title": "Caudalie Masks", + "url": "https://www.downsstyle.com/masks/2018/1/17/caudalie-masks", + "author": "Chas Downs", + "wordCount": 334 + }, + { + "publishedDate": "2018-06-20", + "year": "2018", + "category": "Masks", + "title": "Chanel Vs. Estee Lauder Eye Masks Review", + "url": "https://www.downsstyle.com/masks/2018/6/20/chanel-vs-estee-lauder-eye-masks-review", + "author": "Chas Downs", + "wordCount": 293 + }, + { + "publishedDate": "2018-06-20", + "year": "2018", + "category": "Candles", + "title": "Fragrances I use around my House", + "url": "https://www.downsstyle.com/new-blog/2018/6/11/home-fragrances", + "author": "Chas Downs", + "wordCount": 119 + }, + { + "publishedDate": "2018-06-13", + "year": "2018", + "category": "Masks", + "title": "Dr. Brant Magnetight Mask", + "url": "https://www.downsstyle.com/masks/2018/3/27/dr-brant-magnetight-mask", + "author": "Chas Downs", + "wordCount": 266 + }, + { + "publishedDate": "2018-06-13", + "year": "2018", + "category": "Look Book", + "title": "Off-White", + "url": "https://www.downsstyle.com/look-book/2018/1/17/off-white", + "author": "Chas Downs", + "wordCount": 160 + }, + { + "publishedDate": "2018-06-13", + "year": "2018", + "category": "Look Book", + "title": "Lookbook", + "url": "https://www.downsstyle.com/look-book/2018/3/8/outfits-for-march", + "author": "Chas Downs", + "wordCount": 81 + }, + { + "publishedDate": "2018-06-12", + "year": "2018", + "category": "Look Book", + "title": "Yeezy", + "url": "https://www.downsstyle.com/look-book/2018/5/13/yeezy", + "author": "Chas Downs", + "wordCount": 401 + }, + { + "publishedDate": "2018-06-11", + "year": "2018", + "category": "Look Book", + "title": "Comme Des Garçons", + "url": "https://www.downsstyle.com/look-book/2018/5/16/comme-des-garons", + "author": "Chas Downs", + "wordCount": 57 + }, + { + "publishedDate": "2018-05-28", + "year": "2018", + "category": "Masks", + "title": "FARMACY Honey Potion Mask", + "url": "https://www.downsstyle.com/masks/2018/5/13/farmacy-honey-potion-mask", + "author": "Chas Downs", + "wordCount": 166 + }, + { + "publishedDate": "2018-05-08", + "year": "2018", + "category": "Masks", + "title": "$128 Sisley Red Clay Mask Review", + "url": "https://www.downsstyle.com/masks/2018/2/14/sisley-red-clay-mask", + "author": "Chas Downs", + "wordCount": 204 + }, + { + "publishedDate": "2018-05-02", + "year": "2018", + "category": "Skincare", + "title": "Tatcha Deep Cleanse Face Wash Review", + "url": "https://www.downsstyle.com/skincare/2018/2/11/new-tatcha-face-wash", + "author": "Chas Downs", + "wordCount": 283 + }, + { + "publishedDate": "2018-04-30", + "year": "2018", + "category": "Skincare", + "title": "Eminence Organic Cosmetics: Your Skin Will Thank You!", + "url": "https://www.downsstyle.com/skincare/2018/4/30/eminence-organic-cosmetics-your-skin-will-thank-you", + "author": "Chas Downs", + "wordCount": 492 + }, + { + "publishedDate": "2018-04-29", + "year": "2018", + "category": "Look Book", + "title": "Gucci", + "url": "https://www.downsstyle.com/look-book/2018/1/17/gucci", + "author": "Chas Downs", + "wordCount": 162 + }, + { + "publishedDate": "2018-04-28", + "year": "2018", + "category": "Masks", + "title": "Ole Henricksen Hydra Clay Detox Mask", + "url": "https://www.downsstyle.com/masks/2018/4/28/ole-hendricksen-hydra-clay-detox-mask", + "author": "Chas Downs", + "wordCount": 210 + }, + { + "publishedDate": "2018-04-24", + "year": "2018", + "category": "Skincare", + "title": "Wonjini Effect... Japanese PR package", + "url": "https://www.downsstyle.com/skincare/2017/12/14/wonjineffect", + "author": "Chas Downs", + "wordCount": 93 + }, + { + "publishedDate": "2018-04-17", + "year": "2018", + "category": "Candles", + "title": "March Fave Candles", + "url": "https://www.downsstyle.com/new-blog/2018/3/11/march-fave-candles", + "author": "Chas Downs", + "wordCount": 139 + }, + { + "publishedDate": "2018-04-09", + "year": "2018", + "category": "Candles", + "title": "Henri Bendel Candles", + "url": "https://www.downsstyle.com/new-blog/2018/3/12/henri-bendel-candles", + "author": "Chas Downs", + "wordCount": 154 + }, + { + "publishedDate": "2018-03-28", + "year": "2018", + "category": "Skincare", + "title": "Lip Treatments For Moisture & Plumping Review (Drug Store & Luxury)", + "url": "https://www.downsstyle.com/skincare/2018/2/14/lip-treatments-for-moisture-plumping", + "author": "Chas Downs", + "wordCount": 206 + }, + { + "publishedDate": "2018-03-27", + "year": "2018", + "category": "Masks", + "title": "Dr. Jart+ Shake & Shot Rubber Hydro Mask", + "url": "https://www.downsstyle.com/masks/2018/2/21/dr-jart-shake-shot-rubber-hydro-mask", + "author": "Chas Downs", + "wordCount": 248 + }, + { + "publishedDate": "2018-03-06", + "year": "2018", + "category": "Gift Inspo", + "title": "What I Got Myself For My B-Day", + "url": "https://www.downsstyle.com/gifts/2018/3/6/what-i-got-myself-for-my-b-day", + "author": "Chas Downs", + "wordCount": 86 + }, + { + "publishedDate": "2018-03-04", + "year": "2018", + "category": "Masks", + "title": "Glamglow Firming Mask", + "url": "https://www.downsstyle.com/masks/2018/2/21/glamglow-firming-mask", + "author": "Chas Downs", + "wordCount": 290 + }, + { + "publishedDate": "2018-03-04", + "year": "2018", + "category": "Masks", + "title": "Estee Lauder Masks", + "url": "https://www.downsstyle.com/masks/2018/2/21/estee-lauder-masks", + "author": "Chas Downs", + "wordCount": 459 + }, + { + "publishedDate": "2018-03-04", + "year": "2018", + "category": "Candles", + "title": "My favorite candles under $15", + "url": "https://www.downsstyle.com/new-blog/2018/3/4/my-favorite-candles-under-10", + "author": "Chas Downs", + "wordCount": 263 + }, + { + "publishedDate": "2018-03-04", + "year": "2018", + "category": "Candles", + "title": "February Fave Candles", + "url": "https://www.downsstyle.com/new-blog/2018/3/4/my-february-fave-candles", + "author": "Chas Downs", + "wordCount": 55 + }, + { + "publishedDate": "2018-03-02", + "year": "2018", + "category": "Skincare", + "title": "Estee Lauder Skincare Set", + "url": "https://www.downsstyle.com/skincare/2018/2/21/estee-lauder-skincare-set", + "author": "Chas Downs", + "wordCount": 532 + }, + { + "publishedDate": "2018-02-21", + "year": "2018", + "category": "Skincare", + "title": "Ole Hendrickson Skincare Routine", + "url": "https://www.downsstyle.com/skincare/2018/2/21/ole-hendricksen-skincare-routine", + "author": "Chas Downs", + "wordCount": 483 + }, + { + "publishedDate": "2018-02-21", + "year": "2018", + "category": "Interior Design", + "title": "Nest Fragrances Sicilian Tangerine Reed Diffuser", + "url": "https://www.downsstyle.com/new-blog-1/2018/2/14/nest-fragrances-sicilian-tangerine-reed-diffuser", + "author": "Chas Downs", + "wordCount": 260 + }, + { + "publishedDate": "2018-02-20", + "year": "2018", + "category": "Skincare", + "title": "Why I get facials biweekly", + "url": "https://www.downsstyle.com/skincare/2018/2/11/why-i-get-facials-biweekly", + "author": "Chas Downs", + "wordCount": 492 + }, + { + "publishedDate": "2018-02-09", + "year": "2018", + "category": "Skincare", + "title": "Kate Somerville Pimples Be Gone", + "url": "https://www.downsstyle.com/skincare/2018/2/9/kate-somerville-pimples-be-gone", + "author": "Chas Downs", + "wordCount": 285 + }, + { + "publishedDate": "2018-02-09", + "year": "2018", + "category": "Skincare", + "title": "FOREO Luna Mini", + "url": "https://www.downsstyle.com/skincare/2018/2/9/foreo-luna-mini", + "author": "Chas Downs", + "wordCount": 215 + }, + { + "publishedDate": "2018-02-09", + "year": "2018", + "category": "Masks", + "title": "Kiehls Rare Earth Deep Pore Cleaning Masque", + "url": "https://www.downsstyle.com/masks/2018/2/9/kiehls-rare-earth-deep-pore-cleaning-masque", + "author": "Chas Downs", + "wordCount": 207 + }, + { + "publishedDate": "2018-01-29", + "year": "2018", + "category": "Skincare", + "title": "Evian Facial Toner", + "url": "https://www.downsstyle.com/skincare/2018/1/23/evian-toner-1", + "author": "Chas Downs", + "wordCount": 183 + }, + { + "publishedDate": "2018-01-23", + "year": "2018", + "category": "Skincare", + "title": "Chanel Skincare", + "url": "https://www.downsstyle.com/skincare/2018/1/23/chanel-skincare", + "author": "Chas Downs", + "wordCount": 249 + }, + { + "publishedDate": "2018-01-23", + "year": "2018", + "category": "Masks", + "title": "Peter Thomas Roth Bubbling Mask", + "url": "https://www.downsstyle.com/masks/2018/1/23/peter-thomas-roth-bubbling-mask", + "author": "Chas Downs", + "wordCount": 179 + }, + { + "publishedDate": "2018-01-22", + "year": "2018", + "category": "Skincare", + "title": "Lancer Skincare", + "url": "https://www.downsstyle.com/skincare/2017/12/14/lancer-skincare", + "author": "Chas Downs", + "wordCount": 230 + }, + { + "publishedDate": "2018-01-21", + "year": "2018", + "category": "Skincare", + "title": "Kiehls", + "url": "https://www.downsstyle.com/skincare/2018/1/21/kiehls", + "author": "Chas Downs", + "wordCount": 371 + }, + { + "publishedDate": "2018-01-19", + "year": "2018", + "category": "Skincare", + "title": "Tatcha", + "url": "https://www.downsstyle.com/skincare/2018/1/19/tatcha", + "author": "Chas Downs", + "wordCount": 128 + }, + { + "publishedDate": "2018-01-17", + "year": "2018", + "category": "Masks", + "title": "Laneige Sleeping Mask", + "url": "https://www.downsstyle.com/masks/2018/1/17/sleeping-mask", + "author": "Chas Downs", + "wordCount": 122 + }, + { + "publishedDate": "2018-01-17", + "year": "2018", + "category": "Masks", + "title": "Fresh Rose Hydrating Mask", + "url": "https://www.downsstyle.com/masks/2018/1/17/fresh-hydrating-mask", + "author": "Chas Downs", + "wordCount": 160 + }, + { + "publishedDate": "2018-01-17", + "year": "2018", + "category": "Look Book", + "title": "New York LookBook", + "url": "https://www.downsstyle.com/look-book/2018/1/17/new-york-lookbook", + "author": "Chas Downs", + "wordCount": 273 + }, + { + "publishedDate": "2017-12-14", + "year": "2017", + "category": "Skincare", + "title": "Dior Addict Lip Scrub & Reviving Balm", + "url": "https://www.downsstyle.com/skincare/2017/12/14/dior-lip-scrub", + "author": "Chas Downs", + "wordCount": 199 + }, + { + "publishedDate": "2017-12-14", + "year": "2017", + "category": "Skincare", + "title": "Caudalie", + "url": "https://www.downsstyle.com/skincare/2017/12/14/caudalie", + "author": "Chas Downs", + "wordCount": 287 + }, + { + "publishedDate": "2017-12-12", + "year": "2017", + "category": "Skincare", + "title": "Farsali Drops", + "url": "https://www.downsstyle.com/skincare/2017/12/12/farsali-drops", + "author": "Chas Downs", + "wordCount": 293 + }, + { + "publishedDate": "2017-12-12", + "year": "2017", + "category": "Look Book", + "title": "Raf Simons, a Fashion Inspo", + "url": "https://www.downsstyle.com/look-book/2017/12/12/raf-simons-a-fashion-inspo", + "author": "Chas Downs", + "wordCount": 205 + }, + { + "publishedDate": "2017-12-11", + "year": "2017", + "category": "Skincare", + "title": "Sunday Riley", + "url": "https://www.downsstyle.com/skincare/2017/12/11/sunday-riley", + "author": "Chas Downs", + "wordCount": 421 + }, + { + "publishedDate": "2017-12-11", + "year": "2017", + "category": "Skincare", + "title": "Glossier Skincare as Makeup?", + "url": "https://www.downsstyle.com/skincare/2017/12/11/glossier-skincare-as-makeup", + "author": "Chas Downs", + "wordCount": 277 + }, + { + "publishedDate": "2017-12-11", + "year": "2017", + "category": "Candles", + "title": "Holiday Scents I love", + "url": "https://www.downsstyle.com/new-blog/2017/12/5/holiday-scents-i-love", + "author": "Chas Downs", + "wordCount": 184 + }, + { + "publishedDate": "2017-12-06", + "year": "2017", + "category": "Workouts/Diet", + "title": "Buy these things to begin your cute workout routine", + "url": "https://www.downsstyle.com/workoutsdiet/2017/12/6/buy-these-things-to-begin-your-cute-workout-routine", + "author": "Chas Downs", + "wordCount": 303 + }, + { + "publishedDate": "2017-12-05", + "year": "2017", + "category": "Look Book", + "title": "Cool Outfits", + "url": "https://www.downsstyle.com/look-book/2017/12/5/cool-outfits", + "author": "Chas Downs", + "wordCount": 68 + }, + { + "publishedDate": "2017-12-05", + "year": "2017", + "category": "Interior Design", + "title": "My Room", + "url": "https://www.downsstyle.com/new-blog-1/2017/12/5/my-room", + "author": "Chas Downs", + "wordCount": 139 + }, + { + "publishedDate": "2017-12-05", + "year": "2017", + "category": "Interior Design", + "title": "House Warming Shopping Guide", + "url": "https://www.downsstyle.com/new-blog-1/2017/12/5/house-warming-shopping-guide", + "author": "Chas Downs", + "wordCount": 140 + }, + { + "publishedDate": "2017-12-04", + "year": "2017", + "category": "Masks", + "title": "Sisley Masks Review", + "url": "https://www.downsstyle.com/masks/2017/12/4/sisley-masks", + "author": "Chas Downs", + "wordCount": 410 + }, + { + "publishedDate": "2017-12-04", + "year": "2017", + "category": "Masks", + "title": "GlamGlow Masks", + "url": "https://www.downsstyle.com/masks/2017/12/4/glamglow-masks", + "author": "Chas Downs", + "wordCount": 360 + }, + { + "publishedDate": "2017-12-04", + "year": "2017", + "category": "Look Book", + "title": "Summer Bathing Suits Lookbook", + "url": "https://www.downsstyle.com/look-book/2017/12/4/2if6pau0jpto2kiixkd3qj0y0bi83z", + "author": "Chas Downs", + "wordCount": 145 + }, + { + "publishedDate": "2017-12-04", + "year": "2017", + "category": "Look Book", + "title": "Fall LookBook", + "url": "https://www.downsstyle.com/look-book/2017/12/4/fall-lookbook", + "author": "Chas Downs", + "wordCount": 77 + }, + { + "publishedDate": "2017-12-04", + "year": "2017", + "category": "Candles", + "title": "My Favorite Candles of the Year", + "url": "https://www.downsstyle.com/new-blog/2017/12/4/my-favorite-candles-of-the-year", + "author": "Chas Downs", + "wordCount": 262 + } +] diff --git a/docs/continuations/charles/rose-toners-share/db/index.ts b/docs/continuations/charles/rose-toners-share/db/index.ts new file mode 100644 index 000000000..19b379900 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/db/index.ts @@ -0,0 +1,13 @@ +import { env } from "cloudflare:workers"; +import { drizzle } from "drizzle-orm/d1"; +import * as schema from "./schema"; + +export function getDb() { + if (!env.DB) { + throw new Error( + "Cloudflare D1 binding `DB` is unavailable. Set the `d1` field in .openai/hosting.json to `DB` or let your control plane inject the real binding values before using the database." + ); + } + + return drizzle(env.DB, { schema }); +} diff --git a/docs/continuations/charles/rose-toners-share/db/schema.ts b/docs/continuations/charles/rose-toners-share/db/schema.ts new file mode 100644 index 000000000..d2dd83cd2 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/db/schema.ts @@ -0,0 +1,4 @@ +// Intentionally empty by default. +// Add Drizzle tables here when the site actually needs a database. +// See examples/d1/db/schema.ts for an opt-in example. +export {}; diff --git a/docs/continuations/charles/rose-toners-share/drizzle.config.ts b/docs/continuations/charles/rose-toners-share/drizzle.config.ts new file mode 100644 index 000000000..c2b2f3437 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/drizzle.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + out: "./drizzle", + schema: "./db/schema.ts", + dialect: "sqlite", +}); diff --git a/docs/continuations/charles/rose-toners-share/drizzle/meta/_journal.json b/docs/continuations/charles/rose-toners-share/drizzle/meta/_journal.json new file mode 100644 index 000000000..437750740 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/drizzle/meta/_journal.json @@ -0,0 +1,5 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [] +} diff --git a/docs/continuations/charles/rose-toners-share/eslint.config.mjs b/docs/continuations/charles/rose-toners-share/eslint.config.mjs new file mode 100644 index 000000000..05e726d1b --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/docs/continuations/charles/rose-toners-share/examples/d1/app/api/notes/route.ts b/docs/continuations/charles/rose-toners-share/examples/d1/app/api/notes/route.ts new file mode 100644 index 000000000..07f8318c3 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/examples/d1/app/api/notes/route.ts @@ -0,0 +1,58 @@ +import { desc } from "drizzle-orm"; +import { getDb } from "../../../../../db"; +import { notes } from "../../../db/schema"; + +function toRouteErrorMessage(error: unknown) { + const message = error instanceof Error ? error.message : "Unexpected error"; + const detail = + error instanceof Error && error.cause instanceof Error ? error.cause.message : ""; + const combined = `${message}\n${detail}`; + + if (combined.includes("no such table") || combined.includes('from "notes"')) { + return "The notes table is unavailable. Generate the migration locally with `npm run db:generate`, then deploy so the platform can apply the generated SQL to the real D1 database."; + } + + return message; +} + +export async function GET() { + try { + const db = getDb(); + const rows = await db + .select() + .from(notes) + .orderBy(desc(notes.createdAt), desc(notes.id)) + .limit(20); + + return Response.json({ notes: rows }); + } catch (error) { + return Response.json( + { error: toRouteErrorMessage(error) }, + { status: 500 } + ); + } +} + +export async function POST(request: Request) { + try { + const payload = (await request.json()) as { + title?: string; + content?: string; + }; + const title = payload.title?.trim() ?? ""; + const content = payload.content?.trim() ?? ""; + + if (!title) { + return Response.json({ error: "title is required" }, { status: 400 }); + } + + const db = getDb(); + const [note] = await db.insert(notes).values({ title, content }).returning(); + return Response.json({ note }, { status: 201 }); + } catch (error) { + return Response.json( + { error: toRouteErrorMessage(error) }, + { status: 500 } + ); + } +} diff --git a/docs/continuations/charles/rose-toners-share/examples/d1/db/schema.ts b/docs/continuations/charles/rose-toners-share/examples/d1/db/schema.ts new file mode 100644 index 000000000..7bb0c1571 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/examples/d1/db/schema.ts @@ -0,0 +1,9 @@ +import { sql } from "drizzle-orm"; +import { integer, sqliteTable, text } from "drizzle-orm/sqlite-core"; + +export const notes = sqliteTable("notes", { + id: integer("id").primaryKey({ autoIncrement: true }), + title: text("title").notNull(), + content: text("content").notNull().default(""), + createdAt: text("created_at").notNull().default(sql`CURRENT_TIMESTAMP`), +}); diff --git a/docs/continuations/charles/rose-toners-share/next.config.ts b/docs/continuations/charles/rose-toners-share/next.config.ts new file mode 100644 index 000000000..e9ffa3083 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/docs/continuations/charles/rose-toners-share/package-lock.json b/docs/continuations/charles/rose-toners-share/package-lock.json new file mode 100644 index 000000000..7ce7ea0f2 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/package-lock.json @@ -0,0 +1,11282 @@ +{ + "name": "site-creator-vinext-starter", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "site-creator-vinext-starter", + "version": "0.1.0", + "dependencies": { + "drizzle-orm": "0.45.2", + "next": "16.2.6", + "react": "19.2.6", + "react-dom": "19.2.6" + }, + "devDependencies": { + "@cloudflare/vite-plugin": "1.37.1", + "@tailwindcss/postcss": "4.2.1", + "@types/node": "22.19.19", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.2", + "@vitejs/plugin-rsc": "0.5.26", + "drizzle-kit": "0.31.10", + "eslint": "9.39.4", + "eslint-config-next": "16.2.6", + "react-server-dom-webpack": "19.2.6", + "tailwindcss": "4.2.1", + "typescript": "5.9.3", + "vinext": "0.0.50", + "vite": "8.0.13", + "wrangler": "4.92.0" + }, + "engines": { + "node": ">=22.13.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.5.0.tgz", + "integrity": "sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.16.1.tgz", + "integrity": "sha512-ECxObrMfyTl5bhQf/lZCXwo5G6xX9IAUo+nDMKK4SZ8m4Jvvxp52vilxyySSWh2YTZz8+HQ07qGH/2rEom1vDw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": ">1.20260305.0 <2.0.0-0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/vite-plugin": { + "version": "1.37.1", + "resolved": "https://registry.npmjs.org/@cloudflare/vite-plugin/-/vite-plugin-1.37.1.tgz", + "integrity": "sha512-FldhsmkXyLsX3yI+p0aJDo/kGyY69pDdynz2JjcuH3eCiQ+G9XaY3CrN+UYEfCbWv8CiR2wL95lNg0fT/HfwWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cloudflare/unenv-preset": "2.16.1", + "miniflare": "4.20260515.0", + "unenv": "2.0.0-rc.24", + "wrangler": "4.92.0", + "ws": "8.18.0" + }, + "peerDependencies": { + "vite": "^6.1.0 || ^7.0.0 || ^8.0.0", + "wrangler": "^4.92.0" + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260515.1.tgz", + "integrity": "sha512-Wtw44el2pNbzixvTkWdfeBDTrQwQbJRz7/JUvPKV27I0pQWXbhNJPpM8cstq/pbrU5AGcA/HjFH6yPMRTIRKig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260515.1.tgz", + "integrity": "sha512-X8EqkZej6FfmhF9AVAQ3FhyQRr9acS4RcDunMU2YiuxKHF1IU8zzH3vY30/POaG+rUu9vGDp/VgUl49VPenHJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260515.1.tgz", + "integrity": "sha512-CDC89QxQ7Y7t7RG1Jd9vj/qolE1sQRkI2OSEuV5BMJi0vW/gV4OVG6xjpdK3b1OYnSWDzF7NpvlR5Yg86q7k4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260515.1.tgz", + "integrity": "sha512-WxbW/PToYES4fvHXzsr/5qOiETQs/Z9iZ0mjSZAiEwq5cMLZemzGN0COx+uFb9OvQwzh6Pg159qPFnw3+i9FuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260515.1.tgz", + "integrity": "sha512-WmV/iv+MHjYsvkcMVzpM2B5/mf06UUkdpVhZrtMfV9graWjBGPYFvE/eab8748RPVGKh1Xe1vXofLzDSwc08lA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@drizzle-team/brocli": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", + "integrity": "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild-kit/core-utils": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@esbuild-kit/core-utils/-/core-utils-3.3.2.tgz", + "integrity": "sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.18.20", + "source-map-support": "^0.5.21" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild-kit/core-utils/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/@esbuild-kit/esm-loader": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@esbuild-kit/esm-loader/-/esm-loader-2.6.5.tgz", + "integrity": "sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==", + "deprecated": "Merged into tsx: https://tsx.is", + "dev": true, + "license": "MIT", + "dependencies": { + "@esbuild-kit/core-utils": "^3.3.2", + "get-tsconfig": "^4.7.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.6.tgz", + "integrity": "sha512-gd8HoHN4ufj73WmR3JmVolrpJR47ILK6LouP5xElPglaVxir6e1a7VzvTvDWkOoPXT9rkkTzyCxBu4yeZfZwcw==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz", + "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.6.tgz", + "integrity": "sha512-ZJGkkcNfYgrrMkqOdZ7zoLa1TOy0qpcMfk/z4Mh/FKUz40gVO+HNQWqmLxf67Z5WB64DRp0dhEbyHfel+6sJUg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.6.tgz", + "integrity": "sha512-v/YLBHIY132Ced3puBJ7YJKw1lqsCrgcNo2aRJlCEyQrrCeRJlvGlnmxhPxNQI3KE3N1DN5r9TPNPvka3nq5RQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.6.tgz", + "integrity": "sha512-RPOvqlYBbcQjkz9VQQDZ2T2bARIjXZV1KFlt+V2Mr6SW/e4I9fcKsaA0hdyf2FHoTlsV2xnBd5Y912rP/1Ce6w==", + "cpu": [ + "arm64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.6.tgz", + "integrity": "sha512-URUTu1+dMkxJsPFgm+OeEvq9wf5sujw0EvgYy80TDGHTSLTnIHeqb0Eu8A3sC95IRgjejQL+kC4mw+4yPxiAXA==", + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.6.tgz", + "integrity": "sha512-DOj182mPV8G3UkrayLoREM5YEYI+Dk5wv7Ox9xl1fFibAELEsFD0lDPfHIeILlutMMfdyhlzYPELG3peuKaurw==", + "cpu": [ + "x64" + ], + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.6.tgz", + "integrity": "sha512-HKQ5SP/V/ub73UvF7n/zeJlxk2kLmtL7Wzrg4WfmkjmNos5onJ2tKu7yZOPdL18A6Svfn3max29ym+ry7NkK4g==", + "cpu": [ + "x64" + ], + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.6.tgz", + "integrity": "sha512-LZXpTlPyS5v7HhSmnvsLGP3iIYgYOBnc8r8ArlT55sGHV89bR2HlDdBjWQ+PY6SJMmk8TuVGFuxalnP3k/0Dwg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.6.tgz", + "integrity": "sha512-F0+4i0h9J6C4eE3EAPWsoCk7UW/dbzOjyzxY0qnDUOYFu6FFmdZ6l97/XdV3/Nz3VYyO7UWjyEJUXkGqcoXfMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.130.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.130.0.tgz", + "integrity": "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, + "node_modules/@poppinss/colors": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz", + "integrity": "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz", + "integrity": "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/dumper/node_modules/supports-color": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", + "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz", + "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@resvg/resvg-wasm": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@resvg/resvg-wasm/-/resvg-wasm-2.4.0.tgz", + "integrity": "sha512-C7c51Nn4yTxXFKvgh2txJFNweaVcfUPQxwEUFw4aWsCmfiBDJsTSwviIF8EcwjQ6k8bPyMWCl1vw4BdxE569Cg==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.1.tgz", + "integrity": "sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.1.tgz", + "integrity": "sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.1.tgz", + "integrity": "sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.1.tgz", + "integrity": "sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.1.tgz", + "integrity": "sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.1.tgz", + "integrity": "sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.1.tgz", + "integrity": "sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.1.tgz", + "integrity": "sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.1.tgz", + "integrity": "sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.1.tgz", + "integrity": "sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.1.tgz", + "integrity": "sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.1.tgz", + "integrity": "sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.1.tgz", + "integrity": "sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz", + "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.1.tgz", + "integrity": "sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.1.tgz", + "integrity": "sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@shuding/opentype.js": { + "version": "1.4.0-beta.0", + "resolved": "https://registry.npmjs.org/@shuding/opentype.js/-/opentype.js-1.4.0-beta.0.tgz", + "integrity": "sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fflate": "^0.7.3", + "string.prototype.codepointat": "^0.2.1" + }, + "bin": { + "ot": "bin/ot" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.15.tgz", + "integrity": "sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.1.tgz", + "integrity": "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.1.tgz", + "integrity": "sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.1.tgz", + "integrity": "sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.1.tgz", + "integrity": "sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "postcss": "^8.5.6", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.19.tgz", + "integrity": "sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", + "integrity": "sha512-PwFvSKsXGShKGW6n5bZOhGHEcCZXM8HofLK9fNsEwZXzFRjoY+XT1Vsf1zgyXdwTr0ZYz1/2tkZ0DBTT9jZjhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/type-utils": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.59.3", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.3.tgz", + "integrity": "sha512-g71d8QD8UaiHGvrJwyIS1hCX5r63w6Jll+4VEYhEAHXTDIqX1JgxhTAbEHtKntL9kuc4jRo7/GWw5xfCepSccQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.3.tgz", + "integrity": "sha512-JAvT14goBzRzzzZyqq3P9BLArIxTtQURUtFgQ/V7FO+eU+Gg6ES+5ymOPP1wRxXcxAYeivCk4uS3jCKWI1K8Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.59.3", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@unpic/core": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@unpic/core/-/core-1.0.3.tgz", + "integrity": "sha512-aum9YNVUGso7MjGLD0Rp/08kywCGLqZ03/q6VQBFFakDBOXWEc8D4kPGcZ8v5wEnGRex3lE+++bOuucBp3KJ/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "unpic": "^4.2.2" + } + }, + "node_modules/@unpic/react": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@unpic/react/-/react-1.0.2.tgz", + "integrity": "sha512-5RmRfELwTF8w+4zjtQGqjpvX+RU2VLvis3xDCS1O2uWk0PZN2cvatL+3/KAR3mshAuRrkFGTX1XwyAezSXaoCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@unpic/core": "^1.0.3" + }, + "peerDependencies": { + "next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + } + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vercel/og": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@vercel/og/-/og-0.8.6.tgz", + "integrity": "sha512-hBcWIOppZV14bi+eAmCZj8Elj8hVSUZJTpf1lgGBhVD85pervzQ1poM/qYfFUlPraYSZYP+ASg6To5BwYmUSGQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@resvg/resvg-wasm": "2.4.0", + "satori": "0.16.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.2.tgz", + "integrity": "sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + } + } + }, + "node_modules/@vitejs/plugin-rsc": { + "version": "0.5.26", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-rsc/-/plugin-rsc-0.5.26.tgz", + "integrity": "sha512-T8W8ODEutblw9qXQB512LDPyv1tAbJRD/Gf0QEGsAoydl4nxEtIrghnhoI9oLY9R+7aw+cLk1ZEltxWHWf4aHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.18", + "es-module-lexer": "^2.1.0", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21", + "srvx": "^0.11.15", + "strip-literal": "^3.1.0", + "turbo-stream": "^3.2.0", + "vitefu": "^1.1.3" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/@vitejs/plugin-rsc/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.18", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.18.tgz", + "integrity": "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0", + "peer": true + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-loose": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.5.2.tgz", + "integrity": "sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.4", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", + "integrity": "sha512-3XSA2cR/h/73EzlXXdU6YNycmYI7+kicTxks4eJg2g39biHR84slg2+des+p7iHYhbRg/udIS4TD53WabcOUkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.30", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.30.tgz", + "integrity": "sha512-xjOFN16Ha1+Rz4nFYKqHU/LSB+gx/Vi3yQLX7r7sAW+Wa+8hhF2h4pvqTrTMc8+WcDBEunnUurr46Jvv0jk3Vg==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/blake3-wasm": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", + "integrity": "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-background-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/css-background-parser/-/css-background-parser-0.1.0.tgz", + "integrity": "sha512-2EZLisiZQ+7m4wwur/qiYJRniHX4K5Tc9w93MT3AS0WS1u5kaZ4FKXlOTBhOjc+CgEgPiGY+fX1yWD8UwpEqUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-box-shadow": { + "version": "1.0.0-3", + "resolved": "https://registry.npmjs.org/css-box-shadow/-/css-box-shadow-1.0.0-3.tgz", + "integrity": "sha512-9jaqR6e7Ohds+aWwmhe6wILJ99xYQbfmK9QQB9CcMjDbTxPZjwEmUQpU91OG05Xgm8BahT5fW+svbsQGjS/zPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-gradient-parser": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/css-gradient-parser/-/css-gradient-parser-0.0.16.tgz", + "integrity": "sha512-3O5QdqgFRUbXvK1x5INf1YkBz1UKSWqrd63vWsum8MNHDBYD5urm3QtxZbKU259OrEXNM26lP/MPY3d1IGkBgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/drizzle-kit": { + "version": "0.31.10", + "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.31.10.tgz", + "integrity": "sha512-7OZcmQUrdGI+DUNNsKBn1aW8qSoKuTH7d0mYgSP8bAzdFzKoovxEFnoGQp2dVs82EOJeYycqRtciopszwUf8bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@drizzle-team/brocli": "^0.10.2", + "@esbuild-kit/esm-loader": "^2.5.5", + "esbuild": "^0.25.4", + "tsx": "^4.21.0" + }, + "bin": { + "drizzle-kit": "bin.cjs" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/drizzle-kit/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/drizzle-orm": { + "version": "0.45.2", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.2.tgz", + "integrity": "sha512-kY0BSaTNYWnoDMVoyY8uxmyHjpJW1geOmBMdSSicKo9CIIWkSxMIj2rkeSR51b8KAPB7m+qysjuHme5nKP+E5Q==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.358", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.358.tgz", + "integrity": "sha512-EO7tKm3QxRqTs1lSuPXzl6yRAwznehp0AH9OoMOIC+4mQzTFday8FJCO5KU6J/TFSQXEOahNq4vTKpz1jmCVOA==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-2.0.1.tgz", + "integrity": "sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.3.tgz", + "integrity": "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", + "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.2.6.tgz", + "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.2.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/hex-rgb": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", + "integrity": "sha512-Ox1pJVrDCyGHMG9CFg1tmrRUMRPRsAWYc/PinY0XzJU4K7y7vjNoLKIQ7BR5UJMCxNN8EM1MNDmHWA/B3aZUuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-2.0.2.tgz", + "integrity": "sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==", + "dev": true, + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", + "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/linebreak": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", + "integrity": "sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "0.0.8", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/loader-runner": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", + "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/miniflare": { + "version": "4.20260515.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260515.0.tgz", + "integrity": "sha512-2j0oQWizk1Eu4Cm8tDX7Z+Nsjd0nebIj1TQcQ+Oy1QKeo0Ay9+bdn8wfLAtOj9znDCybDCUlnS1+nYvKXEdfNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "sharp": "^0.34.5", + "undici": "7.24.8", + "workerd": "1.20260515.1", + "ws": "8.18.0", + "youch": "4.1.0-beta.10" + }, + "bin": { + "miniflare": "bootstrap.js" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.2.6", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.6.tgz", + "integrity": "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw==", + "license": "MIT", + "dependencies": { + "@next/env": "16.2.6", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.6", + "@next/swc-darwin-x64": "16.2.6", + "@next/swc-linux-arm64-gnu": "16.2.6", + "@next/swc-linux-arm64-musl": "16.2.6", + "@next/swc-linux-x64-gnu": "16.2.6", + "@next/swc-linux-x64-musl": "16.2.6", + "@next/swc-win32-arm64-msvc": "16.2.6", + "@next/swc-win32-x64-msvc": "16.2.6", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-releases": { + "version": "2.0.44", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.44.tgz", + "integrity": "sha512-5WUyunoPMsvvEhS8AxHtRzP+oA8UCkJ7YRxatWKjngndhDGLiqEVAQKWjFAiAiuL8zMRGzGSJxFnLetoa43qGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true, + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-css-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/parse-css-color/-/parse-css-color-0.2.1.tgz", + "integrity": "sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.1.4", + "hex-rgb": "^4.1.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.6.tgz", + "integrity": "sha512-sfWGGfavi0xr8Pg0sVsyHMAOziVYKgPLNrS7ig+ivMNb3wbCBw3KxtflsGBAwD3gYQlE/AEZsTLgToRrSCjb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.6.tgz", + "integrity": "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.6" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/react-server-dom-webpack": { + "version": "19.2.6", + "resolved": "https://registry.npmjs.org/react-server-dom-webpack/-/react-server-dom-webpack-19.2.6.tgz", + "integrity": "sha512-762YXjBPc6hw2V16k4x1sdnw0mxghcSPzoiOhefGYjiTguJLCImGBUz6EjznPIfqKhWgLtpaQMlBhp66N8dKrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-loose": "^8.3.0", + "neo-async": "^2.6.1", + "webpack-sources": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^19.2.6", + "react-dom": "^19.2.6", + "webpack": "^5.59.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rolldown": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.1.tgz", + "integrity": "sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.130.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm64": "1.0.1", + "@rolldown/binding-darwin-arm64": "1.0.1", + "@rolldown/binding-darwin-x64": "1.0.1", + "@rolldown/binding-freebsd-x64": "1.0.1", + "@rolldown/binding-linux-arm-gnueabihf": "1.0.1", + "@rolldown/binding-linux-arm64-gnu": "1.0.1", + "@rolldown/binding-linux-arm64-musl": "1.0.1", + "@rolldown/binding-linux-ppc64-gnu": "1.0.1", + "@rolldown/binding-linux-s390x-gnu": "1.0.1", + "@rolldown/binding-linux-x64-gnu": "1.0.1", + "@rolldown/binding-linux-x64-musl": "1.0.1", + "@rolldown/binding-openharmony-arm64": "1.0.1", + "@rolldown/binding-wasm32-wasi": "1.0.1", + "@rolldown/binding-win32-arm64-msvc": "1.0.1", + "@rolldown/binding-win32-x64-msvc": "1.0.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/satori": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/satori/-/satori-0.16.0.tgz", + "integrity": "sha512-ZvHN3ygzZ8FuxjSNB+mKBiF/NIoqHzlBGbD0MJiT+MvSsFOvotnWOhdTjxKzhHRT2wPC1QbhLzx2q/Y83VhfYQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@shuding/opentype.js": "1.4.0-beta.0", + "css-background-parser": "^0.1.0", + "css-box-shadow": "1.0.0-3", + "css-gradient-parser": "^0.0.16", + "css-to-react-native": "^3.0.0", + "emoji-regex-xs": "^2.0.1", + "escape-html": "^1.0.3", + "linebreak": "^1.1.0", + "parse-css-color": "^0.2.1", + "postcss-value-parser": "^4.2.0", + "yoga-layout": "^3.2.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "devOptional": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/srvx": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/srvx/-/srvx-0.11.15.tgz", + "integrity": "sha512-iXsux0UcOjdvs0LCMa2Ws3WwcDUozA3JN3BquNXkaFPP7TpRqgunKdEgoZ/uwb1J6xaYHfxtz9Twlh6yzwM6Tg==", + "dev": true, + "license": "MIT", + "bin": { + "srvx": "bin/srvx.mjs" + }, + "engines": { + "node": ">=20.16.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.codepointat": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", + "integrity": "sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.1.tgz", + "integrity": "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.47.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.47.1.tgz", + "integrity": "sha512-tPbLXTI6ohPASb/1YViL428oEHu6/qv1OxqYnfaonVCFHqx4+wCd95pHrQWsL5X4pl90CTyW9piSAsS2L0VoMw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-Eum+5ajkaOhf5KbM26osvv21kLD7BaGqQ1UA4Ami4arYwylmGUQTgHFpHDdmJod1q4QXa66p0to/FBKID+J1vA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.1.tgz", + "integrity": "sha512-TvncJykhxAzFCk0VQZKBTClall4Pm7qXDSodb6uxi8QFa8X8mT6ABjxxsQ2opDRYxG7AzcRWXaFtruz5HJKuWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/turbo-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-3.2.0.tgz", + "integrity": "sha512-EK+bZ9UVrVh7JLslVFOV0GEMsociOqVOvEMTAd4ixMyffN5YNIEdLZWXUx5PJqDbTxSIBWw04HS9gCY4frYQDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.3.tgz", + "integrity": "sha512-KgusgyDgG4LI8Ih/sWaCtZ06tckLAS5CvT5A4D1Q7bYVoAAyzwiZvE4BmwDHkhRVkvhRBepKeASoFzQetha7Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.59.3", + "@typescript-eslint/parser": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/utils": "8.59.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.8.tgz", + "integrity": "sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + } + }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unpic": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/unpic/-/unpic-4.2.2.tgz", + "integrity": "sha512-z6T2ScMgRV2y2H8MwwhY5xHZWXhUx/YxtOCGJwfURSl7ypVy4HpLIMWoIZKnnxQa/RKzM0kg8hUh0paIrpLfvw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vinext": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/vinext/-/vinext-0.0.50.tgz", + "integrity": "sha512-uo72YNnq94NtogETWnhMdFSrkMLwWgeXh5PS6qh8ksajuvAaZX50bXYJ4a6dERQ/AnnXAlNByAGHCjjNxQrvig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@unpic/react": "^1.0.2", + "@vercel/og": "^0.8.6", + "image-size": "2.0.2", + "ipaddr.js": "^2.1.0", + "magic-string": "^0.30.21", + "vite-plugin-commonjs": "^0.10.4", + "vite-tsconfig-paths": "^6.1.1", + "web-vitals": "^4.2.4" + }, + "bin": { + "vinext": "dist/cli.js" + }, + "engines": { + "node": ">=22" + }, + "peerDependencies": { + "@mdx-js/rollup": "^3.0.0", + "@vitejs/plugin-react": "^5.1.4 || ^6.0.0", + "@vitejs/plugin-rsc": "^0.5.23", + "react": "^19.2.6", + "react-dom": "^19.2.6", + "react-server-dom-webpack": "^19.2.6", + "vite": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@mdx-js/rollup": { + "optional": true + }, + "@vitejs/plugin-rsc": { + "optional": true + }, + "react-server-dom-webpack": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.13.tgz", + "integrity": "sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lightningcss": "^1.32.0", + "picomatch": "^4.0.4", + "postcss": "^8.5.14", + "rolldown": "1.0.1", + "tinyglobby": "^0.2.16" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.1.18", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-commonjs": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/vite-plugin-commonjs/-/vite-plugin-commonjs-0.10.4.tgz", + "integrity": "sha512-eWQuvQKCcx0QYB5e5xfxBNjQKyrjEWZIR9UOkOV6JAgxVhtbZvCOF+FNC2ZijBJ3U3Px04ZMMyyMyFBVWIJ5+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "magic-string": "^0.30.11", + "vite-plugin-dynamic-import": "^1.6.0" + } + }, + "node_modules/vite-plugin-dynamic-import": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-dynamic-import/-/vite-plugin-dynamic-import-1.6.0.tgz", + "integrity": "sha512-TM0sz70wfzTIo9YCxVFwS8OA9lNREsh+0vMHGSkWDTZ7bgd1Yjs5RV8EgB634l/91IsXJReg0xtmuQqP0mf+rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "es-module-lexer": "^1.5.4", + "fast-glob": "^3.3.2", + "magic-string": "^0.30.11" + } + }, + "node_modules/vite-plugin-dynamic-import/node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-dynamic-import/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/vite-plugin-dynamic-import/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-6.1.1.tgz", + "integrity": "sha512-2cihq7zliibCCZ8P9cKJrQBkfgdvcFkOOc3Y02o3GWUDLgqjWsZudaoiuOwO/gzTzy17cS5F7ZPo4bsnS4DGkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + } + }, + "node_modules/vite/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/vite/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/watchpack": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.1.tgz", + "integrity": "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-vitals": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/webpack": { + "version": "5.106.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.106.2.tgz", + "integrity": "sha512-wGN3qcrBQIFmQ/c0AiOAQBvrZ5lmY8vbbMv4Mxfgzqd/B6+9pXtLo73WuS1dSGXM5QYY3hZnIbvx+K1xxe6FyA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.20.0", + "es-module-lexer": "^2.0.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "loader-runner": "^4.3.1", + "mime-db": "^1.54.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.17", + "watchpack": "^2.5.1", + "webpack-sources": "^3.3.4" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.4.1.tgz", + "integrity": "sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerd": { + "version": "1.20260515.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260515.1.tgz", + "integrity": "sha512-MjKOJLcvU45xXedQowvuiHtJTxu4WTHYQeIlF7YmjuqhiI6dImTFxWCEoRQHiskztxuVSNEmdO7/0UfDu6OMnQ==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20260515.1", + "@cloudflare/workerd-darwin-arm64": "1.20260515.1", + "@cloudflare/workerd-linux-64": "1.20260515.1", + "@cloudflare/workerd-linux-arm64": "1.20260515.1", + "@cloudflare/workerd-windows-64": "1.20260515.1" + } + }, + "node_modules/wrangler": { + "version": "4.92.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.92.0.tgz", + "integrity": "sha512-/DKpQHPxkuZbQsO9dFW2700VTD/4DSZMHjy92fO/frNoDRi/zQsFCAd2ONCV6TGqcUoXcP3D8Bo2gj/L4M0qQQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "@cloudflare/kv-asset-handler": "0.5.0", + "@cloudflare/unenv-preset": "2.16.1", + "blake3-wasm": "2.1.5", + "esbuild": "0.27.3", + "miniflare": "4.20260515.0", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20260515.1" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" + }, + "engines": { + "node": ">=22.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20260515.1" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-layout": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", + "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/youch": { + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/docs/continuations/charles/rose-toners-share/package.json b/docs/continuations/charles/rose-toners-share/package.json new file mode 100644 index 000000000..ae4351fcd --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/package.json @@ -0,0 +1,41 @@ +{ + "name": "site-creator-vinext-starter", + "version": "0.1.0", + "private": true, + "engines": { + "node": ">=22.13.0" + }, + "scripts": { + "dev": "WRANGLER_LOG_PATH=.wrangler/wrangler.log vinext dev", + "build": "WRANGLER_LOG_PATH=.wrangler/wrangler.log vinext build", + "start": "WRANGLER_LOG_PATH=.wrangler/wrangler.log vinext start", + "test": "npm run build && node --test tests/rendered-html.test.mjs", + "lint": "eslint . --ignore-pattern dist --ignore-pattern .next", + "db:generate": "drizzle-kit generate" + }, + "dependencies": { + "drizzle-orm": "0.45.2", + "next": "16.2.6", + "react": "19.2.6", + "react-dom": "19.2.6" + }, + "devDependencies": { + "@cloudflare/vite-plugin": "1.37.1", + "@tailwindcss/postcss": "4.2.1", + "@types/node": "22.19.19", + "@types/react": "19.2.14", + "@types/react-dom": "19.2.3", + "@vitejs/plugin-react": "6.0.2", + "@vitejs/plugin-rsc": "0.5.26", + "drizzle-kit": "0.31.10", + "eslint": "9.39.4", + "eslint-config-next": "16.2.6", + "react-server-dom-webpack": "19.2.6", + "tailwindcss": "4.2.1", + "typescript": "5.9.3", + "vinext": "0.0.50", + "vite": "8.0.13", + "wrangler": "4.92.0" + }, + "type": "module" +} diff --git a/docs/continuations/charles/rose-toners-share/postcss.config.mjs b/docs/continuations/charles/rose-toners-share/postcss.config.mjs new file mode 100644 index 000000000..61e36849c --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/docs/continuations/charles/rose-toners-share/public/og-archive.png b/docs/continuations/charles/rose-toners-share/public/og-archive.png new file mode 100644 index 000000000..b234d469c Binary files /dev/null and b/docs/continuations/charles/rose-toners-share/public/og-archive.png differ diff --git a/docs/continuations/charles/rose-toners-share/public/og-comparison.png b/docs/continuations/charles/rose-toners-share/public/og-comparison.png new file mode 100644 index 000000000..24df235aa Binary files /dev/null and b/docs/continuations/charles/rose-toners-share/public/og-comparison.png differ diff --git a/docs/continuations/charles/rose-toners-share/public/og.png b/docs/continuations/charles/rose-toners-share/public/og.png new file mode 100644 index 000000000..0489ada32 Binary files /dev/null and b/docs/continuations/charles/rose-toners-share/public/og.png differ diff --git a/docs/continuations/charles/rose-toners-share/tests/rendered-html.test.mjs b/docs/continuations/charles/rose-toners-share/tests/rendered-html.test.mjs new file mode 100644 index 000000000..b4ee66dde --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/tests/rendered-html.test.mjs @@ -0,0 +1,214 @@ +import assert from "node:assert/strict"; +import { access, readFile } from "node:fs/promises"; +import test from "node:test"; + +const templateRoot = new URL("../", import.meta.url); + +const unchangedShoppingUrls = [ + "https://www.mariobadescu.com/products/facial-spray-with-aloe-herbs-and-rosewater", + "https://whamisa.us/products/organic-flowers-toner-deep-rich", + "https://us.smnovella.com/products/adr", + "https://chantecaille.com/products/pure-rosewater", + "https://www.saksfifthavenue.com/product/sisley-paris-floral-toning-lotion-0446264201031.html", +]; + +async function render(path = "/") { + const workerUrl = new URL("../dist/server/index.js", import.meta.url); + workerUrl.searchParams.set("test", `${process.pid}-${Date.now()}`); + const { default: worker } = await import(workerUrl.href); + + return worker.fetch( + new Request(`http://localhost${path}`, { + headers: { accept: "text/html" }, + }), + { + ASSETS: { + fetch: async () => new Response("Not found", { status: 404 }), + }, + }, + { + waitUntil() {}, + passThroughOnException() {}, + }, + ); +} + +test("server-renders the complete six-product editorial preview", async () => { + const response = await render(); + assert.equal(response.status, 200); + assert.match(response.headers.get("content-type") ?? "", /^text\/html\b/i); + + const html = await response.text(); + assert.match( + html, + /Rosewater and the Benefits Behind Our Favorite Flower \| Downs Style<\/title>/i, + ); + assert.match(html, /og-comparison\.png/); + assert.match(html, /six toners and face mists/i); + assert.match(html, /Rose in Skincare/); + assert.match(html, /Our Favorite Flower/); + assert.match(html, /oasis of skincare/); + assert.match(html, /unruly weather/); + assert.equal((html.match(/class="opening-cluster"/g) ?? []).length, 2); + assert.match(html, /<\/p><p>Not without good cause/); + assert.match(html, /<\/p><p>The fermented flower complex/); + assert.match(html, /Rose has always been one of our favorite skincare ingredients/); + assert.match(html, /So why does rosewater keep finding its way back/); + assert.match(html, /result belongs to the material studied/); + assert.match(html, /aria-label="Shop Mario Badescu Facial Spray/); + assert.match(html, /Mario Badescu Facial Spray/); + assert.match(html, /Whamisa Organic Flowers Toner Deep Rich/); + assert.match(html, /Whamisa does not even try to be Mario/); + assert.match(html, /this romance ends here/); + assert.match(html, /which sounds extremely glamorous/); + assert.match(html, /a whisper was clearly never the point/); + assert.match(html, /Santa Maria Novella Acqua di Rose/); + assert.match(html, /Chantecaille Pure Rosewater/); + assert.match(html, /Sisley-Paris Floral Toning Lotion/); + assert.match(html, /Fresh Rose Deep Hydration Facial Toner/); + assert.match(html, /bring the whole toner ritual roaring back/); + assert.match(html, /glycerin and hyaluronic acid/); + assert.match(html, /Affiliate disclosure/); + assert.match(html, /As an Amazon Associate I earn from qualifying purchases/); + assert.match(html, /Paid link — Downs Style may earn a commission/); + assert.match(html, /Each of the six goes straight/); + assert.equal((html.match(/<section class="product/g) ?? []).length, 6); + const disclosurePosition = html.indexOf("Affiliate disclosure"); + assert.notEqual(disclosurePosition, -1); + for (const url of unchangedShoppingUrls) { + assert.equal(html.split(`href="${url}"`).length - 1, 2); + assert.ok(html.indexOf(`href="${url}"`) > disclosurePosition); + } + assert.equal( + ( + html.match( + /href="https:\/\/on\.ltk\.com\/\+IRLNZ3842CX6uNfhjQ9edg"/g, + ) ?? [] + ).length, + 2, + ); + assert.match(html, /Red 40 and Yellow 5/); + assert.match(html, /Charles(?:'|'|')s photo goes here/); + assert.match(html, /Which formula fits your routine\?/); + assert.doesNotMatch(html, /codex-preview|react-loading-skeleton/); + assert.doesNotMatch(html, /thoughtful packaging|fermented complex of rosebud/); + assert.doesNotMatch(html, /comparison-grid|formula-note/); + assert.doesNotMatch(html, /\$\d/); + assert.match(html, /href="\/archive"/); + assert.match(html, /href="\/voice"/); +}); + +test("server-renders the three-panel draft comparison", async () => { + const response = await render("/compare"); + assert.equal(response.status, 200); + + const html = await response.text(); + assert.match(html, /Original draft/); + assert.match(html, /Human draft/); + assert.match(html, /All edits/); + assert.match(html, /First unfinished snapshot/); + assert.match(html, /Current live Downs Style copy/); + assert.match(html, /Why it changed/); + assert.match(html, /added white space is also an edit/); + assert.match(html, /Article title/); + assert.match(html, /Rose Toners and the Benefits Behind Our Favorite Scent/); + assert.match(html, /Applied the newer spoken title/); + assert.match(html, /favorite flower keeps the warmth Charles approved/); + assert.match(html, /slightly dramatic reactions/); + assert.match(html, /Why rosewater belongs here/); + assert.match(html, /getting excited and then checking himself/); + assert.match(html, /Treated the phone-call comment as criticism/); + assert.match(html, /removed the brand-site language/); + assert.match(html, /Removed the product-by-product recap/); + assert.match(html, /Whamsica/); + assert.match(html, /Whamisa/); + assert.match(html, /Organic Flowers Toner Deep Rich/); + assert.match(html, /Santa Maria Novella Acqua di Rose/); + assert.match(html, /current dye disclosure stays factual and calm/); + assert.match(html, /<ins>/); + assert.match(html, /<del>/); + assert.equal((html.match(/class="comparison-row"/g) ?? []).length, 11); + assert.match(html, /id="fresh"/); + assert.match(html, /<h2>Fresh<\/h2>/); + assert.match(html, /committed rose bottle/); + assert.match(html, /Not present in Charles(?:'|'|')s original draft/); + assert.match(html, /Paid link — Downs Style may earn a commission/); + assert.match(html, /Each of the six goes straight/); + assert.match(html, /All 258 posts/); + assert.match(html, /Voice system/); +}); + +test("server-renders all 258 archive records without article bodies or tags", async () => { + const response = await render("/archive"); + assert.equal(response.status, 200); + + const html = await response.text(); + assert.match(html, /The whole history/); + assert.match(html, /finally in one room/); + assert.match(html, /258 pieces across nine editorial worlds/); + assert.equal((html.match(/data-archive-entry/g) ?? []).length, 258); + assert.match(html, /Rose Water and the benefits behind our favorite flower/); + assert.match(html, /My Favorite Candles of the Year/); + assert.match(html, /Skincare/); + assert.match(html, /Masks/); + assert.match(html, /Look Book/); + assert.match(html, /Interior Design/); + assert.match(html, /Search the archive/); + assert.match(html, /Calendar span/); + assert.match(html, /og-archive\.png/); + assert.doesNotMatch(html, /candle junkie|luxury scents/); +}); + +test("server-renders the evidence-backed Charles voice system", async () => { + const response = await render("/voice"); + assert.equal(response.status, 200); + + const html = await response.text(); + assert.match(html, /His voice was/); + assert.match(html, /already there/); + assert.match(html, /257-post causal baseline/); + assert.match(html, /76,597/); + assert.match(html, /alphabetic tokens in the historical baseline/); + assert.match(html, /45\.01/); + assert.match(html, /0\.98/); + assert.match(html, /I is the fingerprint/); + assert.match(html, /Thematic core/); + assert.match(html, /Natural Center/); + assert.match(html, /Channel profile/); + assert.match(html, /How to properly let a candle burn/); + assert.match(html, /Transcend Cosmetics becomes Transcend Essentials/); + assert.match(html, /The summer fabric sequence/); + assert.match(html, /compact myth check/); + assert.match(html, /og-archive\.png/); +}); + +test("archive data is a bounded seven-field public ledger", async () => { + const posts = JSON.parse( + await readFile(new URL("../data/posts.json", import.meta.url), "utf8"), + ); + const expectedKeys = [ + "publishedDate", + "year", + "category", + "title", + "url", + "author", + "wordCount", + ]; + + assert.equal(posts.length, 258); + assert.equal(new Set(posts.map((post) => post.url)).size, 258); + for (const post of posts) { + assert.deepEqual(Object.keys(post), expectedKeys); + assert.match(post.url, /^https:\/\/www\.downsstyle\.com\//); + assert.equal("body" in post, false); + assert.equal("tags" in post, false); + } +}); + +test("removes starter-only preview assets and dependencies", async () => { + const packageJson = await readFile(new URL("../package.json", import.meta.url), "utf8"); + assert.doesNotMatch(packageJson, /react-loading-skeleton/); + + await assert.rejects(access(new URL("app/_sites-preview", templateRoot))); +}); diff --git a/docs/continuations/charles/rose-toners-share/tsconfig.json b/docs/continuations/charles/rose-toners-share/tsconfig.json new file mode 100644 index 000000000..3a13f90a7 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +} diff --git a/docs/continuations/charles/rose-toners-share/vite.config.ts b/docs/continuations/charles/rose-toners-share/vite.config.ts new file mode 100644 index 000000000..ae08f9367 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/vite.config.ts @@ -0,0 +1,59 @@ +import vinext from "vinext"; +import { defineConfig } from "vite"; +import hostingConfig from "./.openai/hosting.json"; +import { sites } from "./build/sites-vite-plugin"; + +const SITE_CREATOR_PLACEHOLDER_DATABASE_ID = + "00000000-0000-4000-8000-000000000000"; + +const { d1, r2 } = hostingConfig; + +// macOS Seatbelt blocks FSEvents, so Codex previews need polling for HMR. +const isCodexSeatbeltSandbox = process.env.CODEX_SANDBOX === "seatbelt"; + +const localBindingConfig = { + main: "./worker/index.ts", + compatibility_flags: ["nodejs_compat"], + d1_databases: d1 + ? [ + { + binding: d1, + database_name: "site-creator-d1", + database_id: SITE_CREATOR_PLACEHOLDER_DATABASE_ID, + }, + ] + : [], + r2_buckets: r2 + ? [ + { + binding: r2, + bucket_name: "site-creator-r2", + }, + ] + : [], +}; + +export default defineConfig(async () => { + // Keep Wrangler and Miniflare state project-local. These are non-secret tool + // settings; application environment belongs in ignored `.env*` files. + process.env.WRANGLER_WRITE_LOGS ??= "false"; + process.env.WRANGLER_LOG_PATH ??= ".wrangler/logs"; + process.env.MINIFLARE_REGISTRY_PATH ??= ".wrangler/registry"; + + // Wrangler snapshots its log path while the Cloudflare plugin is imported. + const { cloudflare } = await import("@cloudflare/vite-plugin"); + + return { + server: isCodexSeatbeltSandbox + ? { watch: { useFsEvents: false, usePolling: true } } + : undefined, + plugins: [ + vinext(), + sites(), + cloudflare({ + viteEnvironment: { name: "rsc", childEnvironments: ["ssr"] }, + config: localBindingConfig, + }), + ], + }; +}); diff --git a/docs/continuations/charles/rose-toners-share/worker/index.ts b/docs/continuations/charles/rose-toners-share/worker/index.ts new file mode 100644 index 000000000..b3cd13786 --- /dev/null +++ b/docs/continuations/charles/rose-toners-share/worker/index.ts @@ -0,0 +1,47 @@ +/** Cloudflare Worker entry point for the vinext-starter template. */ +import { handleImageOptimization, DEFAULT_DEVICE_SIZES, DEFAULT_IMAGE_SIZES } from "vinext/server/image-optimization"; +import handler from "vinext/server/app-router-entry"; + +interface Env { + ASSETS: Fetcher; + DB: D1Database; + IMAGES: { + input(stream: ReadableStream): { + transform(options: Record<string, unknown>): { + output(options: { format: string; quality: number }): Promise<{ response(): Response }>; + }; + }; + }; +} + +interface ExecutionContext { + waitUntil(promise: Promise<unknown>): void; + passThroughOnException(): void; +} + +// Image security config. SVG sources with .svg extension auto-skip the +// optimization endpoint on the client side (served directly, no proxy). +// To route SVGs through the optimizer (with security headers), set +// dangerouslyAllowSVG: true in next.config.js and uncomment below: +// const imageConfig: ImageConfig = { dangerouslyAllowSVG: true }; + +const worker = { + async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> { + const url = new URL(request.url); + + if (url.pathname === "/_vinext/image") { + const allowedWidths = [...DEFAULT_DEVICE_SIZES, ...DEFAULT_IMAGE_SIZES]; + return handleImageOptimization(request, { + fetchAsset: (path) => env.ASSETS.fetch(new Request(new URL(path, request.url))), + transformImage: async (body, { width, format, quality }) => { + const result = await env.IMAGES.input(body).transform(width > 0 ? { width } : {}).output({ format, quality }); + return result.response(); + }, + }, allowedWidths); + } + + return handler.fetch(request, env, ctx); + }, +}; + +export default worker; diff --git a/scripts/analyze-downs-style-voice.py b/scripts/analyze-downs-style-voice.py new file mode 100644 index 000000000..168447b9e --- /dev/null +++ b/scripts/analyze-downs-style-voice.py @@ -0,0 +1,284 @@ +#!/usr/bin/env python3 +"""Derive reproducible, non-verbatim voice metrics from a private post corpus. + +The input is the temporary JSON emitted by ``audit-downs-style-archive.py``. +The output deliberately contains aggregate counts only: no article body, sentence, +or excerpt is retained in the tracked analysis artifact. +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import re +import statistics +from collections import Counter +from datetime import date +from pathlib import Path +from typing import Any + + +WORD_PATTERN = re.compile(r"[A-Za-z]+(?:['’][A-Za-z]+)?") +SENTENCE_BOUNDARY = re.compile(r"(?<=[.!?])\s+(?=[A-Z0-9\"“(])") + +PRONOUN_GROUPS = { + "first_person_singular": ("i", "me", "my", "mine"), + "first_person_plural": ("we", "us", "our", "ours"), + "second_person": ("you", "your", "yours"), +} + +LEXICAL_MARKERS = ( + "love", + "loved", + "favorite", + "obsessed", + "amazing", + "great", + "beautiful", + "cute", + "luxury", + "luxurious", + "glowing", + "healthy", + "natural", + "organic", + "personally", + "however", + "overall", +) + +PHRASE_MARKERS = ( + "i love", + "i loved", + "i like", + "i think", + "i feel", + "i recommend", + "i personally", + "i have to say", + "my favorite", + "one of my favorite", + "for me", + "of course", + "so i decided", + "had to try", + "fell in love", + "made my skin feel", + "left my skin feeling", + "overall i", + "thanks so much for reading", + "shop below", + "click to shop", +) + + +def normalize_word(word: str) -> str: + return word.lower().replace("’", "'") + + +def words(text: str) -> list[str]: + return [normalize_word(word) for word in WORD_PATTERN.findall(text)] + + +def safe_rate(count: int, total: int) -> float: + return round((count / total * 1000) if total else 0.0, 2) + + +def era_for(published_date: str) -> str: + year = int(published_date[:4]) + if year <= 2018: + return "2017-2018_foundation" + if year <= 2020: + return "2019-2020_reviews" + if year <= 2023: + return "2021-2023_expansion" + if year == 2024: + return "2024_editorial" + return "2025_plus" + + +def summarize(posts: list[dict[str, Any]]) -> dict[str, Any]: + all_words = [word for post in posts for word in words(post["body"])] + word_counts = Counter(all_words) + word_total = len(all_words) + post_lengths = [len(words(post["body"])) for post in posts] + + sentences: list[str] = [] + paragraphs: list[str] = [] + for post in posts: + compact = " ".join(post["body"].split()) + sentences.extend( + sentence + for sentence in SENTENCE_BOUNDARY.split(compact) + if len(words(sentence)) >= 3 + ) + paragraphs.extend( + paragraph.strip() + for paragraph in post["body"].split("\n\n") + if paragraph.strip() + ) + + joined = "\n".join(post["body"] for post in posts) + normalized_text = joined.lower().replace("’", "'") + sentence_lengths = [len(words(sentence)) for sentence in sentences] + paragraph_lengths = [len(words(paragraph)) for paragraph in paragraphs] + + pronouns = { + label: { + "count": sum(word_counts[word] for word in group), + "per_1000_words": safe_rate( + sum(word_counts[word] for word in group), word_total + ), + } + for label, group in PRONOUN_GROUPS.items() + } + lexical = { + marker: { + "count": word_counts[marker], + "per_1000_words": safe_rate(word_counts[marker], word_total), + } + for marker in LEXICAL_MARKERS + } + phrases = { + marker: { + "count": normalized_text.count(marker), + "per_1000_words": safe_rate(normalized_text.count(marker), word_total), + } + for marker in PHRASE_MARKERS + } + + return { + "posts": len(posts), + "words": word_total, + "median_post_words": round(statistics.median(post_lengths), 2) if posts else 0, + "mean_sentence_words": round(statistics.mean(sentence_lengths), 2) + if sentence_lengths + else 0, + "median_paragraph_words": round(statistics.median(paragraph_lengths), 2) + if paragraph_lengths + else 0, + "pronouns": pronouns, + "punctuation_per_1000_words": { + "question_marks": safe_rate(joined.count("?"), word_total), + "exclamation_marks": safe_rate(joined.count("!"), word_total), + }, + "structural_post_counts": { + "first_person_title": sum( + bool(re.search(r"\b(?:I|My)\b", post["title"])) for post in posts + ), + "question_title": sum("?" in post["title"] for post in posts), + "review_title": sum("review" in post["title"].lower() for post in posts), + "shop_cue": sum( + bool(re.search(r"\bshop\b", post["body"], re.IGNORECASE)) + for post in posts + ), + "reader_thanks": sum( + "thanks" in post["body"].lower() + and "reading" in post["body"].lower() + for post in posts + ), + "numeric_rating": sum( + bool(re.search(r"\b\d+(?:\.\d+)?\s*/\s*10\b", post["body"])) + for post in posts + ), + }, + "lexical_markers": lexical, + "phrase_markers": phrases, + } + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--corpus-json", type=Path, required=True) + parser.add_argument("--output", type=Path, required=True) + parser.add_argument( + "--baseline-cutoff", + type=date.fromisoformat, + default=date(2024, 12, 31), + help="Latest publication date included in the causal voice baseline", + ) + return parser.parse_args() + + +def main() -> int: + args = parse_args() + corpus_bytes = args.corpus_json.read_bytes() + posts = json.loads(corpus_bytes) + if not isinstance(posts, list) or not all(isinstance(post, dict) for post in posts): + raise SystemExit("corpus JSON must be a list of post objects") + required = {"published_date", "category", "title", "url", "body"} + for index, post in enumerate(posts): + missing = required - post.keys() + if missing: + raise SystemExit(f"post {index} is missing fields: {sorted(missing)}") + + baseline = [ + post + for post in posts + if date.fromisoformat(post["published_date"][:10]) <= args.baseline_cutoff + ] + excluded = [post for post in posts if post not in baseline] + + by_year = { + year: summarize( + [post for post in posts if post["published_date"].startswith(year)] + ) + for year in sorted({post["published_date"][:4] for post in posts}) + } + by_category = { + category: summarize([post for post in posts if post["category"] == category]) + for category in sorted({post["category"] for post in posts}) + } + by_era = { + era: summarize( + [post for post in posts if era_for(post["published_date"]) == era] + ) + for era in dict.fromkeys(era_for(post["published_date"]) for post in posts) + } + + output = { + "schema_version": 1, + "source": { + "corpus_sha256": hashlib.sha256(corpus_bytes).hexdigest(), + "public_post_count": len(posts), + "first_publication_date": min(post["published_date"] for post in posts), + "last_publication_date": max(post["published_date"] for post in posts), + "contains_verbatim_article_text": False, + }, + "baseline": { + "cutoff": args.baseline_cutoff.isoformat(), + "rationale": ( + "Causal baseline excludes posts published after the historical corpus " + "that prompted this voice audit." + ), + "included_posts": len(baseline), + "excluded_posts": len(excluded), + "excluded_urls": [post["url"] for post in excluded], + "metrics": summarize(baseline), + }, + "all_public_posts": summarize(posts), + "by_era": by_era, + "by_year": by_year, + "by_category": by_category, + "method_notes": [ + "Tokens are alphabetic words with internal apostrophes.", + "Sentence and paragraph boundaries are heuristic because historic posts mix prose and shopping lists.", + "Rates are normalized per 1,000 words; phrase counts are literal and case-insensitive.", + "Metrics describe the corpus and are evidence for editorial judgment, not a claim of sole authorship.", + ], + } + if any("body" in key for key in output): + raise AssertionError("derived output must not expose article bodies") + serialized = json.dumps(output, indent=2, ensure_ascii=False, sort_keys=False) + "\n" + args.output.parent.mkdir(parents=True, exist_ok=True) + args.output.write_text(serialized, encoding="utf-8") + print( + f"analyzed {len(posts)} posts; baseline {len(baseline)}; " + f"excluded {len(excluded)}; wrote {args.output}" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/audit-downs-style-archive.py b/scripts/audit-downs-style-archive.py new file mode 100644 index 000000000..34d992491 --- /dev/null +++ b/scripts/audit-downs-style-archive.py @@ -0,0 +1,398 @@ +#!/usr/bin/env python3 +"""Inventory Downs Style's public blog archive from its sitemap and collection pages. + +The committed inventory contains metadata and content fingerprints only. Pass +``--corpus-json`` to create a temporary full-text corpus for local voice analysis; raw +article text should not be committed by this workflow. +""" + +from __future__ import annotations + +import argparse +import csv +import hashlib +import json +import re +import time +import urllib.error +import urllib.request +import xml.etree.ElementTree as ET +from concurrent.futures import ThreadPoolExecutor, as_completed +from dataclasses import asdict, dataclass +from pathlib import Path +from typing import Iterable +from urllib.parse import urljoin, urlparse + +from bs4 import BeautifulSoup + + +BASE_URL = "https://www.downsstyle.com" +SITEMAP_URL = f"{BASE_URL}/sitemap.xml" +USER_AGENT = "DownsStyleArchiveAudit/1.0 (+https://github.com/organvm/limen)" +POST_PATH = re.compile( + r"^/(?P<collection>[^/]+)/(?P<year>\d{4})/(?P<month>\d{1,2})/" + r"(?P<day>\d{1,2})/(?P<slug>[^/?#]+)/?$" +) +WORD = re.compile(r"\b[\w’'-]+\b", re.UNICODE) + +COLLECTION_LABELS = { + "gifts": "Gift Inspo", + "look-book": "Look Book", + "masks": "Masks", + "new-blog": "Candles", + "new-blog-1": "Interior Design", + "new-blog-2": "Eat", + "skincare": "Skincare", + "travel": "Travel", + "workoutsdiet": "Workouts/Diet", +} + + +@dataclass(frozen=True) +class SitemapPost: + url: str + lastmod: str + + +@dataclass +class PostRecord: + published_date: str + category: str + collection: str + title: str + url: str + discovery_sources: str + sitemap_lastmod: str + http_status: int | None + final_url: str + author: str + tags: str + word_count: int + body_blocks: int + content_sha256: str + error: str + + +def fetch(url: str, *, timeout: float, attempts: int = 3) -> tuple[int, str, str]: + """Return status, final URL, and decoded response text with bounded retries.""" + request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + last_error: Exception | None = None + for attempt in range(attempts): + try: + with urllib.request.urlopen(request, timeout=timeout) as response: + charset = response.headers.get_content_charset() or "utf-8" + body = response.read().decode(charset, errors="replace") + return response.status, response.geturl(), body + except (urllib.error.URLError, TimeoutError) as exc: + last_error = exc + if attempt + 1 < attempts: + time.sleep(0.5 * (attempt + 1)) + assert last_error is not None + raise last_error + + +def canonical_post_url(url: str) -> str | None: + """Normalize a Downs Style dated-post URL or return None.""" + parsed = urlparse(urljoin(BASE_URL, url)) + if parsed.netloc.lower() not in {"downsstyle.com", "www.downsstyle.com"}: + return None + match = POST_PATH.match(parsed.path) + if not match: + return None + path = parsed.path.rstrip("/") + return f"{BASE_URL}{path}" + + +def parse_sitemap(xml_text: str) -> list[SitemapPost]: + root = ET.fromstring(xml_text) + namespace = {"s": "http://www.sitemaps.org/schemas/sitemap/0.9"} + posts: list[SitemapPost] = [] + for node in root.findall("s:url", namespace): + location = node.findtext("s:loc", default="", namespaces=namespace) + canonical = canonical_post_url(location) + if not canonical: + continue + lastmod = node.findtext("s:lastmod", default="", namespaces=namespace) + posts.append(SitemapPost(url=canonical, lastmod=lastmod)) + return posts + + +def discover_posts(html: str) -> set[str]: + soup = BeautifulSoup(html, "html.parser") + urls: set[str] = set() + for anchor in soup.find_all("a", href=True): + canonical = canonical_post_url(anchor["href"]) + if canonical: + urls.add(canonical) + return urls + + +def discover_collection_posts(collection: str, *, timeout: float) -> set[str]: + """Enumerate every public item exposed by a Squarespace collection.""" + page_url = f"{BASE_URL}/{collection}?format=json" + visited_pages: set[str] = set() + urls: set[str] = set() + while page_url: + if page_url in visited_pages: + raise RuntimeError(f"pagination cycle detected for {collection}: {page_url}") + visited_pages.add(page_url) + _, _, response_text = fetch(page_url, timeout=timeout) + payload = json.loads(response_text) + for item in payload.get("items", []): + canonical = canonical_post_url(item.get("fullUrl", "")) + if canonical: + urls.add(canonical) + + next_page = payload.get("pagination", {}).get("nextPageUrl") + if not next_page: + page_url = "" + continue + page_url = urljoin(BASE_URL, next_page) + separator = "&" if "?" in page_url else "?" + page_url = f"{page_url}{separator}format=json" + return urls + + +def fallback_date_and_collection(url: str) -> tuple[str, str]: + match = POST_PATH.match(urlparse(url).path) + if not match: + return "", "" + values = match.groupdict() + date = f"{values['year']}-{int(values['month']):02d}-{int(values['day']):02d}" + return date, values["collection"] + + +def clean_text(node: BeautifulSoup) -> str: + text = node.get_text(" ", strip=True) + return " ".join(text.split()) + + +def parse_post( + url: str, + *, + sources: Iterable[str], + lastmod: str, + timeout: float, +) -> tuple[PostRecord, str]: + fallback_date, collection = fallback_date_and_collection(url) + category = COLLECTION_LABELS.get(collection, collection) + try: + status, final_url, html = fetch(url, timeout=timeout) + soup = BeautifulSoup(html, "html.parser") + article = soup.select_one("article.BlogItem") + title_node = soup.select_one("h1.BlogItem-title") + if title_node: + title = clean_text(title_node) + else: + meta_title = soup.find("meta", attrs={"property": "og:title"}) + title = meta_title.get("content", "") if meta_title else "" + title = re.sub(r"\s+—\s+Downs Style$", "", title).strip() + + date_node = soup.select_one("time.Blog-meta-item--date[datetime]") + published_date = date_node.get("datetime", fallback_date) if date_node else fallback_date + author_node = soup.select_one(".Blog-meta-item--author") + author = clean_text(author_node) if author_node else "" + tags = sorted( + { + clean_text(tag) + for tag in soup.select(".Blog-meta-item--tags .Blog-meta-item-tag") + if clean_text(tag) + }, + key=str.casefold, + ) + + blocks: list[str] = [] + if article: + for unwanted in article.select("script, style, noscript, .BlogItem-share"): + unwanted.decompose() + for block in article.select(".sqs-block-content"): + text = clean_text(block) + if text: + blocks.append(text) + if not blocks: + text = clean_text(article) + if text: + blocks.append(text) + body = "\n\n".join(blocks) + digest = hashlib.sha256(body.encode("utf-8")).hexdigest() if body else "" + record = PostRecord( + published_date=published_date, + category=category, + collection=collection, + title=title, + url=url, + discovery_sources=";".join(sorted(set(sources))), + sitemap_lastmod=lastmod, + http_status=status, + final_url=final_url, + author=author, + tags=";".join(tags), + word_count=len(WORD.findall(body)), + body_blocks=len(blocks), + content_sha256=digest, + error="" if article else "article element not found", + ) + return record, body + except Exception as exc: # noqa: BLE001 - inventory must retain failed URLs + record = PostRecord( + published_date=fallback_date, + category=category, + collection=collection, + title="", + url=url, + discovery_sources=";".join(sorted(set(sources))), + sitemap_lastmod=lastmod, + http_status=None, + final_url="", + author="", + tags="", + word_count=0, + body_blocks=0, + content_sha256="", + error=f"{type(exc).__name__}: {exc}", + ) + return record, "" + + +def write_inventory(path: Path, records: list[PostRecord]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + fieldnames = list(asdict(records[0]).keys()) if records else list(PostRecord.__annotations__) + with path.open("w", newline="", encoding="utf-8") as handle: + writer = csv.DictWriter(handle, fieldnames=fieldnames) + writer.writeheader() + for record in records: + writer.writerow(asdict(record)) + + +def write_corpus(path: Path, records_and_bodies: list[tuple[PostRecord, str]]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + payload = [ + { + "published_date": record.published_date, + "category": record.category, + "title": record.title, + "url": record.url, + "body": body, + } + for record, body in records_and_bodies + ] + path.write_text(json.dumps(payload, indent=2, ensure_ascii=False), encoding="utf-8") + + +def write_site_inventory(path: Path, records: list[PostRecord]) -> None: + """Write the bounded metadata used by the browsable archive site.""" + payload = [ + { + "publishedDate": record.published_date[:10], + "year": record.published_date[:4], + "category": record.category, + "title": record.title, + "url": record.url, + "author": record.author, + "wordCount": record.word_count, + } + for record in reversed(records) + ] + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text( + json.dumps(payload, indent=2, ensure_ascii=False) + "\n", + encoding="utf-8", + ) + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--output", type=Path, required=True, help="Metadata CSV output path") + parser.add_argument( + "--corpus-json", + type=Path, + help="Optional private full-text JSON output for local analysis", + ) + parser.add_argument( + "--site-json", + type=Path, + help="Optional bounded metadata JSON for the archive website", + ) + parser.add_argument("--workers", type=int, default=4) + parser.add_argument("--timeout", type=float, default=30.0) + return parser.parse_args() + + +def main() -> int: + args = parse_args() + if not 1 <= args.workers <= 8: + raise SystemExit("--workers must be between 1 and 8") + + _, _, sitemap_xml = fetch(SITEMAP_URL, timeout=args.timeout) + sitemap_posts = parse_sitemap(sitemap_xml) + sources_by_url: dict[str, set[str]] = {post.url: {"sitemap"} for post in sitemap_posts} + lastmod_by_url = {post.url: post.lastmod for post in sitemap_posts} + + collections = sorted({fallback_date_and_collection(post.url)[1] for post in sitemap_posts}) + try: + _, _, homepage_html = fetch(BASE_URL, timeout=args.timeout) + for url in discover_posts(homepage_html): + sources_by_url.setdefault(url, set()).add("homepage") + except Exception as exc: # noqa: BLE001 - continue with other discovery rails + print(f"warning: homepage discovery failed: {exc}") + + for collection in collections: + source = f"collection:{collection}" + try: + collection_urls = discover_collection_posts( + collection, + timeout=args.timeout, + ) + except Exception as exc: # noqa: BLE001 - continue with sitemap coverage + print(f"warning: {source} discovery failed: {exc}") + continue + print(f"discovered {len(collection_urls)} posts in {source}") + for url in collection_urls: + sources_by_url.setdefault(url, set()).add(source) + + def audit(url: str) -> tuple[PostRecord, str]: + return parse_post( + url, + sources=sources_by_url[url], + lastmod=lastmod_by_url.get(url, ""), + timeout=args.timeout, + ) + + audited: list[tuple[PostRecord, str]] = [] + urls = sorted(sources_by_url) + with ThreadPoolExecutor(max_workers=args.workers) as executor: + futures = {executor.submit(audit, url): url for url in urls} + for index, future in enumerate(as_completed(futures), start=1): + audited.append(future.result()) + if index % 25 == 0 or index == len(urls): + print(f"audited {index}/{len(urls)} posts") + + audited.sort( + key=lambda item: ( + item[0].published_date, + item[0].category.casefold(), + item[0].title.casefold(), + item[0].url, + ) + ) + records = [record for record, _ in audited] + write_inventory(args.output, records) + if args.corpus_json: + write_corpus(args.corpus_json, audited) + if args.site_json: + write_site_inventory(args.site_json, records) + + failures = [record for record in records if record.error or record.http_status != 200] + sitemap_only = [ + record for record in records if record.discovery_sources == "sitemap" + ] + non_sitemap = [record for record in records if not record.sitemap_lastmod] + print(f"inventory: {len(records)} posts") + print(f"sitemap-only: {len(sitemap_only)}") + print(f"discovered outside sitemap: {len(non_sitemap)}") + print(f"parse/fetch failures: {len(failures)}") + return 1 if failures else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/verify-downs-style-archive.py b/scripts/verify-downs-style-archive.py new file mode 100644 index 000000000..c7c898d04 --- /dev/null +++ b/scripts/verify-downs-style-archive.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python3 +"""Verify the tracked Downs Style archive and its bounded presentation data.""" + +from __future__ import annotations + +import argparse +import csv +import json +from collections import Counter +from pathlib import Path +from typing import Any + + +EXPECTED_CATEGORIES = { + "Candles": 18, + "Eat": 12, + "Gift Inspo": 7, + "Interior Design": 8, + "Look Book": 36, + "Masks": 51, + "Skincare": 112, + "Travel": 7, + "Workouts/Diet": 7, +} +EXPECTED_YEARS = { + "2017": 16, + "2018": 78, + "2019": 22, + "2020": 54, + "2021": 22, + "2022": 5, + "2023": 36, + "2024": 24, + "2026": 1, +} + + +def require(condition: bool, message: str) -> None: + if not condition: + raise SystemExit(f"archive verification failed: {message}") + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--ledger", + type=Path, + default=Path("docs/continuations/charles/downs-style-post-ledger.csv"), + ) + parser.add_argument( + "--metrics", + type=Path, + default=Path("docs/continuations/charles/downs-style-voice-metrics.json"), + ) + parser.add_argument( + "--site-json", + type=Path, + default=Path( + "docs/continuations/charles/rose-toners-share/data/posts.json" + ), + ) + return parser.parse_args() + + +def load_json(path: Path) -> Any: + return json.loads(path.read_text(encoding="utf-8")) + + +def main() -> int: + args = parse_args() + with args.ledger.open(newline="", encoding="utf-8") as handle: + records = list(csv.DictReader(handle)) + + require(len(records) == 258, f"expected 258 ledger rows, found {len(records)}") + urls = [record["url"] for record in records] + require(len(set(urls)) == 258, "ledger URLs are not unique") + require( + all(record["http_status"] == "200" for record in records), + "not every archived URL returned HTTP 200", + ) + require( + all(not record["error"] for record in records), + "one or more posts have a parse error", + ) + require( + {record["author"] for record in records} == {"Chas Downs"}, + "author metadata is not uniformly Chas Downs", + ) + require( + len({record["content_sha256"] for record in records}) == 258, + "content fingerprints are missing or duplicated", + ) + require( + Counter(record["category"] for record in records) == EXPECTED_CATEGORIES, + "category counts changed", + ) + require( + Counter(record["published_date"][:4] for record in records) == EXPECTED_YEARS, + "year counts changed", + ) + require(records[0]["published_date"][:10] == "2017-12-04", "earliest date changed") + require(records[-1]["published_date"][:10] == "2026-08-02", "latest date changed") + require( + sum(not record["sitemap_lastmod"] for record in records) == 1, + "expected exactly one post discovered outside the sitemap", + ) + + metrics = load_json(args.metrics) + require(metrics.get("schema_version") == 1, "unsupported metrics schema") + require(metrics["source"]["public_post_count"] == 258, "metrics omit public posts") + require( + metrics["source"]["contains_verbatim_article_text"] is False, + "metrics claim to contain verbatim article text", + ) + require(metrics["baseline"]["included_posts"] == 257, "baseline must contain 257 posts") + require(metrics["baseline"]["excluded_posts"] == 1, "baseline must exclude one newer post") + require(metrics["baseline"]["cutoff"] == "2024-12-31", "baseline cutoff changed") + + site_posts = load_json(args.site_json) + require(isinstance(site_posts, list), "site archive must be a JSON list") + require(len(site_posts) == 258, "site archive must expose all 258 posts") + require( + {post.get("url") for post in site_posts} == set(urls), + "site and ledger URL sets differ", + ) + prohibited = {"body", "content", "html", "tags"} + require( + all(not (prohibited & post.keys()) for post in site_posts), + "site data includes article bodies or noisy raw tags", + ) + require( + all(post.get("author") == "Chas Downs" for post in site_posts), + "site author metadata changed", + ) + + print( + "verified 258 unique Downs Style posts, nine categories, " + "a 257-post causal voice baseline, and body-free site data" + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())