Skip to content
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
19d1848
update order page
ninedev-i May 19, 2026
451ea5c
formatting
ekateluv May 28, 2026
66031ac
Merge branch 'main' into feature/order-page-v2
ekateluv May 28, 2026
df8c520
3000 callback problem
ekateluv Jun 2, 2026
3c15f17
fix api requests
ninedev-i Jun 2, 2026
b4668e5
add fio and phone fields for entity
ekateluv Jun 8, 2026
85d7044
fix img
ekateluv Jun 8, 2026
d7de48d
fix top
ekateluv Jun 8, 2026
ec5b3cf
add payment variants endpoint
ekateluv Jun 9, 2026
f792a6c
try to use cached data
ekateluv Jun 10, 2026
bd4bbea
dadata works
ekateluv Jun 11, 2026
3018bdc
dadata on org search
ekateluv Jun 11, 2026
3353860
send recent address & orgs
ekateluv Jun 11, 2026
c44c33f
fix debounce bug
ekateluv Jun 11, 2026
5c802c5
use cached pvz
ekateluv Jun 12, 2026
f82f47b
Merge branch 'main' into ekateluv
ekateluv Jun 17, 2026
b812bcc
fix formatting
ekateluv Jun 17, 2026
e96af6e
add "disabled" input option
ekateluv Jun 17, 2026
ed94192
fix country reset
ekateluv Jun 17, 2026
8c78c45
better address error handle
ekateluv Jun 17, 2026
034df59
fix autocomplete
ekateluv Jun 17, 2026
f35eeee
add confirm button spinner
ekateluv Jun 19, 2026
aa895a3
Make order page responsive on mobile
ekateluv Jun 19, 2026
47c749c
Wrap read-only order fields to fit long values
ekateluv Jun 19, 2026
5750051
Make city/postcode row full width on desktop
ekateluv Jun 19, 2026
234ccc7
add fixies
ekateluv Jun 23, 2026
5011ab4
Fix order form English pluralization and radio group names
ekateluv Jun 24, 2026
64a85e1
Add phone extension input for CDEK countries on checkout
ekateluv Jun 26, 2026
3a0e3a3
trim unused comment
ekateluv Jun 26, 2026
e1decf1
Merge branch 'main' into ekateluv-order-page-v2
ekateluv Jun 26, 2026
ef78aa6
Use pickup map link from API instead of hardcoded one
ekateluv Jul 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,6 @@ logs
.env
.env.*
!.env.example

# AI
.claude
11 changes: 9 additions & 2 deletions assets/css/fonts.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,20 @@
@font-face {
font-family: 'Plumb';
src: url('/fonts/plumb-bo-webfont.woff2') format('woff2');
font-weight: bold;
font-weight: 700;
font-style: normal;
}

@font-face {
font-family: 'Plumb';
src: url('/fonts/plumb-me-webfont.woff2') format('woff2');
font-weight: 500;
font-style: normal;
}

@font-face {
font-family: 'Plumb';
src: url('/fonts/plumb-re-webfont.woff2') format('woff2');
font-weight: normal;
font-weight: 400;
font-style: normal;
}
3 changes: 3 additions & 0 deletions assets/icons/spinner.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
27 changes: 13 additions & 14 deletions common/constants.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
export enum ArticleType {
WithoutSubCategories,
WithSubCategories,
SubCategory,
WithoutSubCategories,
WithSubCategories,
SubCategory,
}

export enum FilterTypeKeys {
ByCategory = '0',
ByDate = '1',
ByCategory = '0',
ByDate = '1',
}

export const FilterTypeParams = {
[FilterTypeKeys.ByCategory]: 'filter_category',
[FilterTypeKeys.ByDate]: 'filter_date',
}
[FilterTypeKeys.ByCategory]: 'filter_category',
[FilterTypeKeys.ByDate]: 'filter_date',
};

export enum FilterDateKeys {
ASC = '0',
DESC = '1',
ASC = '0',
DESC = '1',
}

export const FilterDateParams = {
[FilterDateKeys.ASC]: 'filter_asc',
[FilterDateKeys.DESC]: 'filter_desc',
}

[FilterDateKeys.ASC]: 'filter_asc',
[FilterDateKeys.DESC]: 'filter_desc',
};
105 changes: 104 additions & 1 deletion common/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export interface Product {
inv_final_assembly: number;
inv_ready_to_assembly: number;
inv_scheduled: number;
},
};
options: ProductOption[];
components: ProductOption[];
use_cases: string[];
Expand All @@ -66,3 +66,106 @@ export type Video = [string, string, string, any?];
export type PhotoLink = [string, string, string?, string?];

export type LogoLink = [string, string, string];

export enum DeliveryType {
Courier = 'courier',
Pickup = 'pickup',
Point = 'point',
Taxi = 'todoor',
}

export const RUSSIA_ID = 643;

export interface AvailableDelivery {
id: string;
type: string;
daysMin: number | null;
daysMax: number | null;
title: string;
address: string | null;
price: number;
total: number;
error?: string | null;
}

export interface AvailableDeliveriesInfo{
available: AvailableDelivery[];
freeDelivery: boolean;
}

export interface CustomerData{
individual:{
fio: string;
phone: string;
additional: string;
email: string;
comment: string;
}
entity: {
inn: string;
orgName: string;
address: string;
email: string;
comment: string;
};
payerType: 'individual' | 'entity';
}

export interface RecentAddress {
city: string;
postcode: string;
address: string;
}

export interface RecentOrg {
inn: string;
orgName: string;
address: string;
}

export interface OrderInfo {
payerType: string;
payerData: CustomerData;
deliveryType: string;
deliveryData: Record<string, string>;
paymentType: string;
basketData: Record<string, number>;
countries: Record<number, string>;
cdekCountries: number[];
recentAddresses?: RecentAddress[];
recentOrgs?: RecentOrg[];
}

export interface Tariff {
calendar_max: number;
calendar_min: number;
delivery_date_range: { min: string; max: string };
delivery_mode: number;
delivery_sum: number;
period_max: number;
period_min: number;
tariff_code: number;
tariff_description: string;
tariff_name: string;
}

export interface Destination {
city_code: number;
city: string;
type: string;
postal_code: string;
country_code: string;
region: string;
have_cashless: boolean;
have_cash: boolean;
allowed_cod: boolean;
is_dressing_room: boolean;
code: string;
name: string;
address: string;
work_time: string;
location: [number, number];
weight_min: number;
weight_max: number;
dimensions: any;
}
75 changes: 64 additions & 11 deletions components/Button.vue
Original file line number Diff line number Diff line change
@@ -1,20 +1,36 @@
<script setup lang="ts">
withDefaults(defineProps<{ id?: string; label: string; size?: 'default' | 'large' }>(), {
import Spinner from 'assets/icons/spinner.svg';

withDefaults(defineProps<{
id?: string;
label: string;
type?: 'button' | 'submit';
variant: 'primary' | 'secondary';
outlined: boolean;
size?: 'default' | 'large';
isLoading?: boolean;
}>(), {
size: 'default',
variant: 'primary',
type: 'button',
isLoading: false,
});

</script>

<template>
<button
type="button"
:type="type"
class="wb-button"
:class="{
'wb-button-m': size === 'default',
'wb-button-l': size === 'large',
'wb-button-primary': variant === 'primary',
'wb-button-outlined': outlined
}"
:id="id">
{{ label }}
<Spinner v-if="isLoading" class="wb-button-spinner" />
<span :style="isLoading ? { visibility: 'hidden' } : {}">{{ label }}</span>
</button>
</template>

Expand All @@ -24,24 +40,45 @@ withDefaults(defineProps<{ id?: string; label: string; size?: 'default' | 'large
border-radius: 4px;
white-space: nowrap;
position: relative;
min-height: 33px;
min-height: 31px;
display: inline-flex;
cursor: pointer;
user-select: none;
align-items: center;
justify-content: center;
overflow: hidden;
background: var(--primary-color);
color: #fff;
border: 0;
transition: background 0.2s;
transition: background 0.3s, color 0.3s;
font-weight: bold;
outline: none;
line-height: 24px;
}

.wb-button:hover {
background: var(--primary-color-hover);
.wb-button:not(:disabled) {
cursor: pointer;
}

.wb-button:disabled {
filter: opacity(0.5);
}

.wb-button-primary {
background: var(--primary-color);
border: 1px solid var(--primary-color);
color: #fff;
}

.wb-button-primary:hover {
background: var(--primary-color-hover) !important;
color: #fff !important;
}

.wb-button-primary.wb-button-outlined {
background: transparent;
color: var(--primary-color)
}

.wb-button-primary.wb-button-outlined {
background: transparent;
color: var(--primary-color)
}

.wb-button-m {
Expand All @@ -53,4 +90,20 @@ withDefaults(defineProps<{ id?: string; label: string; size?: 'default' | 'large
padding: 12px 24px;
font-size: 18px;
}

.wb-button-spinner {
position: absolute;
width: 22px;
height: 22px;
animation: spin 1s linear infinite;
}

.wb-button-primary .wb-button-spinner {
color: #fff;
}

@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
</style>
Loading
Loading