@pmax-lt/ui-react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/dist/components/ActiveFilters.d.ts +11 -0
  4. package/dist/components/AddToCartButton.d.ts +14 -0
  5. package/dist/components/AnnouncementBar.d.ts +10 -0
  6. package/dist/components/ArticleCard.d.ts +8 -0
  7. package/dist/components/AttributeChip.d.ts +6 -0
  8. package/dist/components/AttributeList.d.ts +6 -0
  9. package/dist/components/Breadcrumbs.d.ts +9 -0
  10. package/dist/components/CartButton.d.ts +5 -0
  11. package/dist/components/CategoryRail.d.ts +6 -0
  12. package/dist/components/CategoryTile.d.ts +8 -0
  13. package/dist/components/CollapsiblePanel.d.ts +8 -0
  14. package/dist/components/CompareButton.d.ts +11 -0
  15. package/dist/components/ContactItem.d.ts +8 -0
  16. package/dist/components/Drawer.d.ts +10 -0
  17. package/dist/components/FilterChipGroup.d.ts +14 -0
  18. package/dist/components/FilterPanel.d.ts +13 -0
  19. package/dist/components/FilterSection.d.ts +7 -0
  20. package/dist/components/Footer.d.ts +19 -0
  21. package/dist/components/FulfillmentBadges.d.ts +8 -0
  22. package/dist/components/FulfillmentPanel.d.ts +12 -0
  23. package/dist/components/HeaderShell.d.ts +16 -0
  24. package/dist/components/HeroCarousel.d.ts +10 -0
  25. package/dist/components/HeroSlide.d.ts +14 -0
  26. package/dist/components/LangSwitcher.d.ts +7 -0
  27. package/dist/components/Logo.d.ts +14 -0
  28. package/dist/components/MediaBanner.d.ts +12 -0
  29. package/dist/components/Modal.d.ts +10 -0
  30. package/dist/components/NavBar.d.ts +19 -0
  31. package/dist/components/NavItem.d.ts +10 -0
  32. package/dist/components/Pagination.d.ts +7 -0
  33. package/dist/components/Price.d.ts +11 -0
  34. package/dist/components/PriceRangeFilter.d.ts +8 -0
  35. package/dist/components/ProductCard.d.ts +26 -0
  36. package/dist/components/ProductCarousel.d.ts +11 -0
  37. package/dist/components/ProductGallery.d.ts +7 -0
  38. package/dist/components/ProductGrid.d.ts +9 -0
  39. package/dist/components/PromoCard.d.ts +9 -0
  40. package/dist/components/Prose.d.ts +5 -0
  41. package/dist/components/SectionHeader.d.ts +8 -0
  42. package/dist/components/SkuChip.d.ts +5 -0
  43. package/dist/components/SortMenu.d.ts +7 -0
  44. package/dist/components/SpecGrid.d.ts +6 -0
  45. package/dist/components/SpecItem.d.ts +7 -0
  46. package/dist/components/Toast.d.ts +15 -0
  47. package/dist/components/WishlistButton.d.ts +6 -0
  48. package/dist/index.d.ts +63 -0
  49. package/dist/index.js +6956 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/pmax-ui-react.css +2 -0
  52. package/dist/primitives/Accordion.d.ts +12 -0
  53. package/dist/primitives/Button.d.ts +28 -0
  54. package/dist/primitives/Checkbox.d.ts +7 -0
  55. package/dist/primitives/Chip.d.ts +12 -0
  56. package/dist/primitives/CountPill.d.ts +6 -0
  57. package/dist/primitives/DisclosureToggle.d.ts +7 -0
  58. package/dist/primitives/Divider.d.ts +6 -0
  59. package/dist/primitives/Icon.d.ts +19 -0
  60. package/dist/primitives/IconButton.d.ts +31 -0
  61. package/dist/primitives/Input.d.ts +15 -0
  62. package/dist/primitives/Overlay.d.ts +6 -0
  63. package/dist/primitives/RangeSlider.d.ts +10 -0
  64. package/dist/primitives/SearchField.d.ts +10 -0
  65. package/dist/primitives/Select.d.ts +12 -0
  66. package/dist/primitives/Skeleton.d.ts +8 -0
  67. package/dist/primitives/Surface.d.ts +11 -0
  68. package/dist/primitives/Tag.d.ts +9 -0
  69. package/dist/primitives/Text.d.ts +19 -0
  70. package/dist/tokens.css +97 -0
  71. package/package.json +57 -0
@@ -0,0 +1,2 @@
1
+ *,:before,:after{box-sizing:border-box}body{background:var(--surface);color:var(--ink);font-family:var(--font-body);font-size:var(--t-body-size);line-height:var(--t-body-lh);margin:0}img,svg{max-width:100%;display:block}button,input,select,textarea{font:inherit;color:inherit}:root{--brand:#f1f62a;--brand-tint:#fdffad;--brand-gradient-start:#f9fe2e;--ink:#020202;--ink-soft:#1e1b18;--surface:#fcfcfc;--surface-sunk:#f7f7f7;--surface-panel:#eee;--surface-media:#e9e9e9;--border:#dedede;--text-muted:#6e6e6e;--text-faint:#a9a9a9;--price-old:var(--text-faint);--badge-bg:var(--brand);--focus-ring:var(--ink);--overlay:#02020299;--r-xs:6px;--r-md:12px;--r-lg:20px;--r-pill:999px;--page-w:1920px;--content-w:1800px;--page-gutter:60px;--tile-w:344px;--tile-h:420px;--tile-ratio:5 / 6;--sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:20px;--sp-6:24px;--sp-7:32px;--sp-8:40px;--sp-9:60px;--sp-10:80px;--font-display:"Archivo", "Arial Narrow", system-ui, sans-serif;--font-body:"Inter", system-ui, -apple-system, "Segoe UI", sans-serif;--font-mono:"JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;--t-display-1-size:56px;--t-display-1-lh:1.05;--t-display-1-tracking:.02em;--t-display-2-size:36px;--t-display-2-lh:1.1;--t-display-2-tracking:.02em;--t-display-3-size:24px;--t-display-3-lh:1.15;--t-display-3-tracking:.01em;--t-body-size:16px;--t-body-lh:1.5;--t-body-sm-size:14px;--t-body-sm-lh:1.5;--t-label-size:12px;--t-label-lh:1.4;--t-label-tracking:.04em;--t-mono-size:13px;--t-mono-lh:1.4;--dur-fast:.15s;--dur:.2s;--ease:cubic-bezier(.2, 0, .2, 1)}@media (prefers-reduced-motion:reduce){:root{--dur-fast:0s;--dur:0s}}._base_1d84w_1{margin:0}._display1_1d84w_5{font-family:var(--font-display);font-size:var(--t-display-1-size);line-height:var(--t-display-1-lh);letter-spacing:var(--t-display-1-tracking);text-transform:uppercase;font-weight:700}._display2_1d84w_14{font-family:var(--font-display);font-size:var(--t-display-2-size);line-height:var(--t-display-2-lh);letter-spacing:var(--t-display-2-tracking);text-transform:uppercase;font-weight:600}._display3_1d84w_23{font-family:var(--font-display);font-size:var(--t-display-3-size);line-height:var(--t-display-3-lh);letter-spacing:var(--t-display-3-tracking);text-transform:uppercase;font-weight:600}._body_1d84w_32{font-family:var(--font-body);font-size:var(--t-body-size);line-height:var(--t-body-lh);font-weight:400}._bodySm_1d84w_39{font-family:var(--font-body);font-size:var(--t-body-sm-size);line-height:var(--t-body-sm-lh);font-weight:400}._label_1d84w_46{font-family:var(--font-display);font-size:var(--t-label-size);line-height:var(--t-label-lh);letter-spacing:var(--t-label-tracking);text-transform:uppercase;font-weight:600}._mono_1d84w_55{font-family:var(--font-mono);font-size:var(--t-mono-size);line-height:var(--t-mono-lh);font-weight:400}._colorInk_1d84w_62{color:var(--ink)}._colorMuted_1d84w_66{color:var(--text-muted)}._colorFaint_1d84w_70{color:var(--text-faint)}._colorBrand_1d84w_74{color:var(--ink);background:var(--brand)}._clamp_1d84w_79{-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}._base_gs53c_1{justify-content:center;align-items:center;gap:var(--sp-2);border-radius:var(--r-md);font-family:var(--font-display);letter-spacing:.01em;text-transform:uppercase;cursor:pointer;transition:background-color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), opacity var(--dur-fast) var(--ease);white-space:nowrap;border:1px solid #0000;font-weight:600;display:inline-flex}._base_gs53c_1:disabled{opacity:.5;cursor:not-allowed}._sm_gs53c_27{height:40px;padding-inline:var(--sp-5);font-size:13px}._md_gs53c_33{height:48px;padding-inline:var(--sp-6);font-size:14px}._fullWidth_gs53c_39{width:100%}._primary_gs53c_43{background:var(--brand);color:var(--ink)}._primary_gs53c_43:hover:not(:disabled){background:var(--brand-tint)}._secondary_gs53c_54{background:var(--ink);color:#fff}._secondary_gs53c_54:hover:not(:disabled){box-shadow:0 8px 24px #f1f62a73}._tertiary_gs53c_63{color:var(--ink);background:0 0;border-color:#0000}._tertiary_gs53c_63:hover:not(:disabled){background:var(--surface-panel)}._outline_gs53c_73{color:var(--ink);border-color:var(--border);background:0 0}._outline_gs53c_73:hover:not(:disabled){border-color:var(--ink)}._spinner_gs53c_83{animation:.8s linear infinite _spin_gs53c_83}@media (prefers-reduced-motion:reduce){._spinner_gs53c_83{animation-duration:1.6s}}@keyframes _spin_gs53c_83{to{transform:rotate(360deg)}}._base_zgvpf_1{border-radius:var(--r-md);cursor:pointer;transition:background-color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);border:1px solid #0000;justify-content:center;align-items:center;display:inline-flex;position:relative}._base_zgvpf_1:disabled{opacity:.5;cursor:not-allowed}._sm_zgvpf_21{width:32px;height:32px}._md_zgvpf_26{width:40px;height:40px}._lg_zgvpf_31{width:48px;height:48px}._yellow_zgvpf_36{background:var(--brand);color:var(--ink)}._yellow_zgvpf_36:hover:not(:disabled){background:var(--brand-tint)}._ink_zgvpf_45{background:var(--ink);color:#fff}._ink_zgvpf_45:hover:not(:disabled){background:var(--ink-soft)}._ghost_zgvpf_54{color:var(--ink);background:0 0}._ghost_zgvpf_54:hover:not(:disabled){background:var(--surface-panel)}._outline_zgvpf_63{background:var(--surface);color:var(--ink);border-color:var(--border)}._outline_zgvpf_63:hover:not(:disabled){border-color:var(--ink)}._badge_zgvpf_73{border-radius:var(--r-pill);background:var(--ink);color:#fff;min-width:18px;height:18px;font-family:var(--font-mono);text-align:center;padding-inline:4px;font-size:10px;line-height:18px;position:absolute;top:-4px;right:-4px}._base_1cws8_1{border-radius:var(--r-pill);min-width:20px;height:20px;font-family:var(--font-mono);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;padding-inline:6px;font-size:11px;line-height:1;display:inline-flex}._ink_1cws8_15{background:var(--ink);color:#fff}._subtle_1cws8_20{background:var(--surface);color:var(--text-muted)}._label_1grzc_1{align-items:center;gap:var(--sp-2);height:40px;padding-inline:var(--sp-4);border-radius:var(--r-md);cursor:pointer;font-family:var(--font-body);transition:background-color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);font-size:14px;font-weight:500;display:inline-flex}._disabled_1grzc_28{opacity:.5;cursor:not-allowed}._input_1grzc_33{clip-path:inset(50%);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}._base_9ctoe_1{height:24px;padding-inline:var(--sp-2);border-radius:var(--r-xs);font-family:var(--font-body);white-space:nowrap;border:1px solid #0000;align-items:center;gap:4px;font-size:12px;font-weight:500;display:inline-flex}._yellow_9ctoe_15{background:var(--brand);color:var(--ink)}._dark_9ctoe_20{background:var(--ink-soft);color:#fff}._outline_9ctoe_25{border-color:var(--border);color:var(--ink);background:0 0}._wrap_10aoc_1{align-items:center;gap:var(--sp-2);width:100%;height:48px;padding-inline:var(--sp-4);border-radius:var(--r-md);background:var(--surface-panel);transition:background-color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);border:1px solid #0000;display:inline-flex}._wrap_10aoc_1:hover{background:var(--surface);border-color:var(--ink)}._wrap_10aoc_1:focus-within{background:var(--ink);border-color:var(--ink);color:#fff}._sm_10aoc_29{height:40px}._invalid_10aoc_33{border-color:#c62828}._disabled_10aoc_37{opacity:.5}._field_10aoc_41{min-width:0;color:inherit;font-family:var(--font-body);background:0 0;border:none;outline:none;flex:1;font-size:14px}._field_10aoc_41::placeholder{color:var(--text-faint)}._affix_10aoc_56{color:var(--text-muted);font-family:var(--font-body);flex:none;font-size:14px}._wrap_10aoc_1:focus-within ._affix_10aoc_56{color:#fff}._root_d1zhu_1{width:100%;position:relative}._wrap_d1zhu_6{align-items:center;gap:var(--sp-2);height:48px;padding-left:var(--sp-5);border-radius:var(--r-pill);background:var(--surface-panel);transition:background-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);border:1px solid #0000;padding-right:6px;display:flex}._wrap_d1zhu_6:hover{background:var(--surface);border-color:var(--ink)}._wrap_d1zhu_6:focus-within{background:var(--ink);border-color:var(--ink);color:#fff}._field_d1zhu_33{min-width:0;color:inherit;font-family:var(--font-body);background:0 0;border:none;outline:none;flex:1;font-size:14px}._field_d1zhu_33::placeholder{color:var(--text-faint)}._submit_d1zhu_48{border-radius:var(--r-pill);background:var(--brand);width:36px;height:36px;color:var(--ink);cursor:pointer;border:none;flex:none;justify-content:center;align-items:center;display:inline-flex}._results_d1zhu_62{z-index:20;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);padding:var(--sp-2);position:absolute;top:calc(100% + 8px);left:0;right:0;box-shadow:0 12px 32px #0000001f}._resultItem_d1zhu_75{text-align:left;width:100%;padding:var(--sp-2) var(--sp-3);border-radius:var(--r-xs);font-family:var(--font-body);cursor:pointer;background:0 0;border:none;font-size:14px;display:block}._resultItem_d1zhu_75:hover{background:var(--surface-panel)}._root_qyzuu_1{border-radius:var(--r-xs);border:1px solid var(--border);background:var(--surface);cursor:pointer;flex:none;justify-content:center;align-items:center;width:20px;height:20px;display:inline-flex}._root_qyzuu_1[data-state=checked],._root_qyzuu_1[data-state=indeterminate]{background:var(--ink);border-color:var(--ink);color:#fff}._label_qyzuu_22{align-items:center;gap:var(--sp-2);font-family:var(--font-body);cursor:pointer;font-size:14px;display:inline-flex}._root_yd6dz_1{touch-action:none;align-items:center;width:100%;height:24px;display:flex;position:relative}._track_yd6dz_10{background:var(--border);border-radius:var(--r-pill);flex:1;height:2px;position:relative}._range_yd6dz_18{background:var(--ink);border-radius:var(--r-pill);height:100%;position:absolute}._thumb_yd6dz_25{background:var(--ink);cursor:pointer;border-radius:50%;width:18px;height:18px;display:block}._thumb_yd6dz_25:hover{background:var(--ink-soft)}._root_yd6dz_1[data-disabled] ._thumb_yd6dz_25,._root_yd6dz_1[data-disabled] ._range_yd6dz_18{opacity:.5;cursor:not-allowed}._trigger_1rqb4_1{justify-content:space-between;align-items:center;gap:var(--sp-2);height:48px;padding-inline:var(--sp-4);border-radius:var(--r-md);background:var(--surface-panel);color:var(--ink);font-family:var(--font-body);cursor:pointer;transition:background-color var(--dur-fast) var(--ease);border:1px solid #0000;font-size:14px;display:inline-flex}._trigger_1rqb4_1:hover{background:var(--surface);border-color:var(--ink)}._trigger_1rqb4_1[data-state=open]{background:var(--ink);color:#fff}._sm_1rqb4_29{height:40px}._chevron_1rqb4_33{transition:transform var(--dur-fast) var(--ease)}._trigger_1rqb4_1[data-state=open] ._chevron_1rqb4_33{transform:rotate(180deg)}._content_1rqb4_41{min-width:var(--radix-dropdown-menu-trigger-width,160px);background:var(--ink);color:#fff;border-radius:var(--r-md);padding:var(--sp-2);z-index:30;box-shadow:0 12px 32px #00000040}._item_1rqb4_51{padding:var(--sp-2) var(--sp-3);border-radius:var(--r-xs);font-family:var(--font-body);cursor:pointer;outline:none;font-size:14px;display:block}._item_1rqb4_51[data-highlighted]{background:var(--ink-soft)}._item_1rqb4_51[data-state=checked]{color:var(--brand)}._base_1bycs_1{border-radius:var(--r-pill);border:1px solid var(--border);color:var(--ink);cursor:pointer;transition:background-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease);background:0 0;justify-content:center;align-items:center;display:inline-flex}._base_1bycs_1:hover{background:var(--surface-panel);border-color:#0000}._base_1bycs_1:active{background:var(--surface);border-color:var(--ink)}._expanded_1bycs_27{background:var(--ink);border-color:var(--ink);color:#fff;transform:rotate(180deg)}._sm_1bycs_34{width:32px;height:32px}._md_1bycs_39{width:40px;height:40px}._item_1n84i_1{border-bottom:1px solid var(--border)}._header_1n84i_5{margin:0}._trigger_1n84i_9{width:100%;padding:var(--sp-4) 0;color:var(--ink);font-family:var(--font-display);text-transform:uppercase;letter-spacing:.01em;cursor:pointer;background:0 0;border:none;justify-content:space-between;align-items:center;font-size:15px;font-weight:600;display:flex}._chevron_1n84i_27{transition:transform var(--dur-fast) var(--ease)}._trigger_1n84i_9[data-state=open] ._chevron_1n84i_27{transform:rotate(180deg)}._content_1n84i_35{overflow:hidden}._content_1n84i_35[data-state=open]{animation:_open_1n84i_1 var(--dur) var(--ease)}._content_1n84i_35[data-state=closed]{animation:_close_1n84i_1 var(--dur) var(--ease)}._contentInner_1n84i_47{padding-bottom:var(--sp-4)}@keyframes _open_1n84i_1{0%{height:0}to{height:var(--radix-accordion-content-height)}}@keyframes _close_1n84i_1{0%{height:var(--radix-accordion-content-height)}to{height:0}}._shimmer_139c4_1{background:linear-gradient(90deg, var(--surface-panel) 25%, var(--surface-media) 37%, var(--surface-panel) 63%);background-size:400% 100%;animation:1.4s infinite _shimmer_139c4_1}._static_139c4_7{background:var(--surface-panel)}@keyframes _shimmer_139c4_1{0%{background-position:100%}to{background-position:0}}@media (prefers-reduced-motion:reduce){._shimmer_139c4_1{animation:none}}._bar_1wt48_1{justify-content:center;align-items:center;gap:var(--sp-2);border-radius:var(--r-md);background:var(--brand);height:48px;color:var(--ink);font-family:var(--font-body);max-width:var(--content-w);margin-inline:auto;font-size:14px;font-weight:500;display:flex;position:relative}._dismiss_1wt48_18{right:var(--sp-4);color:var(--ink);cursor:pointer;background:0 0;border:none;display:inline-flex;position:absolute;top:50%;transform:translateY(-50%)}._mark_i17hj_1{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.02em;color:var(--ink);white-space:nowrap;align-items:center;font-weight:700;line-height:1;display:inline-flex}._v2_i17hj_13 ._accent_i17hj_13{background:var(--brand);padding:0 .12em}._v3_i17hj_18{background:var(--ink);color:#fff;border-radius:var(--r-xs);padding:.3em .5em}._symbol_i17hj_25{aspect-ratio:1;background:var(--brand);color:var(--ink);border-radius:var(--r-xs);justify-content:center;align-items:center;font-weight:700;display:inline-flex}._link_icul5_1{height:40px;padding-inline:var(--sp-4);border-radius:var(--r-pill);color:var(--ink);font-family:var(--font-body);transition:background-color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);border:1px solid #0000;align-items:center;gap:4px;font-size:14px;font-weight:500;text-decoration:none;display:inline-flex}._link_icul5_1:hover{border-color:var(--ink)}._active_icul5_24{background:var(--brand);border-color:#0000}._chevron_icul5_29{transition:transform var(--dur-fast) var(--ease)}._open_icul5_33 ._chevron_icul5_29{transform:rotate(180deg)}._bar_k59n0_1{justify-content:space-between;align-items:center;gap:var(--sp-6);display:flex}._primary_k59n0_8,._secondary_k59n0_9{align-items:center;gap:var(--sp-2);display:flex}._item_k59n0_15{position:relative}._dropdown_k59n0_19{padding-top:var(--sp-2);z-index:30;opacity:0;visibility:hidden;transition:opacity var(--dur-fast) var(--ease), visibility var(--dur-fast) var(--ease);position:absolute;top:100%;left:0}._item_k59n0_15:hover ._dropdown_k59n0_19,._item_k59n0_15:focus-within ._dropdown_k59n0_19{opacity:1;visibility:visible}._panel_k59n0_38{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-md);min-width:220px;padding:var(--sp-2);gap:2px;display:grid;box-shadow:0 12px 32px #00000024}._panelLink_k59n0_49{padding:var(--sp-2) var(--sp-3);border-radius:var(--r-xs);color:var(--ink);font-family:var(--font-body);font-size:14px;text-decoration:none;display:block}._panelLink_k59n0_49:hover{background:var(--surface-panel)}._tile_iwfq7_1{justify-content:center;align-items:center;gap:var(--sp-2);border-radius:var(--r-md);background:var(--surface);width:140px;height:120px;color:var(--ink);text-align:center;scroll-snap-align:start;transition:border-color var(--dur-fast) var(--ease);border:1px solid #0000;flex-direction:column;flex:none;text-decoration:none;display:flex}._tile_iwfq7_1:hover{border-color:var(--border)}._selected_iwfq7_25{border-color:var(--ink)}._label_iwfq7_29{font-family:var(--font-body);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:13px;font-weight:500;line-height:1.3;display:-webkit-box;overflow:hidden}._rail_ia9r7_1{gap:var(--sp-3);padding:var(--sp-4);border-radius:var(--r-lg);background:var(--surface-panel);scroll-snap-type:x proximity;display:flex;overflow-x:auto}@media (width>=1200px){._rail_ia9r7_1{flex-wrap:wrap;overflow-x:visible}}._root_ulh45_1{background:var(--surface)}._sticky_ulh45_5{z-index:50;position:sticky;top:0}._inner_ulh45_11{max-width:var(--content-w);padding-inline:var(--page-gutter);margin-inline:auto}._announcementRow_ulh45_17{padding-block:var(--sp-3)}._chromeRow_ulh45_21{justify-content:space-between;align-items:center;gap:var(--sp-6);padding-block:var(--sp-4);display:flex}._railRow_ulh45_29{padding-block:var(--sp-4)}._row_1e6sz_1{align-items:baseline;gap:var(--sp-2);flex-wrap:wrap;display:inline-flex}._xl_1e6sz_8{font-size:48px}._lg_1e6sz_12{font-size:28px}._sm_1e6sz_16{font-size:16px}._amount_1e6sz_20{font-family:var(--font-display);color:var(--ink);align-items:baseline;font-size:1em;font-weight:700;display:inline-flex}._cents_1e6sz_29{font-size:.55em;position:relative;top:-.5em}._currency_1e6sz_35{margin-left:2px;font-size:.6em}._old_1e6sz_40{color:var(--price-old);font-family:var(--font-body);align-self:center;font-size:.4em;text-decoration:line-through}._note_1e6sz_48{color:var(--text-muted);font-family:var(--font-body);width:100%;font-size:12px}._card_qj9lp_1{color:var(--ink);border-radius:var(--r-lg);padding:var(--sp-3);transition:background-color var(--dur-fast) var(--ease);display:block;position:relative}._card_qj9lp_1:hover,._card_qj9lp_1:focus-within{background:var(--surface-sunk)}._linkOverlay_qj9lp_24{z-index:1;border-radius:var(--r-lg);position:absolute;inset:0}._tile_qj9lp_32{width:100%;aspect-ratio:var(--tile-ratio);border-radius:var(--r-md);background:var(--surface-media);position:relative;overflow:hidden}._image_qj9lp_41{object-fit:cover;width:100%;height:100%;transition:opacity var(--dur) var(--ease);position:absolute;inset:0}._imageSecondary_qj9lp_50,._card_qj9lp_1:hover ._imagePrimary_qj9lp_54,._card_qj9lp_1:focus-within ._imagePrimary_qj9lp_54{opacity:0}._card_qj9lp_1:hover ._imageSecondary_qj9lp_50,._card_qj9lp_1:focus-within ._imageSecondary_qj9lp_50{opacity:1}._badges_qj9lp_64{top:var(--sp-2);left:var(--sp-2);z-index:2;position:absolute}._actions_qj9lp_71{top:var(--sp-2);right:var(--sp-2);z-index:2;gap:var(--sp-2);flex-direction:column;display:flex;position:absolute}._compareSlot_qj9lp_81{opacity:0;transition:opacity var(--dur-fast) var(--ease)}._card_qj9lp_1:hover ._compareSlot_qj9lp_81,._card_qj9lp_1:focus-within ._compareSlot_qj9lp_81{opacity:1}._outOfStockOverlay_qj9lp_91{z-index:3;font-family:var(--font-display);text-transform:uppercase;letter-spacing:.04em;background:#fcfcfcb3;justify-content:center;align-items:center;font-size:13px;display:flex;position:absolute;inset:0}._body_qj9lp_105{padding-top:var(--sp-3);gap:var(--sp-2);flex-direction:column;display:flex}._title_qj9lp_112{font-family:var(--font-body);-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0;font-size:14px;font-weight:500;line-height:1.35;display:-webkit-box;overflow:hidden}._footer_qj9lp_124{justify-content:space-between;align-items:center;gap:var(--sp-2);display:flex}._root_hpqdf_1{position:relative}._track_hpqdf_5{gap:var(--sp-5);scroll-snap-type:x mandatory;scroll-behavior:smooth;scrollbar-width:none;display:flex;overflow-x:auto}._track_hpqdf_5::-webkit-scrollbar{display:none}._slide_hpqdf_18{scroll-snap-align:start;flex:none}._arrow_hpqdf_23{border:1px solid var(--border);background:var(--surface);cursor:pointer;z-index:2;border-radius:50%;justify-content:center;align-items:center;width:44px;height:44px;display:inline-flex;position:absolute;top:40%;transform:translateY(-50%)}._arrowPrev_hpqdf_40{left:-8px}._arrowNext_hpqdf_44{right:-8px}._dots_hpqdf_48{margin-top:var(--sp-4);justify-content:center;gap:8px;display:flex}._dot_hpqdf_48{background:var(--border);cursor:pointer;border:none;border-radius:50%;width:8px;height:8px;padding:0}._dotActive_hpqdf_65{background:var(--ink)}._nav_1iq3h_1{align-items:center;gap:var(--sp-2);display:flex}._pageBtn_1iq3h_7{width:36px;height:36px;color:var(--ink);font-family:var(--font-mono);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:50%;justify-content:center;align-items:center;font-size:13px;display:inline-flex}._pageBtn_1iq3h_7:hover{border-color:var(--border)}._current_1iq3h_27{background:var(--ink);color:#fff}._ellipsis_1iq3h_32{text-align:center;width:36px;color:var(--text-faint);font-family:var(--font-mono);font-size:13px}._edge_1iq3h_40{height:36px;padding-inline:var(--sp-3);border-radius:var(--r-pill);border:1px solid var(--border);color:var(--ink);font-family:var(--font-body);cursor:pointer;background:0 0;align-items:center;gap:4px;font-size:13px;display:inline-flex}._edge_1iq3h_40:disabled{opacity:.4;cursor:not-allowed}._root_3ugbo_1{gap:var(--sp-3);flex-direction:column;display:flex}._main_3ugbo_7{border-radius:var(--r-lg);background:var(--surface-media);aspect-ratio:var(--tile-ratio);position:relative;overflow:hidden}._mainImage_3ugbo_15{object-fit:cover;width:100%;height:100%}._actions_3ugbo_21{top:var(--sp-3);right:var(--sp-3);gap:var(--sp-2);flex-direction:column;display:flex;position:absolute}._thumbs_3ugbo_30{gap:var(--sp-2);display:flex;overflow-x:auto}._thumb_3ugbo_30{border-radius:var(--r-md);border:1px solid var(--border);cursor:pointer;background:var(--surface-media);flex:none;width:72px;height:72px;padding:0;overflow:hidden}._thumbActive_3ugbo_49{border-color:var(--ink)}._thumbImage_3ugbo_53{object-fit:cover;width:100%;height:100%}._prose_29xo6_1{font-family:var(--font-body);color:var(--ink);max-width:78ch;font-size:15px;line-height:1.7}._prose_29xo6_1 p{margin:0 0 var(--sp-4)}._prose_29xo6_1 h4{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.01em;margin:var(--sp-6) 0 var(--sp-2);font-size:15px;font-weight:600}._prose_29xo6_1 ul,._prose_29xo6_1 ol{margin:0 0 var(--sp-4);padding-left:20px}._prose_29xo6_1 li{margin:4px 0}._prose_29xo6_1 a{color:var(--ink);text-underline-offset:3px;text-decoration-thickness:1px}._slide_w5ynl_1{align-items:center;gap:var(--sp-6);border-radius:var(--r-lg);padding:var(--sp-8);grid-template-columns:1fr 1fr;min-height:420px;display:grid;position:relative;overflow:hidden}._yellow_w5ynl_13{background:linear-gradient(135deg, var(--brand-gradient-start) 0%, var(--brand-tint) 100%);color:var(--ink)}._dark_w5ynl_18{background:var(--ink-soft);color:#fff}._imageOnly_w5ynl_23{background:var(--surface-panel);color:var(--ink)}._eyebrow_w5ynl_28{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.06em;margin-bottom:var(--sp-3);opacity:.75;font-size:13px}._title_w5ynl_37{font-family:var(--font-display);text-transform:uppercase;margin:0 0 var(--sp-4);font-size:40px;font-weight:700;line-height:1.05}._specs_w5ynl_46{margin-bottom:var(--sp-5);flex-direction:column;gap:4px;display:flex}._specRow_w5ynl_53{font-family:var(--font-body);gap:8px;font-size:14px;display:flex}._specLabel_w5ynl_60{opacity:.7}._media_w5ynl_64{object-fit:contain;width:100%;height:100%}._root_6zpaf_1{position:relative}._track_6zpaf_5{gap:var(--sp-5);scroll-snap-type:x mandatory;scroll-behavior:smooth;scrollbar-width:none;display:flex;overflow-x:auto}._track_6zpaf_5::-webkit-scrollbar{display:none}._slide_6zpaf_18{scroll-snap-align:start;flex:none;width:88%}._controls_6zpaf_24{justify-content:center;align-items:center;gap:var(--sp-4);margin-top:var(--sp-4);display:flex}._dots_6zpaf_32{gap:8px;display:flex}._dot_6zpaf_32{background:var(--border);cursor:pointer;border:none;border-radius:50%;width:8px;height:8px;padding:0}._dotActive_6zpaf_47{background:var(--ink)}._pause_6zpaf_51{color:var(--ink);cursor:pointer;background:0 0;border:none;display:inline-flex}._root_vv90t_1{border-radius:var(--r-lg);min-height:320px;position:relative;overflow:hidden}._media_vv90t_8{object-fit:cover;width:100%;height:100%;position:absolute;inset:0}._card_vv90t_16{top:var(--sp-6);bottom:var(--sp-6);justify-content:center;gap:var(--sp-3);width:min(360px,42%);padding:var(--sp-6);background:var(--surface);border-radius:var(--r-lg);flex-direction:column;display:flex;position:absolute}._left_vv90t_30{left:var(--sp-6)}._right_vv90t_34{right:var(--sp-6)}._title_vv90t_38{font-family:var(--font-display);text-transform:uppercase;margin:0;font-size:24px;font-weight:700}._subtitle_vv90t_46{font-family:var(--font-body);color:var(--text-muted);margin:0;font-size:14px}._root_1dvmb_1{background:linear-gradient(180deg, var(--surface) 0%, var(--brand-tint) 140%);padding:var(--sp-10) 0 var(--sp-6)}._inner_1dvmb_6{max-width:var(--content-w);padding-inline:var(--page-gutter);margin-inline:auto}._top_1dvmb_12{justify-content:space-between;align-items:flex-start;gap:var(--sp-8);margin-bottom:var(--sp-8);flex-wrap:wrap;display:flex}._columns_1dvmb_21{gap:var(--sp-6);grid-template-columns:repeat(4,1fr);display:grid}@media (width<=1023px){._columns_1dvmb_21{grid-template-columns:repeat(2,1fr)}}@media (width<=560px){._columns_1dvmb_21{grid-template-columns:1fr}}._columnTitle_1dvmb_39{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.04em;margin:0 0 var(--sp-3);font-size:13px}._link_1dvmb_47{color:var(--text-muted);font-family:var(--font-body);padding:4px 0;font-size:14px;text-decoration:none;display:block}._link_1dvmb_47:hover{color:var(--ink)}._hoursPill_1dvmb_60{border-radius:var(--r-pill);background:var(--ink-soft);color:#fff;height:32px;font-family:var(--font-body);align-items:center;padding-inline:12px;font-size:12px;display:inline-flex}._legal_1dvmb_72{margin-top:var(--sp-8);padding-top:var(--sp-4);border-top:1px solid var(--border);font-family:var(--font-body);color:var(--text-faint);font-size:12px}._overlay_x45gp_1{background:var(--overlay);z-index:60;position:fixed;inset:0}._content_x45gp_8{z-index:61;background:var(--surface);border-radius:var(--r-lg);width:90vw;max-height:85vh;padding:var(--sp-6);position:fixed;top:50%;left:50%;overflow-y:auto;transform:translate(-50%,-50%)}._sm_x45gp_23{max-width:420px}._md_x45gp_27{max-width:640px}._lg_x45gp_31{max-width:900px}._header_x45gp_35{margin-bottom:var(--sp-4);justify-content:space-between;align-items:center;display:flex}._close_x45gp_42{cursor:pointer;color:var(--ink);background:0 0;border:none}._footer_x45gp_50{justify-content:flex-end;gap:var(--sp-3);margin-top:var(--sp-6);display:flex}._viewport_1oa8j_1{z-index:200;pointer-events:none;flex-direction:column;align-items:center;gap:8px;display:flex;position:fixed;bottom:24px;left:50%;transform:translate(-50%)}._toast_1oa8j_14{pointer-events:auto;border-radius:var(--r-md);background:var(--ink);color:#fff;max-width:360px;font-family:var(--font-body);opacity:0;transition:opacity var(--dur) var(--ease), transform var(--dur) var(--ease);padding:12px 20px;font-size:14px;transform:translateY(8px);box-shadow:0 12px 24px #0003}._visible_1oa8j_31{opacity:1;transform:translateY(0)}._success_1oa8j_36{background:var(--ink)}._error_1oa8j_40{background:#b3261e}._info_1oa8j_44{background:var(--ink-soft)}._focusRing_1w4a1_10{outline:none}._focusRing_1w4a1_10:focus-visible{outline:2px solid var(--focus-ring);outline-offset:2px;box-shadow:0 0 0 1px var(--surface)}._stateRest_1w4a1_20{background:var(--surface-panel);color:var(--ink);border:1px solid #0000}._stateHover_1w4a1_26:hover{background:var(--surface);border-color:var(--ink)}._stateSelected_1w4a1_31{background:var(--ink);color:#fff;border-color:var(--ink)}._statePrimary_1w4a1_37{background:var(--brand);color:var(--ink);border-color:#0000}._overlay_1vsks_1{background:var(--overlay);z-index:60;position:fixed;inset:0}._content_1vsks_8{z-index:61;background:var(--surface);padding:var(--sp-6);animation:_slide-in_1vsks_1 var(--dur) var(--ease);position:fixed;overflow-y:auto}._right_1vsks_18{width:min(420px,100vw);top:0;bottom:0;right:0}._left_1vsks_25{width:min(320px,100vw);top:0;bottom:0;left:0}._bottom_1vsks_32{border-radius:var(--r-lg) var(--r-lg) 0 0;max-height:80vh;bottom:0;left:0;right:0}@keyframes _slide-in_1vsks_1{0%{opacity:0}to{opacity:1}}._close_1vsks_49{cursor:pointer;color:var(--ink);top:var(--sp-4);right:var(--sp-4);background:0 0;border:none;position:absolute}
2
+ /*$vite$:1*/
@@ -0,0 +1,12 @@
1
+ import { ReactNode } from 'react';
2
+ export type AccordionItem = {
3
+ value: string;
4
+ title: ReactNode;
5
+ content: ReactNode;
6
+ };
7
+ export type AccordionProps = {
8
+ items: AccordionItem[];
9
+ type?: "single" | "multiple";
10
+ defaultOpen?: string | string[];
11
+ };
12
+ export declare function Accordion({ items, type, defaultOpen }: AccordionProps): import("react").JSX.Element;
@@ -0,0 +1,28 @@
1
+ import { ButtonHTMLAttributes, ElementType, ReactNode } from 'react';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ declare const button: (props?: ({
4
+ variant?: "primary" | "secondary" | "tertiary" | "outline" | null | undefined;
5
+ size?: "sm" | "md" | null | undefined;
6
+ fullWidth?: boolean | null | undefined;
7
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
8
+ export type ButtonProps = {
9
+ as?: ElementType;
10
+ iconLeft?: ReactNode;
11
+ iconRight?: ReactNode;
12
+ loading?: boolean;
13
+ className?: string;
14
+ children?: ReactNode;
15
+ } & VariantProps<typeof button> & ButtonHTMLAttributes<HTMLButtonElement>;
16
+ export declare const Button: import('react').ForwardRefExoticComponent<{
17
+ as?: ElementType;
18
+ iconLeft?: ReactNode;
19
+ iconRight?: ReactNode;
20
+ loading?: boolean;
21
+ className?: string;
22
+ children?: ReactNode;
23
+ } & VariantProps<(props?: ({
24
+ variant?: "primary" | "secondary" | "tertiary" | "outline" | null | undefined;
25
+ size?: "sm" | "md" | null | undefined;
26
+ fullWidth?: boolean | null | undefined;
27
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string> & ButtonHTMLAttributes<HTMLButtonElement> & import('react').RefAttributes<HTMLButtonElement>>;
28
+ export {};
@@ -0,0 +1,7 @@
1
+ export type CheckboxProps = {
2
+ checked: boolean | "indeterminate";
3
+ onCheckedChange: (checked: boolean | "indeterminate") => void;
4
+ label: string;
5
+ disabled?: boolean;
6
+ };
7
+ export declare function Checkbox({ checked, onCheckedChange, label, disabled }: CheckboxProps): import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ import { InputHTMLAttributes, ReactNode } from 'react';
2
+ export type ChipProps = {
3
+ selected: boolean;
4
+ onToggle: (selected: boolean) => void;
5
+ count?: number;
6
+ disabled?: boolean;
7
+ /** "checkbox" for multi-select groups, "radio" for single-select. */
8
+ type?: "checkbox" | "radio";
9
+ children: ReactNode;
10
+ className?: string;
11
+ } & Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "checked" | "onChange" | "onToggle" | "children">;
12
+ export declare function Chip({ selected, onToggle, count, disabled, type, children, className, name, value, ...rest }: ChipProps): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ export type CountPillProps = {
2
+ value: number;
3
+ tone?: "ink" | "subtle";
4
+ className?: string;
5
+ };
6
+ export declare function CountPill({ value, tone, className }: CountPillProps): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { ButtonHTMLAttributes } from 'react';
2
+ export type DisclosureToggleProps = {
3
+ expanded: boolean;
4
+ size?: "sm" | "md";
5
+ label?: string;
6
+ } & ButtonHTMLAttributes<HTMLButtonElement>;
7
+ export declare function DisclosureToggle({ expanded, size, label, className, ...rest }: DisclosureToggleProps): import("react").JSX.Element;
@@ -0,0 +1,6 @@
1
+ export type DividerProps = {
2
+ orientation?: "horizontal" | "vertical";
3
+ tone?: "border" | "ink";
4
+ className?: string;
5
+ };
6
+ export declare function Divider({ orientation, tone, className }: DividerProps): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { ReactElement, SVGProps } from 'react';
2
+ /**
3
+ * The PMAX icon set: 24×24 grid, 2px stroke, round caps, no fill,
4
+ * `currentColor` — so size and color are inherited from CSS, never baked
5
+ * into the SVG. Registry is intentionally a subset of the ~47 icons named
6
+ * in the design plan (§3 "Icons") — the ones the components in this
7
+ * package actually use. Extending it is just adding a path entry.
8
+ */
9
+ declare const PATHS: Record<string, ReactElement>;
10
+ export type IconName = keyof typeof PATHS;
11
+ export type IconProps = {
12
+ name: IconName;
13
+ /** The design system's scale is 16/20/24/32, but this accepts any number
14
+ * for the odd in-between size (e.g. a 14px chevron next to 13px text). */
15
+ size?: number;
16
+ label?: string;
17
+ } & Omit<SVGProps<SVGSVGElement>, "name">;
18
+ export declare function Icon({ name, size, label, ...rest }: IconProps): import("react").JSX.Element | null;
19
+ export {};
@@ -0,0 +1,31 @@
1
+ import { ButtonHTMLAttributes, ElementType } from 'react';
2
+ import { VariantProps } from 'class-variance-authority';
3
+ import { IconName } from './Icon';
4
+ declare const iconButton: (props?: ({
5
+ variant?: "ink" | "outline" | "yellow" | "ghost" | null | undefined;
6
+ size?: "sm" | "md" | "lg" | null | undefined;
7
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string;
8
+ export type IconButtonProps = {
9
+ as?: ElementType;
10
+ /** Only meaningful when `as="a"`. */
11
+ href?: string;
12
+ icon: IconName;
13
+ /** Required — this button's only accessible name. */
14
+ label: string;
15
+ badge?: string | number;
16
+ className?: string;
17
+ } & VariantProps<typeof iconButton> & ButtonHTMLAttributes<HTMLButtonElement>;
18
+ export declare const IconButton: import('react').ForwardRefExoticComponent<{
19
+ as?: ElementType;
20
+ /** Only meaningful when `as="a"`. */
21
+ href?: string;
22
+ icon: IconName;
23
+ /** Required — this button's only accessible name. */
24
+ label: string;
25
+ badge?: string | number;
26
+ className?: string;
27
+ } & VariantProps<(props?: ({
28
+ variant?: "ink" | "outline" | "yellow" | "ghost" | null | undefined;
29
+ size?: "sm" | "md" | "lg" | null | undefined;
30
+ } & import('class-variance-authority/types').ClassProp) | undefined) => string> & ButtonHTMLAttributes<HTMLButtonElement> & import('react').RefAttributes<HTMLButtonElement>>;
31
+ export {};
@@ -0,0 +1,15 @@
1
+ import { InputHTMLAttributes, ReactNode } from 'react';
2
+ export type InputProps = {
3
+ prefix?: ReactNode;
4
+ suffix?: ReactNode;
5
+ invalid?: boolean;
6
+ size?: "sm" | "md";
7
+ wrapperClassName?: string;
8
+ } & Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "prefix">;
9
+ export declare const Input: import('react').ForwardRefExoticComponent<{
10
+ prefix?: ReactNode;
11
+ suffix?: ReactNode;
12
+ invalid?: boolean;
13
+ size?: "sm" | "md";
14
+ wrapperClassName?: string;
15
+ } & Omit<InputHTMLAttributes<HTMLInputElement>, "size" | "prefix"> & import('react').RefAttributes<HTMLInputElement>>;
@@ -0,0 +1,6 @@
1
+ export type OverlayProps = {
2
+ open: boolean;
3
+ onClose?: () => void;
4
+ blur?: boolean;
5
+ };
6
+ export declare function Overlay({ open, onClose, blur }: OverlayProps): import("react").JSX.Element | null;
@@ -0,0 +1,10 @@
1
+ export type RangeSliderProps = {
2
+ min: number;
3
+ max: number;
4
+ step?: number;
5
+ value: [number, number];
6
+ onChange: (value: [number, number]) => void;
7
+ formatValue?: (value: number) => string;
8
+ disabled?: boolean;
9
+ };
10
+ export declare function RangeSlider({ min, max, step, value, onChange, formatValue, disabled }: RangeSliderProps): import("react").JSX.Element;
@@ -0,0 +1,10 @@
1
+ export type SearchFieldProps = {
2
+ value: string;
3
+ onChange: (value: string) => void;
4
+ onSearch: (value: string) => void;
5
+ placeholder?: string;
6
+ loading?: boolean;
7
+ suggestions?: string[];
8
+ onSuggestionSelect?: (value: string) => void;
9
+ };
10
+ export declare function SearchField({ value, onChange, onSearch, placeholder, loading, suggestions, onSuggestionSelect }: SearchFieldProps): import("react").JSX.Element;
@@ -0,0 +1,12 @@
1
+ export type SelectOption = {
2
+ label: string;
3
+ value: string;
4
+ };
5
+ export type SelectProps = {
6
+ options: SelectOption[];
7
+ value: string;
8
+ onChange: (value: string) => void;
9
+ size?: "sm" | "md";
10
+ triggerLabel?: (option: SelectOption | undefined) => string;
11
+ };
12
+ export declare function Select({ options, value, onChange, size, triggerLabel }: SelectProps): import("react").JSX.Element;
@@ -0,0 +1,8 @@
1
+ export type SkeletonProps = {
2
+ w?: number | string;
3
+ h?: number | string;
4
+ radius?: "xs" | "md" | "lg" | "pill";
5
+ circle?: boolean;
6
+ className?: string;
7
+ };
8
+ export declare function Skeleton({ w, h, radius, circle, className }: SkeletonProps): import("react").JSX.Element;
@@ -0,0 +1,11 @@
1
+ import { ElementType, ComponentPropsWithoutRef } from 'react';
2
+ export type SurfaceTone = "page" | "sunk" | "panel" | "media" | "yellow" | "ink";
3
+ export type SurfaceProps<E extends ElementType = "div"> = {
4
+ as?: E;
5
+ tone?: SurfaceTone;
6
+ radius?: "xs" | "md" | "lg" | "pill" | "none";
7
+ border?: boolean;
8
+ padding?: number | string;
9
+ className?: string;
10
+ } & Omit<ComponentPropsWithoutRef<E>, "as" | "color">;
11
+ export declare function Surface<E extends ElementType = "div">({ as, tone, radius, border, padding, className, style, ...rest }: SurfaceProps<E>): import("react").JSX.Element;
@@ -0,0 +1,9 @@
1
+ import { ReactNode } from 'react';
2
+ import { IconName } from './Icon';
3
+ export type TagProps = {
4
+ icon?: IconName;
5
+ tone?: "yellow" | "dark" | "outline";
6
+ children: ReactNode;
7
+ className?: string;
8
+ };
9
+ export declare function Tag({ icon, tone, children, className }: TagProps): import("react").JSX.Element;
@@ -0,0 +1,19 @@
1
+ import { ElementType, ComponentPropsWithoutRef } from 'react';
2
+ export type TextVariant = "display-1" | "display-2" | "display-3" | "body" | "body-sm" | "label" | "mono";
3
+ export type TextColor = "ink" | "muted" | "faint" | "brand";
4
+ export type TextProps<E extends ElementType = "p"> = {
5
+ as?: E;
6
+ variant?: TextVariant;
7
+ color?: TextColor;
8
+ /** Line-clamp to this many lines (product titles typically need 3). */
9
+ clamp?: number;
10
+ className?: string;
11
+ } & Omit<ComponentPropsWithoutRef<E>, "as" | "color">;
12
+ /**
13
+ * Not `forwardRef` — wrapping a polymorphic (`as`-driven) component in
14
+ * `forwardRef` collapses its generic type parameter in TypeScript (`as`
15
+ * ends up typed as only its default), rejecting `as="h2"` etc. at every
16
+ * call site. Nothing here needs a forwarded ref, so staying a plain
17
+ * generic function keeps `as` correctly typed per element.
18
+ */
19
+ export declare function Text<E extends ElementType = "p">({ as, variant, color, clamp, className, style, ...rest }: TextProps<E>): import("react").JSX.Element;
@@ -0,0 +1,97 @@
1
+ /*
2
+ PMAX design tokens — values are exactly what's specified in the
3
+ Figma-derived component library plan (§3 "Foundations"). Components
4
+ reference these (or the semantic aliases below), never a raw hex/px.
5
+ Type ramp pixel values are NOT in that source (all text was outlined to
6
+ paths in the export) — the plan calls this out explicitly as the one
7
+ thing it can't give us, so the sizes below are a reasonable placeholder
8
+ ramp using the plan's own display/body/mono faces, to be replaced once
9
+ someone pulls the real numbers from the live Figma file.
10
+ */
11
+
12
+ :root {
13
+ /* Color — role-named, never hue-named, so a second brand can swap in
14
+ without touching a single component. */
15
+ --brand: #f1f62a;
16
+ --brand-tint: #fdffad;
17
+ --brand-gradient-start: #f9fe2e;
18
+ --ink: #020202;
19
+ --ink-soft: #1e1b18;
20
+
21
+ --surface: #fcfcfc;
22
+ --surface-sunk: #f7f7f7;
23
+ --surface-panel: #eeeeee;
24
+ --surface-media: #e9e9e9;
25
+
26
+ --border: #dedede;
27
+ --text-muted: #6e6e6e;
28
+ --text-faint: #a9a9a9;
29
+
30
+ /* Semantic aliases */
31
+ --price-old: var(--text-faint);
32
+ --badge-bg: var(--brand);
33
+ --focus-ring: var(--ink);
34
+ --overlay: rgba(2, 2, 2, 0.6);
35
+
36
+ /* Radius */
37
+ --r-xs: 6px;
38
+ --r-md: 12px;
39
+ --r-lg: 20px;
40
+ --r-pill: 999px;
41
+
42
+ /* Layout */
43
+ --page-w: 1920px;
44
+ --content-w: 1800px;
45
+ --page-gutter: 60px;
46
+ --tile-w: 344px;
47
+ --tile-h: 420px;
48
+ --tile-ratio: 5 / 6;
49
+
50
+ /* Space scale */
51
+ --sp-1: 4px;
52
+ --sp-2: 8px;
53
+ --sp-3: 12px;
54
+ --sp-4: 16px;
55
+ --sp-5: 20px;
56
+ --sp-6: 24px;
57
+ --sp-7: 32px;
58
+ --sp-8: 40px;
59
+ --sp-9: 60px;
60
+ --sp-10: 80px;
61
+
62
+ /* Type */
63
+ --font-display: "Archivo", "Arial Narrow", system-ui, sans-serif;
64
+ --font-body: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif;
65
+ --font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, monospace;
66
+
67
+ --t-display-1-size: 56px;
68
+ --t-display-1-lh: 1.05;
69
+ --t-display-1-tracking: 0.02em;
70
+ --t-display-2-size: 36px;
71
+ --t-display-2-lh: 1.1;
72
+ --t-display-2-tracking: 0.02em;
73
+ --t-display-3-size: 24px;
74
+ --t-display-3-lh: 1.15;
75
+ --t-display-3-tracking: 0.01em;
76
+ --t-body-size: 16px;
77
+ --t-body-lh: 1.5;
78
+ --t-body-sm-size: 14px;
79
+ --t-body-sm-lh: 1.5;
80
+ --t-label-size: 12px;
81
+ --t-label-lh: 1.4;
82
+ --t-label-tracking: 0.04em;
83
+ --t-mono-size: 13px;
84
+ --t-mono-lh: 1.4;
85
+
86
+ /* Motion */
87
+ --dur-fast: 150ms;
88
+ --dur: 200ms;
89
+ --ease: cubic-bezier(0.2, 0, 0.2, 1);
90
+ }
91
+
92
+ @media (prefers-reduced-motion: reduce) {
93
+ :root {
94
+ --dur-fast: 0ms;
95
+ --dur: 0ms;
96
+ }
97
+ }
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@pmax-lt/ui-react",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "description": "PMAX design system — React components, built from the Figma-derived component library plan.",
6
+ "license": "MIT",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "sideEffects": [
11
+ "**/*.css"
12
+ ],
13
+ "files": [
14
+ "dist",
15
+ "README.md"
16
+ ],
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ },
22
+ "./styles.css": "./dist/pmax-ui-react.css",
23
+ "./tokens.css": "./dist/tokens.css"
24
+ },
25
+ "scripts": {
26
+ "build": "vite build && node ./scripts/copy-tokens.mjs",
27
+ "dev": "vite build --watch",
28
+ "typecheck": "tsc --noEmit",
29
+ "storybook": "storybook dev -p 6006",
30
+ "build-storybook": "storybook build"
31
+ },
32
+ "peerDependencies": {
33
+ "react": "^19",
34
+ "react-dom": "^19"
35
+ },
36
+ "dependencies": {
37
+ "@radix-ui/react-accordion": "^1.2.20",
38
+ "@radix-ui/react-checkbox": "^1.3.11",
39
+ "@radix-ui/react-dialog": "^1.1.23",
40
+ "@radix-ui/react-dropdown-menu": "^2.1.24",
41
+ "@radix-ui/react-slider": "^1.4.7",
42
+ "@radix-ui/react-tooltip": "^1.2.16",
43
+ "class-variance-authority": "^0.7.1",
44
+ "clsx": "^2.1.1"
45
+ },
46
+ "devDependencies": {
47
+ "@storybook/addon-a11y": "^10.6.0",
48
+ "@storybook/react-vite": "^10.6.0",
49
+ "@types/react": "^19",
50
+ "@types/react-dom": "^19",
51
+ "@vitejs/plugin-react": "^6.1.1",
52
+ "storybook": "^10.6.0",
53
+ "typescript": "^5",
54
+ "vite": "^8.2.2",
55
+ "vite-plugin-dts": "^5.1.0"
56
+ }
57
+ }