From a57085cf64d676a7221f6c14c7ab0fe7b24c85a8 Mon Sep 17 00:00:00 2001 From: Hariom Date: Fri, 10 Nov 2023 12:28:57 +0530 Subject: [PATCH 1/6] fix: Broken embed in incognito of chrome --- packages/features/bookings/Booker/components/LargeCalendar.tsx | 1 + .../components/OverlayCalendar/OverlayCalendarContainer.tsx | 1 + .../features/bookings/Booker/components/hooks/useLocalSet.tsx | 2 ++ packages/features/bookings/components/AvailableTimes.tsx | 1 + 4 files changed, 5 insertions(+) diff --git a/packages/features/bookings/Booker/components/LargeCalendar.tsx b/packages/features/bookings/Booker/components/LargeCalendar.tsx index f71dfe113e..8efab29b06 100644 --- a/packages/features/bookings/Booker/components/LargeCalendar.tsx +++ b/packages/features/bookings/Booker/components/LargeCalendar.tsx @@ -4,6 +4,7 @@ import dayjs from "@calcom/dayjs"; import { Calendar } from "@calcom/features/calendars/weeklyview"; import type { CalendarEvent } from "@calcom/features/calendars/weeklyview/types/events"; import type { CalendarAvailableTimeslots } from "@calcom/features/calendars/weeklyview/types/state"; +import { localStorage } from "@calcom/lib/webstorage"; import { useBookerStore } from "../store"; import { useEvent, useScheduleForEvent } from "../utils/event"; diff --git a/packages/features/bookings/Booker/components/OverlayCalendar/OverlayCalendarContainer.tsx b/packages/features/bookings/Booker/components/OverlayCalendar/OverlayCalendarContainer.tsx index 1e7e479bca..23df7257e2 100644 --- a/packages/features/bookings/Booker/components/OverlayCalendar/OverlayCalendarContainer.tsx +++ b/packages/features/bookings/Booker/components/OverlayCalendar/OverlayCalendarContainer.tsx @@ -8,6 +8,7 @@ import { useIsEmbed } from "@calcom/embed-core/embed-iframe"; import { useTimePreferences } from "@calcom/features/bookings/lib"; import { classNames } from "@calcom/lib"; import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { localStorage } from "@calcom/lib/webstorage"; import { trpc } from "@calcom/trpc/react"; import { Button, Switch } from "@calcom/ui"; import { Settings } from "@calcom/ui/components/icon"; diff --git a/packages/features/bookings/Booker/components/hooks/useLocalSet.tsx b/packages/features/bookings/Booker/components/hooks/useLocalSet.tsx index 3bcc9dad14..2c19aa1599 100644 --- a/packages/features/bookings/Booker/components/hooks/useLocalSet.tsx +++ b/packages/features/bookings/Booker/components/hooks/useLocalSet.tsx @@ -1,5 +1,7 @@ import { useEffect, useState } from "react"; +import { localStorage } from "@calcom/lib/webstorage"; + export interface HasExternalId { externalId: string; } diff --git a/packages/features/bookings/components/AvailableTimes.tsx b/packages/features/bookings/components/AvailableTimes.tsx index 1daa55e284..642fc99d15 100644 --- a/packages/features/bookings/components/AvailableTimes.tsx +++ b/packages/features/bookings/components/AvailableTimes.tsx @@ -8,6 +8,7 @@ import dayjs from "@calcom/dayjs"; import type { Slots } from "@calcom/features/schedules"; import { classNames } from "@calcom/lib"; import { useLocale } from "@calcom/lib/hooks/useLocale"; +import { localStorage } from "@calcom/lib/webstorage"; import { Button, SkeletonText } from "@calcom/ui"; import { useBookerStore } from "../Booker/store"; From 412f15814e6bffabb9263cf44379c3481abf3906 Mon Sep 17 00:00:00 2001 From: Hariom Date: Fri, 10 Nov 2023 12:48:54 +0530 Subject: [PATCH 2/6] Add removeItem to webstorage --- packages/lib/webstorage.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/lib/webstorage.ts b/packages/lib/webstorage.ts index a262c190b0..c703bfda05 100644 --- a/packages/lib/webstorage.ts +++ b/packages/lib/webstorage.ts @@ -1,5 +1,5 @@ /** - * Provides a wrapper around localStorage to avoid errors in case of restricted storage access. + * Provides a wrapper around localStorage(and sessionStorage(TODO when needed)) to avoid errors in case of restricted storage access. * * TODO: In case of an embed if localStorage is not available(third party), use localStorage of parent(first party) that contains the iframe. */ @@ -25,4 +25,12 @@ export const localStorage = { return; } }, + removeItem: (key: string) => { + try { + // eslint-disable-next-line @calcom/eslint/avoid-web-storage + window.localStorage.removeItem(key); + } catch (e) { + return; + } + }, }; From 87071c4f1928b9fda50ac24856d07bf3535feb2c Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Sat, 11 Nov 2023 11:19:34 +0000 Subject: [PATCH 3/6] New Crowdin translations by Github Action --- apps/web/public/static/locales/ko/common.json | 52 +++++++++++++++++++ apps/web/public/static/locales/sr/common.json | 52 +++++++++++++++++++ apps/web/public/static/locales/sv/common.json | 52 +++++++++++++++++++ apps/web/public/static/locales/uk/common.json | 14 +++++ 4 files changed, 170 insertions(+) diff --git a/apps/web/public/static/locales/ko/common.json b/apps/web/public/static/locales/ko/common.json index 094dfba824..637de29779 100644 --- a/apps/web/public/static/locales/ko/common.json +++ b/apps/web/public/static/locales/ko/common.json @@ -268,6 +268,7 @@ "set_availability": "언제 여유가 있는지 설정하세요.", "availability_settings": "사용 가능한 설정", "continue_without_calendar": "캘린더 없이 계속하기", + "continue_with": "{{appName}}에서 계속", "connect_your_calendar": "캘린더 연결하기", "connect_your_video_app": "비디오 앱 연결", "connect_your_video_app_instructions": "해당 이벤트 타입에서 사용하기 위한 비디오 앱을 연결해주세요.", @@ -288,6 +289,8 @@ "when": "언제", "where": "어디서", "add_to_calendar": "캘린더에 추가하기", + "add_to_calendar_description": "예약 시 이벤트를 추가할 위치를 선택합니다.", + "add_events_to": "이벤트 추가:", "add_another_calendar": "다른 캘린더 추가", "other": "더 보기", "email_sign_in_subject": "{{appName}}의 로그인 링크", @@ -422,6 +425,7 @@ "booking_created": "예약 생성", "booking_rejected": "예약 거부됨", "booking_requested": "예약 요청됨", + "booking_payment_initiated": "예약 결제가 시작되었습니다", "meeting_ended": "회의 종료됨", "form_submitted": "양식 제출됨", "booking_paid": "예약 결제됨", @@ -456,6 +460,7 @@ "no_event_types_have_been_setup": "사용자가 이벤트 타입을 설정하지 않았습니다.", "edit_logo": "로고 수정하기", "upload_a_logo": "로고 업로드", + "upload_logo": "로고 업로드", "remove_logo": "로고 제거", "enable": "활성화", "code": "코드", @@ -568,6 +573,7 @@ "your_team_name": "팀 이름", "team_updated_successfully": "팀이 성공적으로 업데이트되었습니다.", "your_team_updated_successfully": "Your team has been updated successfully.", + "your_org_updated_successfully": "조직이 성공적으로 업데이트되었습니다.", "about": "대하여", "team_description": "팀 URL 페이지에 나타날 팀 소개를 해주세요.", "org_description": "귀하의 조직에 대한 몇 자 남겨주세요. 이 내용은 귀하 조직의 URL 페이지에 표시됩니다.", @@ -599,6 +605,7 @@ "hide_book_a_team_member": "팀원 예약 버튼 숨기기", "hide_book_a_team_member_description": "공개 페이지에서 팀원 예약 버튼을 숨깁니다.", "danger_zone": "위험 구역", + "account_deletion_cannot_be_undone": "주의하세요. 계정 삭제 후에는 되돌릴 수 없습니다.", "back": "뒤로 가기", "cancel": "취소", "cancel_all_remaining": "나머지 모두 취소", @@ -688,6 +695,7 @@ "people": "인원", "your_email": "이메일 주소", "change_avatar": "아바타 변경하기", + "upload_avatar": "아바타 업로드", "language": "언어", "timezone": "시간대", "first_day_of_week": "첫 번째 요일", @@ -778,6 +786,7 @@ "disable_guests": "게스트 비활성화", "disable_guests_description": "예약하는 동안 손님 추가를 비활성화하십시오.", "private_link": "비공개 링크 생성", + "enable_private_url": "비공개 URL 활성화", "private_link_label": "비공개 링크", "private_link_hint": "비공개 링크는 매 사용 시마다 다시 생성됩니다", "copy_private_link": "비공개 링크 복사", @@ -1213,6 +1222,7 @@ "organizer_name_variable": "주최자 이름", "app_upgrade_description": "이 기능을 사용하려면 Pro 계정으로 업그레이드해야 합니다.", "invalid_number": "유효하지 않은 전화 번호", + "invalid_url_error_message": "{{label}}에 대한 URL이 유효하지 않습니다. 샘플 URL: {{sampleUrl}}", "navigate": "탐색하기", "open": "열기", "close": "닫기", @@ -1276,6 +1286,7 @@ "personal_cal_url": "내 개인 {{appName}} URL", "bio_hint": "자신에 대해 몇 마디를 써보세요. 개인 URL 페이지에 보이는 내용입니다.", "user_has_no_bio": "이 사용자는 아직 사용자 정보를 추가하지 않았습니다.", + "bio": "사용자 정보", "delete_account_modal_title": "계정 삭제", "confirm_delete_account_modal": "{{appName}} 계정을 삭제하시겠습니까?", "delete_my_account": "내 계정 삭제", @@ -1286,6 +1297,7 @@ "select_calendars": "중복 예약을 방지하기 위해 충돌을 확인하려는 캘린더를 선택합니다.", "check_for_conflicts": "충돌 확인", "view_recordings": "녹음 보기", + "check_for_recordings": "기록 확인", "adding_events_to": "이벤트 추가:", "follow_system_preferences": "시스템 추적 기본 설정", "custom_brand_colors": "사용자 정의 브랜드 색상", @@ -1530,6 +1542,7 @@ "problem_registering_domain": "하위 도메인 등록에 문제가 있습니다. 다시 시도하거나 관리자에게 문의하세요.", "team_publish": "팀 게시", "number_text_notifications": "전화번호(문자 알림)", + "number_sms_notifications": "전화번호(SMS 알림)", "attendee_email_variable": "참석자 이메일", "attendee_email_info": "예약자 이메일", "kbar_search_placeholder": "명령어를 입력하거나 검색하세요...", @@ -1594,6 +1607,7 @@ "options": "선택사항", "enter_option": "선택사항 {{index}} 입력", "add_an_option": "선택사항 추가", + "location_already_exists": "이 위치는 이미 존재합니다. 새 위치를 선택하세요.", "radio": "라디오", "google_meet_warning": "Google Meet을 사용하려면 대상 캘린더를 Google Calendar로 설정해야 합니다", "individual": "개인", @@ -1613,6 +1627,7 @@ "date_overrides_mark_all_day_unavailable_other": "선택 날짜에 이용 불가로 표시", "date_overrides_add_btn": "재정의 추가", "date_overrides_update_btn": "재정의 업데이트", + "date_successfully_added": "날짜 재정의가 추가되었습니다", "event_type_duplicate_copy_text": "{{slug}}-카피", "set_as_default": "기본값으로 설정", "hide_eventtype_details": "이벤트 타입 세부정보 숨기기", @@ -1639,6 +1654,7 @@ "minimum_round_robin_hosts_count": "참석에 필요한 호스트 수", "hosts": "호스트", "upgrade_to_enable_feature": "이 기능을 사용하려면 팀을 만들어야 합니다. 팀을 만들려면 클릭하세요.", + "orgs_upgrade_to_enable_feature": "이 기능을 활성화하려면 엔터프라이즈 플랜으로 업그레이드해야 합니다.", "new_attendee": "새 참석자", "awaiting_approval": "승인 기다리는 중", "requires_google_calendar": "이 앱은 Google Calendar 연결이 필요합니다", @@ -1743,6 +1759,7 @@ "show_on_booking_page": "예약 페이지에 표시", "get_started_zapier_templates": "Zapier 템플릿 시작하기", "team_is_unpublished": "{{team}} 팀은 게시되지 않았습니다", + "org_is_unpublished_description": "이 조직 링크는 현재 사용할 수 없습니다. 조직 소유자에게 문의하거나 게시해 달라고 요청하세요.", "team_is_unpublished_description": "이 {{entity}} 링크는 현재 사용할 수 없습니다. {{entity}} 소유자에게 연락하거나 게시하라고 요청하십시오.", "team_member": "팀원", "a_routing_form": "라우팅 양식", @@ -1877,6 +1894,7 @@ "edit_invite_link": "링크 설정 편집", "invite_link_copied": "초대 링크가 복사되었습니다", "invite_link_deleted": "초대 링크가 삭제되었습니다", + "api_key_deleted": "API 키 삭제됨", "invite_link_updated": "초대 링크 설정이 저장되었습니다", "link_expires_after": "링크 만료 기한...", "one_day": "1일", @@ -2009,7 +2027,13 @@ "attendee_last_name_variable": "참석자 성", "attendee_first_name_info": "예약자 이름", "attendee_last_name_info": "예약자 성", + "your_monthly_digest": "내 월간 다이제스트", + "member_name": "구성원 이름", + "most_popular_events": "가장 인기 있는 이벤트", + "summary_of_events_for_your_team_for_the_last_30_days": "지난 30일간 {{teamName}} 팀의 인기 이벤트 요약은 다음과 같습니다", "me": "나", + "monthly_digest_email": "월간 다이제스트 이메일", + "monthly_digest_email_for_teams": "팀의 월간 다이제스트 이메일", "verify_team_tooltip": "참석자에게 메시지를 보낼 수 있도록 팀을 인증하세요", "member_removed": "구성원 제거됨", "my_availability": "내 가용성", @@ -2039,12 +2063,40 @@ "team_no_event_types": "이 팀에는 이벤트 유형이 없습니다", "seat_options_doesnt_multiple_durations": "좌석 옵션은 여러 기간을 지원하지 않습니다", "include_calendar_event": "캘린더 이벤트 포함", + "oAuth": "OAuth", "recently_added": "최근 추가됨", "no_members_found": "구성원 없음", "event_setup_length_error": "이벤트 설정: 지속 시간은 1분 이상이어야 합니다.", "availability_schedules": "사용 가능한 일정", + "unauthorized": "미승인", + "access_cal_account": "{{clientName}} 님이 귀하의 {{appName}} 계정에 액세스하려고 합니다", + "select_account_team": "계정 또는 팀 선택", + "allow_client_to": "이것으로 {{clientName}} 님이 다음 작업을 수행할 수 있습니다", + "associate_with_cal_account": "귀하를 {{clientName}} 님의 개인 정보와 연결하세요", + "see_personal_info": "공개적으로 사용 가능한 개인 정보를 포함한 개인 정보를 확인하세요", + "see_primary_email_address": "기본 이메일 주소 보기", + "connect_installed_apps": "설치된 앱에 연결", + "access_event_type": "이벤트 유형 읽기, 편집, 삭제", + "access_availability": "가용 여부 읽기, 편집, 삭제", + "access_bookings": "예약 읽기, 편집, 삭제", + "allow_client_to_do": "{{clientName}}님이 이 작업을 수행하도록 허용하시겠습니까?", + "oauth_access_information": "허용을 클릭하면 이 앱이 서비스 약관 및 개인정보 보호정책에 따라 귀하의 정보를 사용할 수 있도록 허용하게 됩니다. 액세스 권한은 {{appName}} App Store에서 삭제할 수 있습니다.", + "allow": "허용", "view_only_edit_availability_not_onboarded": "이 사용자는 온보딩을 완료하지 않았습니다. 온보딩이 완료될 때까지는 가용성을 설정할 수 없습니다.", "view_only_edit_availability": "이 사용자의 가용성을 보고 계십니다. 본인의 가용성만 편집할 수 있습니다.", + "you_can_override_calendar_in_advanced_tab": "이것은 각 이벤트 유형의 고급 설정에서 이벤트별로 재정의할 수 있습니다.", "edit_users_availability": "사용자 가용성 편집: {{username}}", + "resend_invitation": "초대장 다시 보내기", + "invitation_resent": "초대장을 다시 보냈습니다.", + "add_client": "클라이언트 추가", + "copy_client_secret_info": "비밀글을 복사한 후에는 더 이상 볼 수 없습니다", + "add_new_client": "새 클라이언트 추가", + "this_app_is_not_setup_already": "이 앱은 아직 설정되지 않았습니다", + "as_csv": "CSV 형식", + "overlay_my_calendar": "내 캘린더 오버레이", + "overlay_my_calendar_toc": "캘린더에 연결하면 당사의 개인정보 보호정책 및 이용 약관에 동의하게 됩니다. 액세스 권한은 언제든 취소할 수 있습니다.", + "view_overlay_calendar_events": "예약 충돌을 방지하려면 캘린더 이벤트를 확인하십시오.", + "lock_timezone_toggle_on_booking_page": "예약 페이지의 시간대 잠금", + "description_lock_timezone_toggle_on_booking_page": "예약 페이지에서 시간대를 잠그는 기능은 대면 이벤트에 유용합니다.", "ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ 여기에 새 문자열을 추가하세요 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" } diff --git a/apps/web/public/static/locales/sr/common.json b/apps/web/public/static/locales/sr/common.json index f73510dc5a..0689b88ab3 100644 --- a/apps/web/public/static/locales/sr/common.json +++ b/apps/web/public/static/locales/sr/common.json @@ -268,6 +268,7 @@ "set_availability": "Podesite svoju dostupnost", "availability_settings": "Podešavanja dostuposti", "continue_without_calendar": "Nastavite bez kalendara", + "continue_with": "Nastavite sa {{appName}}", "connect_your_calendar": "Povežite vaš kalendar", "connect_your_video_app": "Povežite svoje video aplikacije", "connect_your_video_app_instructions": "Povežite svoje video aplikacije da biste ih koristili u vašim tipovima događaja.", @@ -288,6 +289,8 @@ "when": "Kad", "where": "Gde", "add_to_calendar": "Dodaj u kalendar", + "add_to_calendar_description": "Izaberite gde da dodate događaje kada ste rezervisani.", + "add_events_to": "Dodajte događaje u", "add_another_calendar": "Dodaj još jedan kalendar", "other": "Drugo", "email_sign_in_subject": "Vaša veza za prijavu na {{appName}}", @@ -422,6 +425,7 @@ "booking_created": "Rezervacija Napravljena", "booking_rejected": "Rezevacija je odbijena", "booking_requested": "Zahtev za rezervaciju je poslat", + "booking_payment_initiated": "Plaćanje rezervisanja je inicirano", "meeting_ended": "Sastanak se završio", "form_submitted": "Formular poslat", "booking_paid": "Rezervacija je plaćena", @@ -456,6 +460,7 @@ "no_event_types_have_been_setup": "Ovaj korisnik još nije podesio tipove događaja.", "edit_logo": "Uredi logo", "upload_a_logo": "Prikači logo", + "upload_logo": "Otpremite logotip", "remove_logo": "Ukloni logo", "enable": "Omogući", "code": "Kod", @@ -568,6 +573,7 @@ "your_team_name": "Ime vašeg tima", "team_updated_successfully": "Tim uspešno ažuriran", "your_team_updated_successfully": "Vaš tim je uspešno ažuriran.", + "your_org_updated_successfully": "Vaša Organizacija je uspešno ažurirana.", "about": "Opis", "team_description": "Par rečenica o vašem timu. Ovo će se pojaviti na stranici URL adrese vašeg tima.", "org_description": "Nekoliko rečenica o vašoj organizaciji. Ovo će se pojaviti na url stranici vaše organizacije.", @@ -599,6 +605,7 @@ "hide_book_a_team_member": "Sakrij dugme „Rezerviši člana tima”", "hide_book_a_team_member_description": "Sakrij sa javnih strana dugme „Rezerviši člana tima”.", "danger_zone": "Opasna Zona", + "account_deletion_cannot_be_undone": "Budite pažljivi. Brisanje naloga ne može da se opozove.", "back": "Nazad", "cancel": "Otkaži", "cancel_all_remaining": "Otkaži sve preostalo", @@ -688,6 +695,7 @@ "people": "Ljudi", "your_email": "Vaša E-pošta", "change_avatar": "Promenite Avatara", + "upload_avatar": "Otpremite avatar", "language": "Jezik", "timezone": "Vremenska zona", "first_day_of_week": "Prvi dan u nedelji", @@ -778,6 +786,7 @@ "disable_guests": "Onemogući Goste", "disable_guests_description": "Onemogući dodavanje dodatnih gostiju prilikom rezervacije.", "private_link": "Generiši privatni link", + "enable_private_url": "Omogućite privatni URL", "private_link_label": "Privatni link", "private_link_hint": "Vaš privatni link će se ponovo generisati nakon svake upotrebe", "copy_private_link": "Kopiraj privatni link", @@ -1213,6 +1222,7 @@ "organizer_name_variable": "Ime organizatora", "app_upgrade_description": "Da biste koristili ovu funkciju, morate izvršiti nadogradnju na Pro nalog.", "invalid_number": "Neispravan broj telefona", + "invalid_url_error_message": "Neispravan URL za {{label}}. Primer URL-a: {{sampleUrl}}", "navigate": "Navigacija", "open": "Otvori", "close": "Zatvori", @@ -1276,6 +1286,7 @@ "personal_cal_url": "Moj lični {{appName}} URL", "bio_hint": "Par rečenica o vama. Ovo će se pojaviti na vašoj ličnoj url stranici.", "user_has_no_bio": "Ovaj korisnik još nije dodao svoju biografiju.", + "bio": "Biografija", "delete_account_modal_title": "Izbriši nalog", "confirm_delete_account_modal": "Jeste li sigurni da želite da izbrišete vaš {{appName}} nalog?", "delete_my_account": "Izbriši moj nalog", @@ -1286,6 +1297,7 @@ "select_calendars": "Izaberite kalendare koje želite da proverite da li imaju konflikta da biste sprečili dvostruka zakazivanja.", "check_for_conflicts": "Proverite konflikte", "view_recordings": "Pregledaj snimke", + "check_for_recordings": "Proverite snimke", "adding_events_to": "Dodavanje događaja u", "follow_system_preferences": "Prati sistemska podešavanja", "custom_brand_colors": "Prilagođene boje brenda", @@ -1530,6 +1542,7 @@ "problem_registering_domain": "Postoji problem sa registracijom poddomena, pokušajte ponovo ili se obratite administratoru", "team_publish": "Objavite tim", "number_text_notifications": "Broj telefona (obaveštenja putem SMS-a)", + "number_sms_notifications": "Broj telefona (obaveštenja putem SMS-a)", "attendee_email_variable": "Imejl polaznika", "attendee_email_info": "Imejl osobe koja rezerviše", "kbar_search_placeholder": "Unesite komandu ili pretražite...", @@ -1594,6 +1607,7 @@ "options": "Opcije", "enter_option": "Unesite opciju {{index}}", "add_an_option": "Dodajte opciju", + "location_already_exists": "Ova lokacija već postoji. Izaberite novu lokaciju", "radio": "Radio", "google_meet_warning": "Da biste koristili Google Meet morate da podesite Google Calendar kao odredišni kalendar", "individual": "Pojedinac", @@ -1613,6 +1627,7 @@ "date_overrides_mark_all_day_unavailable_other": "Označi kao nedostupno za sledeće datume", "date_overrides_add_btn": "Dodaj zamenu", "date_overrides_update_btn": "Ažuriraj zamenu", + "date_successfully_added": "Datum zamene je uspešno dodat", "event_type_duplicate_copy_text": "{{slug}}-kopija", "set_as_default": "Postavi kao podrazumevano", "hide_eventtype_details": "Sakrij detalje tipa događaja", @@ -1639,6 +1654,7 @@ "minimum_round_robin_hosts_count": "Broj domaćina potrebnih da učestvuju", "hosts": "Domaćini", "upgrade_to_enable_feature": "Potrebno je da kreirate tim da biste omogućili ovu funkciju. Kliknite da kreirate tim.", + "orgs_upgrade_to_enable_feature": "Morate da nadogradite na naš Enterprise plan da biste omogućili ovu funkciju.", "new_attendee": "Novi učesnik", "awaiting_approval": "Čeka na odobrenje", "requires_google_calendar": "Ova aplikacija zahteva vezu sa Google kalendarom", @@ -1743,6 +1759,7 @@ "show_on_booking_page": "Prikaži na stranici zakazivanja", "get_started_zapier_templates": "Započnite sa Zapier predlošcima", "team_is_unpublished": "Opozvano je objavljivanje tima {{team}}", + "org_is_unpublished_description": "Ovaj link Organizacije trenutno nije dostupan. Obratite se vlasniku Organizacije i zamolite ga da ga objavi.", "team_is_unpublished_description": "Ovaj link {{entity}} više nije dostupan. Obratite se vlasniku {{entity}} i zamolite ga da objavi.", "team_member": "Član tima", "a_routing_form": "Obrazac za usmeravanje", @@ -1877,6 +1894,7 @@ "edit_invite_link": "Izmeni podešavanja linka", "invite_link_copied": "Link pozivnice je kopiran", "invite_link_deleted": "Link pozivnice je izbrisan", + "api_key_deleted": "API ključ je obrisan", "invite_link_updated": "Podešavanja linka pozivnice su sačuvana", "link_expires_after": "Linkovi su podešeni da isteknu za...", "one_day": "1 dan", @@ -2009,7 +2027,13 @@ "attendee_last_name_variable": "Prezime učesnika", "attendee_first_name_info": "Ime osobe koja rezerviše", "attendee_last_name_info": "Prezime osobe koja rezerviše", + "your_monthly_digest": "Vaš mesečni presek", + "member_name": "Ime člana", + "most_popular_events": "Najpopularniji događaji", + "summary_of_events_for_your_team_for_the_last_30_days": "Evo preseka popularnih događaja za vaš tim {{teamName}} u poslednjih 30 dana", "me": "Ja", + "monthly_digest_email": "Imejl sa mesečnih presekom", + "monthly_digest_email_for_teams": "Imejl sa mesečnim presekom za timove", "verify_team_tooltip": "Verifikujte svoj tim da biste omogućili slanje poruka učesnicima", "member_removed": "Član je uklonjen", "my_availability": "Moja dostupnost", @@ -2039,12 +2063,40 @@ "team_no_event_types": "Ovaj tim nema tipove događaja", "seat_options_doesnt_multiple_durations": "Opcije za mesta ne podržavaju višestruko trajanje", "include_calendar_event": "Uključite događaj u kalendaru", + "oAuth": "OAuth", "recently_added": "Nedavno dodato", "no_members_found": "Članovi nisu pronađeni", "event_setup_length_error": "Podešavanje događaja: Trajanje mora da bude barem 1 minut.", "availability_schedules": "Raspored dostupnosti", + "unauthorized": "Neovlašćeno", + "access_cal_account": "{{clientName}} bi želeo da pristupi vašem {{appName}} nalogu", + "select_account_team": "Izaberite nalog ili tim", + "allow_client_to": "Ovo će dozvoliti {{clientName}} da", + "associate_with_cal_account": "Da vas poveže sa vašim ličnim informacijama na {{clientName}}", + "see_personal_info": "Da vidi vaše lične informacije, uključujući bilo koje privatne informacije koje ste učili javno dostupnim", + "see_primary_email_address": "Da vidi vašu primarnu imejl adresu", + "connect_installed_apps": "Da se poveže sa vašim instaliranim aplikacijiama", + "access_event_type": "Da pročita, izmeni i izbriše vaše tipove događaja", + "access_availability": "Da pročita, izmeni i izbriše vašu dostupnost", + "access_bookings": "Da pročita, izmeni i izbriše vaša zakazivanja", + "allow_client_to_do": "Da li dozvoljavate {{clientName}} da to uradi?", + "oauth_access_information": "Klikom na „Dozvoli”, dozvoljavate ovoj aplikaciji da koristi vaše informacije u skladu sa njihovim Uslovima usluge i Politikom privatnosti. Možete da uklonite pristup u {{appName}} prodavnici aplikacija.", + "allow": "Dozvoli", "view_only_edit_availability_not_onboarded": "Ovaj korisnik nije završio uvodnu obuku. Nećete moći da podesite dostupnost dok ne dovrši uvodnu obuku.", "view_only_edit_availability": "Pregledate dostupnost ovog korisnika. Možete da uredite samo svoju dostupnost.", + "you_can_override_calendar_in_advanced_tab": "Možete da promenite ovo za svaki događaj u Napredim podešavanjima u svakom tipu događaja.", "edit_users_availability": "Uredi dostupnost korisnika: {{username}}", + "resend_invitation": "Ponovo pošaljite pozivnicu", + "invitation_resent": "Pozivnica je ponovo poslata.", + "add_client": "Dodajte klijenta", + "copy_client_secret_info": "Nakon kopiranja tajne, nećete moći više da je vidite", + "add_new_client": "Dodajte novog klijenta", + "this_app_is_not_setup_already": "Ova aplikacija još uvek nije podešena", + "as_csv": "kao CSV", + "overlay_my_calendar": "Prikaži preko mog kalendara", + "overlay_my_calendar_toc": "Povezivanjem sa vašim kalendarom, prihvatate našu Politiku privatnosti i Uslove korišćenja. Možete da povučete pristup u bilo kom trenutku.", + "view_overlay_calendar_events": "Pregledajte događaje u vašem kalendaru da biste sprečili dvostruka zakazivanja.", + "lock_timezone_toggle_on_booking_page": "Zaključajte vremensku zonu na stranici za zakazivanja", + "description_lock_timezone_toggle_on_booking_page": "Za zaključavanje vremenske zone na stranici za zakazivanja, korisno za događaje licem u lice.", "ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Dodajte svoje nove stringove iznad ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" } diff --git a/apps/web/public/static/locales/sv/common.json b/apps/web/public/static/locales/sv/common.json index 910266d828..46823ec73a 100644 --- a/apps/web/public/static/locales/sv/common.json +++ b/apps/web/public/static/locales/sv/common.json @@ -268,6 +268,7 @@ "set_availability": "Ställ in din tillgänglighet", "availability_settings": "Tillgänglighetsinställningar", "continue_without_calendar": "Fortsätt utan kalender", + "continue_with": "Fortsätt med {{appName}}", "connect_your_calendar": "Anslut din kalender", "connect_your_video_app": "Anslut dina videoappar", "connect_your_video_app_instructions": "Anslut dina videoappar för att använda dem i dina händelsetyper.", @@ -288,6 +289,8 @@ "when": "När", "where": "Var", "add_to_calendar": "Lägg till i kalender", + "add_to_calendar_description": "Välj var du vill lägga till händelser när du är bokad.", + "add_events_to": "Lägg till händelser till", "add_another_calendar": "Lägg till en annan kalender", "other": "Annat", "email_sign_in_subject": "Din inloggningslänk för {{appName}}", @@ -422,6 +425,7 @@ "booking_created": "Bokning skapad", "booking_rejected": "Bokning avvisad", "booking_requested": "Bokning begärd", + "booking_payment_initiated": "Bokningsbetalning initierad", "meeting_ended": "Mötet avslutat", "form_submitted": "Formulär skickat", "booking_paid": "Bokning betald", @@ -456,6 +460,7 @@ "no_event_types_have_been_setup": "Den här användaren har inte skapat några händelsetyper ännu.", "edit_logo": "Ändra logotyp", "upload_a_logo": "Ladda upp en logotyp", + "upload_logo": "Ladda upp logotyp", "remove_logo": "Ta bort logotyp", "enable": "Aktivera", "code": "Kod", @@ -568,6 +573,7 @@ "your_team_name": "Ditt team-namn", "team_updated_successfully": "Teamet har uppdaterats", "your_team_updated_successfully": "Ditt team har uppdaterats.", + "your_org_updated_successfully": "Din organisation har uppdaterats.", "about": "Om", "team_description": "Några meningar om ditt team. Detta visas på ditt teams URL-sida.", "org_description": "Några meningar om din organisation. Detta kommer att visas på din organisations webbsida.", @@ -599,6 +605,7 @@ "hide_book_a_team_member": "Dölj knappen Boka en teammedlem", "hide_book_a_team_member_description": "Dölj knappen Boka en teammedlem från dina offentliga sidor.", "danger_zone": "Farozon", + "account_deletion_cannot_be_undone": "Var försiktig. Borttagning av konto kan inte ångras.", "back": "Tillbaka", "cancel": "Avbryt", "cancel_all_remaining": "Avbryt alla återstående", @@ -688,6 +695,7 @@ "people": "Personer", "your_email": "Din e-postadress", "change_avatar": "Ändra avatar", + "upload_avatar": "Ladda upp avatar", "language": "Språk", "timezone": "Tidszon", "first_day_of_week": "Första dagen i veckan", @@ -778,6 +786,7 @@ "disable_guests": "Inaktivera gäster", "disable_guests_description": "Inaktivera möjligheten att lägga till ytterligare gäster vid bokning.", "private_link": "Generera privat länk", + "enable_private_url": "Aktivera privat URL", "private_link_label": "Privat länk", "private_link_hint": "Din privata länk kommer att regenerera efter varje användning", "copy_private_link": "Kopiera privat länk", @@ -1213,6 +1222,7 @@ "organizer_name_variable": "Arrangörens namn", "app_upgrade_description": "För att kunna använda den här funktionen måste du uppgradera till ett Pro-konto.", "invalid_number": "Ogiltigt telefonnummer", + "invalid_url_error_message": "Ogiltig URL för {{label}}. Exempel-URL: {{sampleUrl}}", "navigate": "Navigera", "open": "Öppna", "close": "Stäng", @@ -1276,6 +1286,7 @@ "personal_cal_url": "Min personliga {{appName}}-URL", "bio_hint": "Några meningar om dig själv. Detta kommer att visas på din personliga webbsida.", "user_has_no_bio": "Den här användaren har inte lagt till en biografi ännu.", + "bio": "Bio", "delete_account_modal_title": "Radera konto", "confirm_delete_account_modal": "Är du säker på att du vill radera ditt {{appName}}-konto?", "delete_my_account": "Radera mitt konto", @@ -1286,6 +1297,7 @@ "select_calendars": "Välj vilka kalendrar du vill kontrollera för konflikter för att förhindra dubbelbokningar.", "check_for_conflicts": "Kontrollera om konflikter", "view_recordings": "Visa inspelningar", + "check_for_recordings": "Sök efter inspelningar", "adding_events_to": "Lägger till händelser till", "follow_system_preferences": "Följ systeminställningar", "custom_brand_colors": "Anpassade märkesfärger", @@ -1530,6 +1542,7 @@ "problem_registering_domain": "Ett problem inträffade när underdomänen registrerades, försök igen eller kontakta en administratör", "team_publish": "Publicera team", "number_text_notifications": "Telefonnummer (SMS-aviseringar)", + "number_sms_notifications": "Telefonnummer (SMS-aviseringar)", "attendee_email_variable": "Deltagarens e-postadress", "attendee_email_info": "Personens e-postadress för bokning", "kbar_search_placeholder": "Ange ett kommando eller sök ...", @@ -1594,6 +1607,7 @@ "options": "Alternativ", "enter_option": "Ange alternativ {{index}}", "add_an_option": "Lägg till ett alternativ", + "location_already_exists": "Platsen finns redan. Välj en ny plats", "radio": "Menyknapp", "google_meet_warning": "För att använda Google Meet måste du ställa in din målkalender till en Google Kalender", "individual": "Individ", @@ -1613,6 +1627,7 @@ "date_overrides_mark_all_day_unavailable_other": "Markera som otillgänglig på valda datum", "date_overrides_add_btn": "Lägg till åsidosättning", "date_overrides_update_btn": "Uppdatera åsidosättning", + "date_successfully_added": "Åsidosättande av datum har lagts till", "event_type_duplicate_copy_text": "{{slug}}-kopia", "set_as_default": "Ange som standard", "hide_eventtype_details": "Dölj information om händelse", @@ -1639,6 +1654,7 @@ "minimum_round_robin_hosts_count": "Antal värdar som krävs för att delta", "hosts": "Värdar", "upgrade_to_enable_feature": "Du måste skapa ett team för att aktivera den här funktionen. Klicka för att skapa ett team.", + "orgs_upgrade_to_enable_feature": "Du behöver uppgradera till vår företagsplan för att aktivera den här funktionen.", "new_attendee": "Ny deltagare", "awaiting_approval": "Väntar på godkännande", "requires_google_calendar": "Den här appen kräver en Google Kalender-anslutning", @@ -1743,6 +1759,7 @@ "show_on_booking_page": "Visa på bokningssidan", "get_started_zapier_templates": "Kom igång med Zapier-mallar", "team_is_unpublished": "{{team}} har avpublicerats", + "org_is_unpublished_description": "Den här organisationslänken är för närvarande inte tillgänglig. Kontakta organisationens ägare eller be denne att publicera den.", "team_is_unpublished_description": "Den här {{entity}}-länken är för närvarande inte tillgänglig. Kontakta ägaren till {{entity}} eller be vederbörande att publicera den.", "team_member": "Teammedlem", "a_routing_form": "Ett omdirigeringsformulär", @@ -1877,6 +1894,7 @@ "edit_invite_link": "Redigera länkinställningar", "invite_link_copied": "Inbjudningslänk kopierad", "invite_link_deleted": "Inbjudningslänk borttagen", + "api_key_deleted": "API nyckel borttagen", "invite_link_updated": "Inställningar för inbjudningslänk har sparats", "link_expires_after": "Länkarna upphör att gälla efter ...", "one_day": "1 dag", @@ -2009,7 +2027,13 @@ "attendee_last_name_variable": "Deltagarens efternamn", "attendee_first_name_info": "Förnamnet på personen som bokat", "attendee_last_name_info": "Efternamnet på personen som bokat", + "your_monthly_digest": "Din månatliga sammanfattning", + "member_name": "Medlemsnamn", + "most_popular_events": "Mest populära händelser", + "summary_of_events_for_your_team_for_the_last_30_days": "Här är din sammanfattning av populära händelser för ditt team {{teamName}} de senaste 30 dagarna", "me": "Jag", + "monthly_digest_email": "E-post med månadssammandrag", + "monthly_digest_email_for_teams": "E-post med månadssammandrag för teams", "verify_team_tooltip": "Verifiera ditt team för att aktivera att skicka meddelanden till deltagare", "member_removed": "Medlem borttagen", "my_availability": "Min tillgänglighet", @@ -2039,12 +2063,40 @@ "team_no_event_types": "Detta team har inga händelsetyper", "seat_options_doesnt_multiple_durations": "Platsalternativet stöder inte flera varaktigheter", "include_calendar_event": "Inkludera kalenderhändelse", + "oAuth": "OAuth", "recently_added": "Nyligen tillagda", "no_members_found": "Inga medlemmar hittades", "event_setup_length_error": "Konfigurering av evenemang: Längden måste vara minst 1 minut.", "availability_schedules": "Scheman för tillgänglighet", + "unauthorized": "Obehörig", + "access_cal_account": "{{clientName}} vill ha tillgång till ditt {{appName}}-konto", + "select_account_team": "Välj konto eller team", + "allow_client_to": "Detta tillåter {{clientName}} att", + "associate_with_cal_account": "Koppla dig till dina personuppgifter från {{clientName}}", + "see_personal_info": "Se dina personuppgifter, inklusive personuppgifter som du har gjort tillgängliga för allmänheten", + "see_primary_email_address": "Se din primära e-postadress", + "connect_installed_apps": "Ansluta till dina installerade appar", + "access_event_type": "Läsa, redigera, ta bort dina händelsetyper", + "access_availability": "Läsa, redigera, ta bort din tillgänglighet", + "access_bookings": "Läsa, redigera, ta bort dina bokningar", + "allow_client_to_do": "Tillåt {{clientName}} att göra detta?", + "oauth_access_information": "Genom att klicka på tillåt tillåter du denna app att använda dina uppgifter i enlighet med deras användarvillkor och integritetspolicy. Du kan ta bort åtkomst i {{appName}} App Store.", + "allow": "Tillåt", "view_only_edit_availability_not_onboarded": "Den här användaren har inte slutfört introduktionen. Du kommer inte att kunna ange deras tillgänglighet förrän de har slutfört introduktionen.", "view_only_edit_availability": "Du tittar på användarens tillgänglighet. Du kan bara redigera din egen tillgänglighet.", + "you_can_override_calendar_in_advanced_tab": "Du kan åsidosätta det här för varje enskild händelse i Avancerade inställningar för varje händelsetyp.", "edit_users_availability": "Redigera användarens tillgänglighet: {{username}}", + "resend_invitation": "Skicka inbjudan igen", + "invitation_resent": "Inbjudan skickades på nytt.", + "add_client": "Lägg till kund", + "copy_client_secret_info": "När du har kopierat hemligheten kommer du inte att kunna se den längre", + "add_new_client": "Lägg till ny kund", + "this_app_is_not_setup_already": "Den här appen har inte installerats än", + "as_csv": "som CSV", + "overlay_my_calendar": "Lägg över min kalender", + "overlay_my_calendar_toc": "Genom att ansluta till din kalender godkänner du vår sekretesspolicy och våra användarvillkor. Du kan när som helst återkalla åtkomsten.", + "view_overlay_calendar_events": "Se dina kalenderhändelser för att förhindra krockade bokningar.", + "lock_timezone_toggle_on_booking_page": "Lås tidszon på bokningssidan", + "description_lock_timezone_toggle_on_booking_page": "För att låsa tidszonen på bokningssidan, användbart för personliga händelser.", "ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" } diff --git a/apps/web/public/static/locales/uk/common.json b/apps/web/public/static/locales/uk/common.json index b6f74276d6..65c1cb29e6 100644 --- a/apps/web/public/static/locales/uk/common.json +++ b/apps/web/public/static/locales/uk/common.json @@ -2032,6 +2032,8 @@ "most_popular_events": "Найпопулярніші заходи", "summary_of_events_for_your_team_for_the_last_30_days": "Ось зведена інформація про популярні заходи для вашої команди «{{teamName}}» за останні 30 днів", "me": "Я", + "monthly_digest_email": "Ел. лист із місячним дайджестом", + "monthly_digest_email_for_teams": "Ел. лист із місячним дайджестом для команд", "verify_team_tooltip": "Верифікуйте свою команду, щоб увімкнути надсилання повідомлень відвідувачам", "member_removed": "Учасника вилучено", "my_availability": "Моя доступність", @@ -2061,12 +2063,24 @@ "team_no_event_types": "У цієї команди немає типів заходів", "seat_options_doesnt_multiple_durations": "Параметр «Місця» не підтримує декілька варіантів тривалості", "include_calendar_event": "Включити календарний захід", + "oAuth": "OAuth", "recently_added": "Нещодавно додані", "no_members_found": "Учасників не знайдено", "event_setup_length_error": "Налаштування заходу: мінімальна тривалість — 1 хвилина.", "availability_schedules": "Розклад доступності", + "unauthorized": "Неавторизовано", + "access_cal_account": "{{clientName}} хоче отримати доступ до вашого облікового запису {{appName}}", + "select_account_team": "Виберіть обліковий запис або команду", + "allow_client_to": "Це дозволить клієнту {{clientName}} робити таке:", + "allow": "Дозволити", "view_only_edit_availability_not_onboarded": "Цей користувач не завершив ознайомлення. Доки він не зробить цього, ви не зможете налаштувати доступність для нього.", "view_only_edit_availability": "Ви переглядаєте доступність цього користувача. Ви можете редагувати лише свою доступність.", "edit_users_availability": "Редагувати доступність користувача: {{username}}", + "resend_invitation": "Повторно надіслати запрошення", + "invitation_resent": "Запрошення надіслано повторно.", + "add_client": "Додати клієнта", + "add_new_client": "Додати нового клієнта", + "this_app_is_not_setup_already": "Цей застосунок ще не налаштовано", + "as_csv": "як CSV", "ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" } From 71485d1b57d14c2980d629c9ec876c43eace6ce1 Mon Sep 17 00:00:00 2001 From: DmytroHryshyn <125881252+DmytroHryshyn@users.noreply.github.com> Date: Sun, 12 Nov 2023 19:14:38 +0200 Subject: [PATCH 4/6] chore: [app dir bootstrapping 7] update middleware (#12044) --- apps/web/lib/csp.ts | 37 +++++++++++++++++++++++++------------ apps/web/middleware.ts | 16 ++++++++++++++++ 2 files changed, 41 insertions(+), 12 deletions(-) diff --git a/apps/web/lib/csp.ts b/apps/web/lib/csp.ts index 257f0d2dc7..c28a9429dd 100644 --- a/apps/web/lib/csp.ts +++ b/apps/web/lib/csp.ts @@ -1,10 +1,11 @@ import type { IncomingMessage, OutgoingMessage } from "http"; +import type { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; import { IS_PRODUCTION } from "@calcom/lib/constants"; import { WEBAPP_URL } from "@calcom/lib/constants"; -import { buildNonce } from "@lib/buildNonce"; +import { buildNonce } from "./buildNonce"; function getCspPolicy(nonce: string) { //TODO: Do we need to explicitly define it in turbo.json @@ -46,11 +47,12 @@ const isPagePathRequest = (url: URL) => { return !isNonPagePathPrefix.test(pathname) && !isFile.test(pathname); }; -export function csp(req: IncomingMessage | null, res: OutgoingMessage | null) { +export function csp(req: IncomingMessage | NextRequest | null, res: OutgoingMessage | NextResponse | null) { if (!req) { return { nonce: undefined }; } - const existingNonce = req.headers["x-nonce"]; + const existingNonce = "cache" in req ? req.headers.get("x-nonce") : req.headers["x-nonce"]; + if (existingNonce) { const existingNoneParsed = z.string().safeParse(existingNonce); return { nonce: existingNoneParsed.success ? existingNoneParsed.data : "" }; @@ -71,17 +73,28 @@ export function csp(req: IncomingMessage | null, res: OutgoingMessage | null) { } // Set x-nonce request header to be used by `getServerSideProps` or similar fns and `Document.getInitialProps` to read the nonce from // It is generated for all page requests but only used by pages that need CSP - req.headers["x-nonce"] = nonce; + + if ("cache" in req) { + req.headers.set("x-nonce", nonce); + } else { + req.headers["x-nonce"] = nonce; + } if (res) { - res.setHeader( - req.headers["x-csp-enforce"] === "true" - ? "Content-Security-Policy" - : "Content-Security-Policy-Report-Only", - getCspPolicy(nonce) - .replace(/\s{2,}/g, " ") - .trim() - ); + const enforced = + "cache" in req ? req.headers.get("x-csp-enforce") === "true" : req.headers["x-csp-enforce"] === "true"; + + const name = enforced ? "Content-Security-Policy" : "Content-Security-Policy-Report-Only"; + + const value = getCspPolicy(nonce) + .replace(/\s{2,}/g, " ") + .trim(); + + if ("body" in res) { + res.headers.set(name, value); + } else { + res.setHeader(name, value); + } } return { nonce }; diff --git a/apps/web/middleware.ts b/apps/web/middleware.ts index 8f8b8da78f..b3fc0e2a83 100644 --- a/apps/web/middleware.ts +++ b/apps/web/middleware.ts @@ -5,10 +5,14 @@ import { NextResponse } from "next/server"; import { extendEventData, nextCollectBasicSettings } from "@calcom/lib/telemetry"; +import { csp } from "@lib/csp"; + const middleware: NextMiddleware = async (req) => { const url = req.nextUrl; const requestHeaders = new Headers(req.headers); + requestHeaders.set("x-url", req.url); + if (!url.pathname.startsWith("/api")) { // // NOTE: When tRPC hits an error a 500 is returned, when this is received @@ -32,6 +36,18 @@ const middleware: NextMiddleware = async (req) => { } const res = routingForms.handle(url); + + const { nonce } = csp(req, res ?? null); + + if (!process.env.CSP_POLICY) { + req.headers.set("x-csp", "not-opted-in"); + } else if (!req.headers.get("x-csp")) { + // If x-csp not set by gSSP, then it's initialPropsOnly + req.headers.set("x-csp", "initialPropsOnly"); + } else { + req.headers.set("x-csp", nonce ?? ""); + } + if (res) { return res; } From 115ded84293c57e52b3272805d80f112f2a82689 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Sun, 12 Nov 2023 17:16:59 +0000 Subject: [PATCH 5/6] New Crowdin translations by Github Action --- apps/web/public/static/locales/ar/common.json | 52 +++++++++++++++++++ apps/web/public/static/locales/uk/common.json | 16 ++++++ 2 files changed, 68 insertions(+) diff --git a/apps/web/public/static/locales/ar/common.json b/apps/web/public/static/locales/ar/common.json index dac06274dd..11b24b5953 100644 --- a/apps/web/public/static/locales/ar/common.json +++ b/apps/web/public/static/locales/ar/common.json @@ -268,6 +268,7 @@ "set_availability": "تحديد الوقت الذي تكون فيه متاحًا", "availability_settings": "إعدادات التوافرية", "continue_without_calendar": "المتابعة من دون تقويم", + "continue_with": "الاستمرار مع {{appName}}", "connect_your_calendar": "ربط التقويم لديك", "connect_your_video_app": "اربط تطبيقات الفيديو لديك", "connect_your_video_app_instructions": "قم بتوصيل تطبيقات الفيديو لديك لاستخدامها في أنواع الأحداث الخاصة بك.", @@ -288,6 +289,8 @@ "when": "متى", "where": "أين", "add_to_calendar": "إضافة إلى التقويم", + "add_to_calendar_description": "اختر أين ستُضاف الأحداث الجديدة عندما يتم الحجز لديك.", + "add_events_to": "إضافة أحداث إلى", "add_another_calendar": "إضافة تقويم آخر", "other": "آخر", "email_sign_in_subject": "رابط تسجيل الدخول بك لـ{{appName}}", @@ -422,6 +425,7 @@ "booking_created": "تم إنشاء الحجز", "booking_rejected": "تم رفض الحجز", "booking_requested": "تم طلب الحجز", + "booking_payment_initiated": "بدء الدفع للحجز", "meeting_ended": "انتهى الاجتماع", "form_submitted": "تم إرسال النموذج", "booking_paid": "تم الدفع لقاء الحجز", @@ -456,6 +460,7 @@ "no_event_types_have_been_setup": "لم يقم هذا المستخدم بإعداد أي أنواع للحدث حتى الآن.", "edit_logo": "تعديل الشعار", "upload_a_logo": "تحميل شعار", + "upload_logo": "تحميل شعار", "remove_logo": "إزالة الشعار", "enable": "تمكين", "code": "الرمز", @@ -568,6 +573,7 @@ "your_team_name": "اسم فريقك", "team_updated_successfully": "تم تحديث الفريق بنجاح", "your_team_updated_successfully": "تم تحديث فريقك بنجاح.", + "your_org_updated_successfully": "تم تحديث منظمتك بنجاح.", "about": "حول", "team_description": "بضع جمل عن فريقك. ستظهر على صفحة رابط فريقك.", "org_description": "بضع جمل عن منظمتك. ستظهر على صفحة رابط منظمتك.", @@ -599,6 +605,7 @@ "hide_book_a_team_member": "إخفاء الزر \"حجز عضو فريق\"", "hide_book_a_team_member_description": "إخفاء الزر \"حجز عضو فريق\" من صفحاتك العامة.", "danger_zone": "منطقة خطر", + "account_deletion_cannot_be_undone": "احترس. لا يمكن التراجع عن حذف الحساب.", "back": "عودة", "cancel": "إلغاء", "cancel_all_remaining": "إلغاء كل ما تبقى", @@ -688,6 +695,7 @@ "people": "الأشخاص", "your_email": "بريدك الإلكتروني", "change_avatar": "تغيير الصورة الرمزية", + "upload_avatar": "تحميل صورة رمزية", "language": "اللغة", "timezone": "المنطقة الزمنية", "first_day_of_week": "أول يوم في الأسبوع", @@ -778,6 +786,7 @@ "disable_guests": "تعطيل خاصية الضيوف", "disable_guests_description": "قم بتعطيل إضافة مزيد من الضيوف أثناء الحجز.", "private_link": "إنشاء رابط خاص", + "enable_private_url": "تمكين عنوان URL خاص", "private_link_label": "رابط خاص", "private_link_hint": "سيتم إعادة توليد الرابط الخاص بك بعد كل استخدام", "copy_private_link": "نسخ الرابط الخاص", @@ -1213,6 +1222,7 @@ "organizer_name_variable": "اسم المنظم", "app_upgrade_description": "لاستخدام هذه الميزة، تحتاج إلى الترقية إلى حساب Pro.", "invalid_number": "رقم الهاتف غير صالح", + "invalid_url_error_message": "عنوان URL غير صالح من أجل {{label}}. عنوان URL للعينة: {{sampleUrl}}", "navigate": "تنقّل", "open": "فتح", "close": "إغلاق", @@ -1276,6 +1286,7 @@ "personal_cal_url": "عنوان {{appName}} URL الخاص بي", "bio_hint": "اكتب بضع جمل عن نفسك، والتي ستظهر على صفحة عنوان Url الشخصية لديك.", "user_has_no_bio": "لم يُضف هذا المستخدم لمحة عنه بعد.", + "bio": "سيرة ذاتية", "delete_account_modal_title": "حذف الحساب", "confirm_delete_account_modal": "هل أنت متأكد من أنك تريد حذف حساب {{appName}} الخاص بك؟", "delete_my_account": "حذف حسابي", @@ -1286,6 +1297,7 @@ "select_calendars": "حدد الرزنامات التي تريد التحقق منها بحثًا عن تضاربات لمنع الحجوزات المزدوجة.", "check_for_conflicts": "التحقق من وجود تضاربات", "view_recordings": "عرض التسجيلات", + "check_for_recordings": "تحقق من وجود تسجيلات", "adding_events_to": "إضافة أحداث إلى", "follow_system_preferences": "اتبع تفضيلات النظام", "custom_brand_colors": "ألوان العلامة التجارية المخصصة", @@ -1530,6 +1542,7 @@ "problem_registering_domain": "حدثت مشكلة في تسجيل المجال الفرعي، يُرجى المحاولة لاحقاً أو الاتصال بالمشرف", "team_publish": "نشر فريق", "number_text_notifications": "رقم الهاتف (إشعارات الرسائل النصية)", + "number_sms_notifications": "رقم الهاتف (إشعارات الرسائل النصية)", "attendee_email_variable": "اسم الحاضر", "attendee_email_info": "البريد الإلكتروني للشخص الحجز", "kbar_search_placeholder": "اكتب أمرًا أو بحثًا...", @@ -1594,6 +1607,7 @@ "options": "خيارات", "enter_option": "أدخل خيار {{index}}", "add_an_option": "إضافة خيار", + "location_already_exists": "هذا الموقع موجود بالفعل. الرجاء اختيار موقع جديد", "radio": "الراديو", "google_meet_warning": "من أجل استخدام Google Meet، يجب عليك تعيين تقويم وجهتك على تقويم Google", "individual": "فرد", @@ -1613,6 +1627,7 @@ "date_overrides_mark_all_day_unavailable_other": "وضع علامة غير متاح على التواريخ المحددة", "date_overrides_add_btn": "إضافة تجاوز", "date_overrides_update_btn": "تحديث التجاوز", + "date_successfully_added": "تم إضافة تخطّي التاريخ بنجاح", "event_type_duplicate_copy_text": "{{slug}}-نسخ", "set_as_default": "تعيين كافتراضي", "hide_eventtype_details": "إخفاء تفاصيل نوع الحدث", @@ -1639,6 +1654,7 @@ "minimum_round_robin_hosts_count": "عدد المضيفين المطلوب حضورهم", "hosts": "المضيفون", "upgrade_to_enable_feature": "تحتاج إلى إنشاء فريق لتمكين هذه الميزة. انقر لإنشاء فريق.", + "orgs_upgrade_to_enable_feature": "تحتاج إلى الترقية إلى خطة enterprise لتفعيل هذه الميزة.", "new_attendee": "حضور جديد", "awaiting_approval": "في انتظار الموافقة", "requires_google_calendar": "يتطلب هذا التطبيق اتصال تقويم Google", @@ -1743,6 +1759,7 @@ "show_on_booking_page": "إظهار في صفحة الحجز", "get_started_zapier_templates": "البدء في استخدام قوالب Zapier", "team_is_unpublished": "لم يُنشر {{team}}", + "org_is_unpublished_description": "رابط هذه المنظمة غير متاح حاليًا. يرجى الاتصال بمالك المنظمة أو طلب النشر منه.", "team_is_unpublished_description": "رابط هذا {{entity}} غير متاح حاليًا. يرجى الاتصال بمالك {{entity}} أو طلب نشره منه.", "team_member": "عضو الفريق", "a_routing_form": "نموذج توجيه", @@ -1877,6 +1894,7 @@ "edit_invite_link": "تعديل إعدادات الرابط", "invite_link_copied": "تم نسخ رابط الدعوة", "invite_link_deleted": "تم حذف رابط الدعوة", + "api_key_deleted": "تم حذف مفتاح API", "invite_link_updated": "تم حفظ إعدادات رابط الدعوة", "link_expires_after": "تم تعيين انتهاء صلاحية الروابط بعد...", "one_day": "1 يوم", @@ -2009,7 +2027,13 @@ "attendee_last_name_variable": "اسم العائلة للحاضر", "attendee_first_name_info": "الاسم الأول للشخص صاحب الحجز", "attendee_last_name_info": "اسم العائلة للشخص صاحب الحجز", + "your_monthly_digest": "موجزك الشهري", + "member_name": "اسم العضو", + "most_popular_events": "الأحداث الأكثر شعبية", + "summary_of_events_for_your_team_for_the_last_30_days": "إليك ملخصك للأحداث الشعبية لفريقك {{teamName}} خلال آخر 30 يومًا", "me": "أنا", + "monthly_digest_email": "الرسالة الإلكترونية للموجز الشهري", + "monthly_digest_email_for_teams": "رسالة إلكترونية بالموجز الشهري للفرق", "verify_team_tooltip": "تأكيد فريقك لتمكين إرسال الرسائل إلى الحاضرين", "member_removed": "تمت إزالة العضو", "my_availability": "أوقاتي المتاحة", @@ -2039,12 +2063,40 @@ "team_no_event_types": "ليس لدى هذا الفريق أنواع من الفعاليات", "seat_options_doesnt_multiple_durations": "لا يدعم خيار المقعد فترات متعددة", "include_calendar_event": "إدراج فعاليات في التقويم", + "oAuth": "OAuth", "recently_added": "تمت الإضافة مؤخراً", "no_members_found": "لم يُعثر على أعضاء", "event_setup_length_error": "إعداد الفعالية: يجب أن تكون المدة لدقيقة على الأقل.", "availability_schedules": "جدولة التوافر", + "unauthorized": "غير مصرح به", + "access_cal_account": "يرغب {{clientName}} في الوصول إلى حسابك على {{appName}}", + "select_account_team": "اختر حسابًا أو فريق", + "allow_client_to": "سيمنح هذا {{clientName}} القدرة على", + "associate_with_cal_account": "رافق نفسك بمعلوماتك الشخصية من {{clientName}}", + "see_personal_info": "شاهد معلوماتك الشخصية، بما في ذلك أي معلومات شخصية جعلتها متاحة للجمهور", + "see_primary_email_address": "طالع عنوان بريدك الإلكتروني الأساسي", + "connect_installed_apps": "قم بالارتباط بتطبيقاتك المثبتة", + "access_event_type": "اقرأ وعدّل واحذف أنواع الأحداث لديك", + "access_availability": "اقرأ وعّدل واحذف توافرك", + "access_bookings": "اقرأ وعدّل واحذف الحجوزات لديك", + "allow_client_to_do": "السماح لـ {{clientName}} بالقيام بهذا؟", + "oauth_access_information": "عبر نقرك على السماح، ستسمح لهذا التطبيق باستخدام معلوماتك وفقاً لشروط الخدمة وسياسة الخصوصية لديه. يمكنك إزالة هذا الوصول من متجر التطبيقات {{appName}}.", + "allow": "السماح", "view_only_edit_availability_not_onboarded": "لم يكمل هذا المستخدم عملية الانضمام. لن تتمكن من تعيين توافره حتى يكتمل انضمامه.", "view_only_edit_availability": "أنت تشاهد توافر هذا المستخدم. يمكنك تعديل توافرك فقط.", + "you_can_override_calendar_in_advanced_tab": "يمكنك تجاوز هذا لكل حدث على حدة في الإعدادات المتقدمة في كل نوع من أنواع الأحداث.", "edit_users_availability": "تعديل توافر المستخدم: {{username}}", + "resend_invitation": "إعادة إرسال الدعوة", + "invitation_resent": "تم إعادة إرسال الدعوة.", + "add_client": "إضافة عميل", + "copy_client_secret_info": "لن تتمكن من مطالعة السر بعد نسخه بعد الآن", + "add_new_client": "إضافة عميل جديد", + "this_app_is_not_setup_already": "لم يتم إعداد هذا التطبيق بعد", + "as_csv": "كـ CSV", + "overlay_my_calendar": "تركيب تقويمي", + "overlay_my_calendar_toc": "من خلال الارتباط بتقويمك، أنت تقبل سياسة الخصوصية وشروط الاستخدام. يمكنك إلغاء الوصول في أي وقت.", + "view_overlay_calendar_events": "طالع أحداث تقويمك لمنع التضارب بين الحجوزات.", + "lock_timezone_toggle_on_booking_page": "قفل المنطقة الزمنية في صفحة الحجز", + "description_lock_timezone_toggle_on_booking_page": "تقفل المنطقة الزمنية على صفحة الحجز، وهذا مفيد للأحداث وجهاً لوجه.", "ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ أضف السلاسل الجديدة أعلاه هنا ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" } diff --git a/apps/web/public/static/locales/uk/common.json b/apps/web/public/static/locales/uk/common.json index 65c1cb29e6..c01c0e3829 100644 --- a/apps/web/public/static/locales/uk/common.json +++ b/apps/web/public/static/locales/uk/common.json @@ -2072,15 +2072,31 @@ "access_cal_account": "{{clientName}} хоче отримати доступ до вашого облікового запису {{appName}}", "select_account_team": "Виберіть обліковий запис або команду", "allow_client_to": "Це дозволить клієнту {{clientName}} робити таке:", + "associate_with_cal_account": "Пов’язувати вас із персональною інформацією, отриманою від {{clientName}}.", + "see_personal_info": "Переглядати особисту інформацію, включно з інформацією, яку ви зробили загальнодоступною.", + "see_primary_email_address": "Встановити основну електронну адресу.", + "connect_installed_apps": "Під’єднатися до встановлених додатків.", + "access_event_type": "Читати, змінювати, видаляти типи заходів.", + "access_availability": "Читати, змінювати, видаляти інформацію про доступність.", + "access_bookings": "Читати, змінювати, видаляти ваші бронювання.", + "allow_client_to_do": "Дозволити {{clientName}} це робити?", + "oauth_access_information": "Натискаючи кнопку «Дозволити», ви дозволяєте цьому застосунку використовувати вашу інформацію відповідно до його умов використання і політики конфіденційності. Ви можете видалити доступ в магазині застосунків {{appName}}.", "allow": "Дозволити", "view_only_edit_availability_not_onboarded": "Цей користувач не завершив ознайомлення. Доки він не зробить цього, ви не зможете налаштувати доступність для нього.", "view_only_edit_availability": "Ви переглядаєте доступність цього користувача. Ви можете редагувати лише свою доступність.", + "you_can_override_calendar_in_advanced_tab": "Ви можете перевизначити це для кожного заходу в додаткових параметрах кожного типу заходу.", "edit_users_availability": "Редагувати доступність користувача: {{username}}", "resend_invitation": "Повторно надіслати запрошення", "invitation_resent": "Запрошення надіслано повторно.", "add_client": "Додати клієнта", + "copy_client_secret_info": "Скопіювавши секрет, ви більше не зможете його переглянути", "add_new_client": "Додати нового клієнта", "this_app_is_not_setup_already": "Цей застосунок ще не налаштовано", "as_csv": "як CSV", + "overlay_my_calendar": "Накласти мій календар", + "overlay_my_calendar_toc": "Під’єднуючи свій календар, ви приймаєте нашу політику конфіденційності й правила використання. Ви можете відкликати доступ будь-коли.", + "view_overlay_calendar_events": "Переглядайте заходи у своєму календарі, щоб уникнути накладання бронювань.", + "lock_timezone_toggle_on_booking_page": "Заблокуйте часовий пояс на сторінці бронювання", + "description_lock_timezone_toggle_on_booking_page": "Для блокування часового поясу на сторінці бронювання (корисне для окремих заходів)", "ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" } From 4db0da5da40bf27387b580b5d86b5d3509c22d51 Mon Sep 17 00:00:00 2001 From: Hichem Fantar Date: Sun, 12 Nov 2023 18:45:44 +0100 Subject: [PATCH 6/6] feat: smooth transitions to interactive elements (#11983) Co-authored-by: Peer Richelsen --- apps/web/pages/event-types/index.tsx | 2 +- packages/features/kbar/Kbar.tsx | 2 +- .../features/schedules/components/ScheduleListItem.tsx | 2 +- packages/features/shell/Shell.tsx | 8 ++++---- packages/ui/components/apps/Slider.tsx | 2 +- packages/ui/components/button/Button.tsx | 4 ++-- packages/ui/components/form/dropdown/Dropdown.tsx | 2 +- packages/ui/components/form/inputs/Input.tsx | 2 +- packages/ui/components/form/inputs/TextField.tsx | 2 +- .../ui/components/navigation/tabs/HorizontalTabItem.tsx | 2 +- .../ui/components/navigation/tabs/VerticalTabItem.tsx | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/web/pages/event-types/index.tsx b/apps/web/pages/event-types/index.tsx index 4d68795e92..468e1fde5d 100644 --- a/apps/web/pages/event-types/index.tsx +++ b/apps/web/pages/event-types/index.tsx @@ -386,7 +386,7 @@ export const EventTypeList = ({ group, groupIndex, readOnly, types }: EventTypeL type.metadata?.managedEventConfig !== undefined && type.schedulingType !== SchedulingType.MANAGED; return (
  • -
    +
    {!(firstItem && firstItem.id === type.id) && ( moveEventType(index, -1)} arrowDirection="up" /> diff --git a/packages/features/kbar/Kbar.tsx b/packages/features/kbar/Kbar.tsx index ad13715865..0477141a3c 100644 --- a/packages/features/kbar/Kbar.tsx +++ b/packages/features/kbar/Kbar.tsx @@ -273,7 +273,7 @@ export const KBarTrigger = () => { diff --git a/packages/features/schedules/components/ScheduleListItem.tsx b/packages/features/schedules/components/ScheduleListItem.tsx index 5844d57333..2af0c12d44 100644 --- a/packages/features/schedules/components/ScheduleListItem.tsx +++ b/packages/features/schedules/components/ScheduleListItem.tsx @@ -41,7 +41,7 @@ export function ScheduleListItem({ return (
  • -
    +
    setMenuOpen((menuOpen) => !menuOpen)}> ); diff --git a/packages/ui/components/button/Button.tsx b/packages/ui/components/button/Button.tsx index 95a8cbc1bb..17f0d41642 100644 --- a/packages/ui/components/button/Button.tsx +++ b/packages/ui/components/button/Button.tsx @@ -38,13 +38,13 @@ export type ButtonProps = ButtonBaseProps & ); export const buttonClasses = cva( - "whitespace-nowrap inline-flex items-center text-sm font-medium relative rounded-md transition-colors disabled:cursor-not-allowed", + "whitespace-nowrap inline-flex items-center text-sm font-medium relative rounded-md transition disabled:cursor-not-allowed", { variants: { variant: { button: "", icon: "flex justify-center", - fab: "rounded-full justify-center md:rounded-md radix-state-open:rotate-45 md:radix-state-open:rotate-0 transition-transform radix-state-open:shadown-none radix-state-open:ring-0 !shadow-none", + fab: "rounded-full justify-center md:rounded-md radix-state-open:rotate-45 md:radix-state-open:rotate-0 radix-state-open:shadown-none radix-state-open:ring-0 !shadow-none", }, color: { primary: diff --git a/packages/ui/components/form/dropdown/Dropdown.tsx b/packages/ui/components/form/dropdown/Dropdown.tsx index 50edacf4bb..fcc0e55971 100644 --- a/packages/ui/components/form/dropdown/Dropdown.tsx +++ b/packages/ui/components/form/dropdown/Dropdown.tsx @@ -137,7 +137,7 @@ export const DropdownItem = (props: DropdownItemProps) => { (function ref={ref} {...props} className={classNames( - "hover:border-emphasis border-default bg-default placeholder:text-muted text-emphasis disabled:hover:border-default disabled:bg-subtle focus:ring-brand-default mb-2 block w-full rounded-md border px-3 py-2 text-sm focus:border-neutral-300 focus:outline-none focus:ring-2 focus:ring-offset-1 disabled:cursor-not-allowed", + "hover:border-emphasis border-default bg-default placeholder:text-muted text-emphasis disabled:hover:border-default disabled:bg-subtle focus:ring-brand-default mb-2 block w-full rounded-md border px-3 py-2 text-sm transition focus:border-neutral-300 focus:outline-none focus:ring-2 focus:ring-offset-1 disabled:cursor-not-allowed", props.className )} /> diff --git a/packages/ui/components/form/inputs/TextField.tsx b/packages/ui/components/form/inputs/TextField.tsx index 93a4d6d2a0..1fc0b36f1f 100644 --- a/packages/ui/components/form/inputs/TextField.tsx +++ b/packages/ui/components/form/inputs/TextField.tsx @@ -18,7 +18,7 @@ export const Input = forwardRef(function Input( {...props} ref={ref} className={classNames( - "hover:border-emphasis dark:focus:border-emphasis border-default bg-default placeholder:text-muted text-emphasis disabled:hover:border-default disabled:bg-subtle focus:ring-brand-default mb-2 block h-9 rounded-md border px-3 py-2 text-sm leading-4 focus:border-neutral-300 focus:outline-none focus:ring-2 disabled:cursor-not-allowed", + "hover:border-emphasis dark:focus:border-emphasis border-default bg-default placeholder:text-muted text-emphasis disabled:hover:border-default disabled:bg-subtle focus:ring-brand-default mb-2 block h-9 rounded-md border px-3 py-2 text-sm leading-4 transition focus:border-neutral-300 focus:outline-none focus:ring-2 disabled:cursor-not-allowed", isFullWidth && "w-full", props.className )} diff --git a/packages/ui/components/navigation/tabs/HorizontalTabItem.tsx b/packages/ui/components/navigation/tabs/HorizontalTabItem.tsx index e044d73953..18f8754c21 100644 --- a/packages/ui/components/navigation/tabs/HorizontalTabItem.tsx +++ b/packages/ui/components/navigation/tabs/HorizontalTabItem.tsx @@ -39,7 +39,7 @@ const HorizontalTabItem = function ({ scroll={linkScroll} className={classNames( isCurrent ? "bg-emphasis text-emphasis" : "hover:bg-subtle hover:text-emphasis text-default", - "inline-flex items-center justify-center whitespace-nowrap rounded-[6px] p-2 text-sm font-medium leading-4 md:mb-0", + "inline-flex items-center justify-center whitespace-nowrap rounded-[6px] p-2 text-sm font-medium leading-4 transition md:mb-0", props.disabled && "pointer-events-none !opacity-30", props.className )} diff --git a/packages/ui/components/navigation/tabs/VerticalTabItem.tsx b/packages/ui/components/navigation/tabs/VerticalTabItem.tsx index b83eca9f36..121cf08bf4 100644 --- a/packages/ui/components/navigation/tabs/VerticalTabItem.tsx +++ b/packages/ui/components/navigation/tabs/VerticalTabItem.tsx @@ -53,7 +53,7 @@ const VerticalTabItem = ({ target={props.isExternalLink ? "_blank" : "_self"} className={classNames( props.textClassNames || "text-default text-sm font-medium leading-none", - "min-h-8 hover:bg-subtle [&[aria-current='page']]:bg-emphasis [&[aria-current='page']]:text-emphasis group-hover:text-default group flex w-64 flex-row items-center rounded-md px-3 py-[10px]", + "min-h-8 hover:bg-subtle [&[aria-current='page']]:bg-emphasis [&[aria-current='page']]:text-emphasis group-hover:text-default group flex w-64 flex-row items-center rounded-md px-3 py-[10px] transition", props.disabled && "pointer-events-none !opacity-30", (isChild || !props.icon) && "ml-7 w-auto ltr:mr-5 rtl:ml-5", !info ? "h-6" : "h-14",