From bd7db6d2427388f92222349a3289d3bd2f4d854c Mon Sep 17 00:00:00 2001
From: TarcosS
Date: Mon, 13 May 2024 14:32:49 +0300
Subject: [PATCH 1/4] use Hook page Translating to Turkish
---
src/components/MDX/ExpandableCallout.tsx | 2 +-
src/content/reference/react/use.md | 136 +++++++++++------------
2 files changed, 68 insertions(+), 70 deletions(-)
diff --git a/src/components/MDX/ExpandableCallout.tsx b/src/components/MDX/ExpandableCallout.tsx
index fd15c6623..c829a6bc5 100644
--- a/src/components/MDX/ExpandableCallout.tsx
+++ b/src/components/MDX/ExpandableCallout.tsx
@@ -36,7 +36,7 @@ const variantMap = {
'linear-gradient(rgba(245, 249, 248, 0), rgba(245, 249, 248, 1)',
},
canary: {
- title: 'Canary',
+ title: 'Test Ortamı',
Icon: IconCanary,
containerClasses:
'bg-gray-5 dark:bg-gray-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg',
diff --git a/src/content/reference/react/use.md b/src/content/reference/react/use.md
index 92b3cabc0..12289d9ca 100644
--- a/src/content/reference/react/use.md
+++ b/src/content/reference/react/use.md
@@ -5,13 +5,13 @@ canary: true
-The `use` Hook is currently only available in React's Canary and experimental channels. Learn more about [React's release channels here](/community/versioning-policy#all-release-channels).
+`use` Hook şu anda sadece React'ın Test Ortamı ve deneysel kanallarında mevcuttur. React'in yayın kanalları hakkında daha fazla bilgi edinmek için [buraya göz atın](/community/versioning-policy#all-release-channels).
-`use` is a React Hook that lets you read the value of a resource like a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or [context](/learn/passing-data-deeply-with-context).
+`use`, [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) veya [context](/learn/passing-data-deeply-with-context) gibi bir kaynağın değerini okumanıza olanak sağlayan bir React Hook'tur.
```js
const value = use(resource);
@@ -23,11 +23,11 @@ const value = use(resource);
---
-## Reference {/*reference*/}
+## Referans {/*reference*/}
### `use(resource)` {/*use*/}
-Call `use` in your component to read the value of a resource like a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or [context](/learn/passing-data-deeply-with-context).
+[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) veya [context](/learn/passing-data-deeply-with-context) gibi kaynakların değerini okumak için bileşeninizde `use` Hook'unu çağırabilirsiniz.
```jsx
import { use } from 'react';
@@ -37,34 +37,33 @@ function MessageComponent({ messagePromise }) {
const theme = use(ThemeContext);
// ...
```
+Diğer React Hook'ların aksine, Döngülerin ve `if` gibi koşullu ifadeler içerisinde `use` kullanılabilir. Diğer React Hook'lar gibi, `use` kullanan fonksiyon bir Bileşen veya Hook olmalıdır.
-Unlike all other React Hooks, `use` can be called within loops and conditional statements like `if`. Like other React Hooks, the function that calls `use` must be a Component or Hook.
+Bir Pomise ile çağırıldığında; `use` Hook, [`Suspense`](/reference/react/Suspense) ve [hata sınırları](/reference/react/Component#catching-rendering-errors-with-an-error-boundary) ile entegre olur. `use`'a iletilen Promise beklenirken, `use` çağrısı yapan bileşen askıya alınır. Eğer `use` çağrısı yapan bileşen Suspense içerisine alınırsa yedek görünüm görüntülenecektir. Promise çözümlendiğinde ise; Suspense yedek görünümü, `use` Hook'u tarafından döndürülen değerleri kullanarak oluşturulan bileşenler ile yer değiştirir. Eğer `use`'a iletilen Promise reddedilir ise, en yakındaki Hata Sınırının yedek görünümü görüntülenecektir.
-When called with a Promise, the `use` Hook integrates with [`Suspense`](/reference/react/Suspense) and [error boundaries](/reference/react/Component#catching-rendering-errors-with-an-error-boundary). The component calling `use` *suspends* while the Promise passed to `use` is pending. If the component that calls `use` is wrapped in a Suspense boundary, the fallback will be displayed. Once the Promise is resolved, the Suspense fallback is replaced by the rendered components using the data returned by the `use` Hook. If the Promise passed to `use` is rejected, the fallback of the nearest Error Boundary will be displayed.
+[Aşağıda daha fazla örnek görebilirsiniz.](#usage)
-[See more examples below.](#usage)
+#### Parametreler {/*parameters*/}
-#### Parameters {/*parameters*/}
+* `resource`: Bu, bir değeri okumak istediğiniz verinin kaynağıdır. Kaynak, [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) ya da [context](/learn/passing-data-deeply-with-context) olabilir.
-* `resource`: this is the source of the data you want to read a value from. A resource can be a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or a [context](/learn/passing-data-deeply-with-context).
+#### Dönüş Değerleri {/*returns*/}
-#### Returns {/*returns*/}
+`use` Hook, [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) ya da [context](/learn/passing-data-deeply-with-context) gibi bir kaynaktan çözümlenen veriyi döndürür.
-The `use` Hook returns the value that was read from the resource like the resolved value of a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or [context](/learn/passing-data-deeply-with-context).
-
-#### Caveats {/*caveats*/}
-
-* The `use` Hook must be called inside a Component or a Hook.
-* When fetching data in a [Server Component](/reference/react/use-server), prefer `async` and `await` over `use`. `async` and `await` pick up rendering from the point where `await` was invoked, whereas `use` re-renders the component after the data is resolved.
-* Prefer creating Promises in [Server Components](/reference/react/use-server) and passing them to [Client Components](/reference/react/use-client) over creating Promises in Client Components. Promises created in Client Components are recreated on every render. Promises passed from a Server Component to a Client Component are stable across re-renders. [See this example](#streaming-data-from-server-to-client).
+#### Önemli Hususlar {/*caveats*/}
+* `use` Hook, bir bileşen veya bir hook'un içerisinde çağırılmak zorundadır..
+* Bir [Sunucu Bileşeni](/reference/react/use-server) içerisinde veri çekilirken, `use` yerine `async` ve `await` kullanmayı tercih edin. `async` ve `await`, oluşturma işlemini `await` ifadesinin çağırıldığı noktadan devam ettirirken; `use`, veri çözümlendikten sonra bileşeni yeniden oluşturur.
+* [Sunucu Bileşeni](/reference/react/use-server) içerisinde Promise oluşturup [İstemci Bileşeni](/reference/react/use-client) içerisine aktarmak yerine Promise'i [İstemci Bileşeni](/reference/react/use-client) içerisinde oluşturmayı tercih edin. İstemci Bileşeni içerisine eklenen Promise'ler her oluşturma işlemi sırasında yeniden oluşturulur. Sunucu Bileşeninden İstemci Bileşenine aktarılan Promise'ler ise yeniden oluşturma işlemleri sırasında sabit kalır. [Bu örneği inceleyin](#streaming-data-from-server-to-client).
---
-## Usage {/*usage*/}
+## Kullanım {/*usage*/}
-### Reading context with `use` {/*reading-context-with-use*/}
+### `use` ile context okumak {/*reading-context-with-use*/}
+
+`use`'a [context](/learn/passing-data-deeply-with-context) aktarıldığında, [`useContext`](/reference/react/useContext) gibi çalışacaktır. `useContext` bileşende üst seviye olarak çağırılmak zorundayken; `use` ifadesi, `if` gibi koşullu ifadelerin ve `for` gibi döngü ifadelerinin içerisinde kullanılabilir. Çok daha esnek kullanılabildiğinden dolayı `use` ifadesi, `useContext` yerine tercih edilebilir.
-When a [context](/learn/passing-data-deeply-with-context) is passed to `use`, it works similarly to [`useContext`](/reference/react/useContext). While `useContext` must be called at the top level of your component, `use` can be called inside conditionals like `if` and loops like `for`. `use` is preferred over `useContext` because it is more flexible.
```js [[2, 4, "theme"], [1, 4, "ThemeContext"]]
import { use } from 'react';
@@ -73,10 +72,9 @@ function Button() {
const theme = use(ThemeContext);
// ...
```
+`use`, içerisine aktarmış olduğunuz context'in context değerini döndürür. Context değerini belirlemek için React, bileşen ağacını arar ve ilgili context için **en yakın context sağlayıcısını** bulur.
-`use` returns the context value for the context you passed. To determine the context value, React searches the component tree and finds **the closest context provider above** for that particular context.
-
-To pass context to a `Button`, wrap it or one of its parent components into the corresponding context provider.
+Bir `Button`'a context aktarmak için, onu veya üst bileşenlerinden herhangi birini Context sağlayıcısının içerisine ekleyin.
```js [[1, 3, "ThemeContext"], [2, 3, "\\"dark\\""], [1, 5, "ThemeContext"]]
function MyPage() {
@@ -88,13 +86,12 @@ function MyPage() {
}
function Form() {
- // ... renders buttons inside ...
+ // ... içerideki button'ları yeniden oluşturur ...
}
```
+Sağlayıcı ile `Button` arasında kaç katman olduğu önemli değildir. `Form` içerisinde herhangi bir yerdeki `Button`, `use(ThemeContext)`'i çağırdığında değer olarak `"dark"` alacaktır.
-It doesn't matter how many layers of components there are between the provider and the `Button`. When a `Button` *anywhere* inside of `Form` calls `use(ThemeContext)`, it will receive `"dark"` as the value.
-
-Unlike [`useContext`](/reference/react/useContext), `use` can be called in conditionals and loops like `if`.
+[`useContext`](/reference/react/useContext) aksine; `use`, döngüler ve `if` gibi koşullu ifadeler içerisinde kullanılabilir.
```js [[1, 2, "if"], [2, 3, "use"]]
function HorizontalRule({ show }) {
@@ -106,11 +103,11 @@ function HorizontalRule({ show }) {
}
```
-`use` is called from inside a `if` statement, allowing you to conditionally read values from a Context.
+`use`, bir `if` ifadesinin içerisinde çağırılır. Bu size Context verilerini koşullu olarak okuma imkanı verir.
-Like `useContext`, `use(context)` always looks for the closest context provider *above* the component that calls it. It searches upwards and **does not** consider context providers in the component from which you're calling `use(context)`.
+`use(context)`, `useContext` gibi her zaman çağırıldığı bileşenin *üstündeki* en yakın context sağlayıcısını arar. Yukarı doğru arama yapar ve `use(context)`'i çağırdığınız bileşendeki context sağlayıcılarını dikkate almaz.
@@ -131,9 +128,9 @@ export default function MyApp() {
function Form() {
return (
-
-
-
+
+
+
);
}
@@ -212,9 +209,9 @@ function Button({ show, children }) {
-### Streaming data from the server to the client {/*streaming-data-from-server-to-client*/}
+### Sunucudan istemciye veri aktarımı {/*streaming-data-from-server-to-client*/}
-Data can be streamed from the server to the client by passing a Promise as a prop from a Server Component to a Client Component.
+Sunucudan gelen veri; Sunucu Bileşeni'nden İstemci Bileşeni'ne Promise biçiminde prop olarak aktarılır.
```js [[1, 4, "App"], [2, 2, "Message"], [3, 7, "Suspense"], [4, 8, "messagePromise", 30], [4, 5, "messagePromise"]]
import { fetchMessage } from './lib.js';
@@ -223,14 +220,14 @@ import { Message } from './message.js';
export default function App() {
const messagePromise = fetchMessage();
return (
- waiting for message...
}>
+ Mesaj bekleniyor...}>
);
}
```
-The Client Component then takes the Promise it received as a prop and passes it to the `use` Hook. This allows the Client Component to read the value from the Promise that was initially created by the Server Component.
+İstemci Bileşeni prop olarak iletilen Promise'i alır ve `use` Hook'a ileterek kullanır. Bu yöntem Sunucu Bileşeni içerisinde oluşturulan Promise'ten alınan verinin İstemci Bileşeni tarafından okunmasına olanak tanır.
```js [[2, 6, "Message"], [4, 6, "messagePromise"], [4, 7, "messagePromise"], [5, 7, "use"]]
// message.js
@@ -240,10 +237,11 @@ import { use } from 'react';
export function Message({ messagePromise }) {
const messageContent = use(messagePromise);
- return
Here is the message: {messageContent}
;
+ return
Aktarılan Mesaj: {messageContent}
;
}
```
-Because `Message` is wrapped in [`Suspense`](/reference/react/Suspense), the fallback will be displayed until the Promise is resolved. When the Promise is resolved, the value will be read by the `use` Hook and the `Message` component will replace the Suspense fallback.
+
+`Message` bir [`Suspense`](/reference/react/Suspense) içerisinde olduğu için Promise çözümleninceye kadar yedek görünüm görüntülenecektir. Promise çözümlendiğinde değer `use` Hook tarafından okunacak ve `Message` bileşeni Suspense'in yedek görünüm ile yer değiştirecektir.
@@ -254,12 +252,12 @@ import { use, Suspense } from "react";
function Message({ messagePromise }) {
const messageContent = use(messagePromise);
- return
Here is the message: {messageContent}
;
+ return
Aktarılan Mesaj: {messageContent}
;
}
export function MessageContainer({ messagePromise }) {
return (
- ⌛Downloading message...}>
+ ⌛Mesaj Yükleniyor...}>
);
@@ -285,7 +283,7 @@ export default function App() {
if (show) {
return ;
} else {
- return ;
+ return ;
}
}
```
@@ -325,16 +323,16 @@ root.render(
-When passing a Promise from a Server Component to a Client Component, its resolved value must be serializable to pass between server and client. Data types like functions aren't serializable and cannot be the resolved value of such a Promise.
+Sunucu Bileşeni'nden İstemci Bileşeni'ne Promise aktarıldığında çözümlenen değer sunucu ile istemci arasından geçmesi için serileştirilebilir olması gerekir. Fonksiyonlar gibi veri türleri serileştirilemezler ve Promise'in çözümlenen değeri olamazlar.
-#### Should I resolve a Promise in a Server or Client Component? {/*resolve-promise-in-server-or-client-component*/}
+#### Promise'i Sunucu Bileşeninde mi yoksa İstemci Bileşeninde mi çözümlemeliyim? {/*resolve-promise-in-server-or-client-component*/}
-A Promise can be passed from a Server Component to a Client Component and resolved in the Client Component with the `use` Hook. You can also resolve the Promise in a Server Component with `await` and pass the required data to the Client Component as a prop.
+Promise, Sunucu Bileşeni'nden İstemci Bileşeni'ne aktarılabilir ve İstemci Bileşeni içerisinde `use` Hook kullanarak çözümlenebilir. Yanı sıra istersen Promise'i Sunucu Bileşeni içerisinde `await` kullanarak çözümleyebilir ve gerekli veriyi İstemci Bileşeni içerisine prop olarak iletebilirsin.
```js
export default async function App() {
@@ -343,24 +341,24 @@ export default async function App() {
}
```
-But using `await` in a [Server Component](/reference/react/components#server-components) will block its rendering until the `await` statement is finished. Passing a Promise from a Server Component to a Client Component prevents the Promise from blocking the rendering of the Server Component.
+Ancak [Sunucu Bileşeni](/reference/react/components#server-components) içerisinde `await` kullanımı, `await` ifadesi tamamlanana kadar oluşturma işlemini engeller. Sunucu Bileşeni'nden İstemci Bileşeni'ne Promise geçirmek Sunucu Bileşeni içerisinde Promise kaynaklı olan oluşturma işleminin engellenmesini önler.
-### Dealing with rejected Promises {/*dealing-with-rejected-promises*/}
+### Reddedilen Promise'ler ile başa çıkmak {/*dealing-with-rejected-promises*/}
-In some cases a Promise passed to `use` could be rejected. You can handle rejected Promises by either:
+Bazen `use`'a aktarılan Promise reddedilebilir. Reddedilen Promise'leri şu şekilde yönetebilirsiniz:
-1. [Displaying an error to users with error boundary.](#displaying-an-error-to-users-with-error-boundary)
-2. [Providing an alternative value with `Promise.catch`](#providing-an-alternative-value-with-promise-catch)
+1. [Kullanıcıya hata sınırlayıcısı kullanarak hata göstermek.](#displaying-an-error-to-users-with-error-boundary)
+2. [`Promise.catch` methodunu kullanarak alternatif bir veri sunmak](#providing-an-alternative-value-with-promise-catch)
-`use` cannot be called in a try-catch block. Instead of a try-catch block [wrap your component in an Error Boundary](#displaying-an-error-to-users-with-error-boundary), or [provide an alternative value to use with the Promise's `.catch` method](#providing-an-alternative-value-with-promise-catch).
+`use`, try-catch bloğu içerisinde çağırılamaz. Try-catch bloğu yerine [bileşeni Error Boundary içerisine ekleyin](#displaying-an-error-to-users-with-error-boundary), ya da [Promise'in `.catch` methodundan yararlanarak alternatif bir değer sağlayın](#providing-an-alternative-value-with-promise-catch).
-#### Displaying an error to users with a error boundary {/*displaying-an-error-to-users-with-error-boundary*/}
+#### Kullanıcıya hata sınırlayıcısı kullanarak hata göstermek {/*displaying-an-error-to-users-with-error-boundary*/}
-If you'd like to display an error to your users when a Promise is rejected, you can use an [error boundary](/reference/react/Component#catching-rendering-errors-with-an-error-boundary). To use an error boundary, wrap the component where you are calling the `use` Hook in an error boundary. If the Promise passed to `use` is rejected the fallback for the error boundary will be displayed.
+Eğer bir Promise reddedildiğinde kullanıcılarına hata göstermek istersen [hata sınırlayıcısını](/reference/react/Component#catching-rendering-errors-with-an-error-boundary) kullanabilirsin. Bir hata sınırlayıcı kullanmak için `use` Hook'unu çağırdığınız bir bileşeni Error Boundary içerisine koyun. Eğer `use`'a iletilen Promise reddedilirse hata sınırlayıcı aracılığı ile yedek görünüm görüntülenecektir.
@@ -372,8 +370,8 @@ import { ErrorBoundary } from "react-error-boundary";
export function MessageContainer({ messagePromise }) {
return (
- ⚠️Something went wrong}>
- ⌛Downloading message...}>
+ ⚠️Bir şeyler yanlış gitti}>
+ ⌛Mesaj indiriliyor...}>
@@ -382,7 +380,7 @@ export function MessageContainer({ messagePromise }) {
function Message({ messagePromise }) {
const content = use(messagePromise);
- return
Here is the message: {content}
;
+ return
Aktarılan mesaj: {content}
;
}
```
@@ -405,7 +403,7 @@ export default function App() {
if (show) {
return ;
} else {
- return ;
+ return ;
}
}
```
@@ -419,7 +417,7 @@ import { createRoot } from 'react-dom/client';
import './styles.css';
// TODO: update this example to use
-// the Codesandbox Server Component
+// the Codesandbox Sunucu Component
// demo environment once it is created
import App from './App';
@@ -444,9 +442,9 @@ root.render(
```
-#### Providing an alternative value with `Promise.catch` {/*providing-an-alternative-value-with-promise-catch*/}
+#### `Promise.catch` methodunu kullanarak alternatif bir veri sunmak {/*providing-an-alternative-value-with-promise-catch*/}
-If you'd like to provide an alternative value when the Promise passed to `use` is rejected you can use the Promise's [`catch`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch) method.
+Eğer `use`'a aktarılan Promise reddedildiğinde yerine alternatif bir değer sağlamak istiyorsan Promise'in [`catch`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch) methodunu kullanabilirsin.
```js [[1, 6, "catch"],[2, 7, "return"]]
import { Message } from './message.js';
@@ -455,42 +453,42 @@ export default function App() {
const messagePromise = new Promise((resolve, reject) => {
reject();
}).catch(() => {
- return "no new message found.";
+ return "yeni mesaj bulunamadı.";
});
return (
- waiting for message...}>
+ Mesaj bekleniyor...}>
);
}
```
-To use the Promise's `catch` method, call `catch` on the Promise object. `catch` takes a single argument: a function that takes an error message as an argument. Whatever is returned by the function passed to `catch` will be used as the resolved value of the Promise.
+Promise'in `catch` methodunu kullanmak için Promise objesinden `catch`'i çağır. `catch` tek bir argüman alır: Bir hata mesajını argüman olarak alan bir fonksiyon. `catch`'e geçirilen fonskiyon tarafından döndürülen her şey, Promise'in çözümlenen değeri olarak kullanılacaktır.
---
-## Troubleshooting {/*troubleshooting*/}
+## Sorun Giderme {/*troubleshooting*/}
-### "Suspense Exception: This is not a real error!" {/*suspense-exception-error*/}
+### "Suspense İstisnası: Bu gerçek bir hata değil!" {/*suspense-exception-error*/}
-You are either calling `use` outside of a React component or Hook function, or calling `use` in a try–catch block. If you are calling `use` inside a try–catch block, wrap your component in an error boundary, or call the Promise's `catch` to catch the error and resolve the Promise with another value. [See these examples](#dealing-with-rejected-promises).
+`use` ya bir React Bileşeni ya da Hook fonksiyonu dışında veya try-catch bloğu içerisinde çağırılıyor. Eğer try-catch bloğu içerisinde `use` çağırıyorsanız bileşeni hata sınırlandırıcı içerisine koyun veya hata yakalamak ve alternatif değer ile çözümlemek için Promise'in `catch` methodunu çağırın. [Bu örneği inceleyin](#dealing-with-rejected-promises)
-If you are calling `use` outside a React component or Hook function, move the `use` call to a React component or Hook function.
+Eğer `use`'u bir React Bileşeni veya Hook fonksiyonu dışında çağırıyorsanız `use` çağrısını bir React Bileşeni veya Hook fonksiyonu içerisine taşıyın.
```jsx
function MessageComponent({messagePromise}) {
function download() {
- // ❌ the function calling `use` is not a Component or Hook
+ // ❌ `use`, bir Bileşen veya Hook olmayan fonksiyon tarafından çağırılıyor
const message = use(messagePromise);
// ...
```
-Instead, call `use` outside any component closures, where the function that calls `use` is a component or Hook.
+Bunun yerine, `use` fonksiyonunu herhangi bir bileşen kapanışının dışında çağırın. `use` fonksiyonunu çağıran fonksiyon bir bileşen veya Hook olmalıdır.
```jsx
function MessageComponent({messagePromise}) {
- // ✅ `use` is being called from a component.
+ // ✅ `use` bir bileşen içerisine çağırılıyor.
const message = use(messagePromise);
// ...
```
From 523867324887ae75de8a6d6a893247a46acf489e Mon Sep 17 00:00:00 2001
From: TarcosS
Date: Thu, 16 May 2024 14:01:26 +0300
Subject: [PATCH 2/4] =?UTF-8?q?Canary=20eklendi=20&&=20rebase=20yap=C4=B1l?=
=?UTF-8?q?d=C4=B1.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/components/MDX/ExpandableCallout.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/MDX/ExpandableCallout.tsx b/src/components/MDX/ExpandableCallout.tsx
index c829a6bc5..64f732260 100644
--- a/src/components/MDX/ExpandableCallout.tsx
+++ b/src/components/MDX/ExpandableCallout.tsx
@@ -36,7 +36,7 @@ const variantMap = {
'linear-gradient(rgba(245, 249, 248, 0), rgba(245, 249, 248, 1)',
},
canary: {
- title: 'Test Ortamı',
+ title: 'Test Ortamı (Canary)',
Icon: IconCanary,
containerClasses:
'bg-gray-5 dark:bg-gray-60 dark:bg-opacity-20 text-primary dark:text-primary-dark text-lg',
From c3d30d64ec755dc40ac78ebf11947393481e5c57 Mon Sep 17 00:00:00 2001
From: TarcosS
Date: Thu, 16 May 2024 14:20:16 +0300
Subject: [PATCH 3/4] Merge branch 'main' into translate-use-hook-page
---
.github/ISSUE_TEMPLATE/0-bug.yml | 34 +
.github/ISSUE_TEMPLATE/1-typo.yml | 34 +
.github/ISSUE_TEMPLATE/2-suggestion.yml | 34 +
.github/ISSUE_TEMPLATE/3-framework.yml | 116 +++
.github/ISSUE_TEMPLATE/config.yml | 7 +
.gitignore | 4 +-
CONTRIBUTING.md | 1 +
colors.js | 4 +-
package.json | 9 +-
public/android-chrome-192x192.png | Bin 0 -> 6000 bytes
public/android-chrome-384x384.png | Bin 0 -> 28930 bytes
public/android-chrome-512x512.png | Bin 0 -> 71292 bytes
public/apple-touch-icon.png | Bin 0 -> 5670 bytes
public/browserconfig.xml | 9 +
public/favicon-16x16.png | Bin 0 -> 872 bytes
public/favicon-32x32.png | Bin 0 -> 1674 bytes
public/favicon.ico | Bin 4286 -> 15086 bytes
public/favicon_old.ico | Bin 0 -> 15406 bytes
public/images/team/jack-pope.jpg | Bin 0 -> 602432 bytes
public/images/team/lauren.jpg | Bin 150227 -> 178981 bytes
public/images/team/lesiutin.jpg | Bin 0 -> 177817 bytes
public/images/uwu.png | Bin 0 -> 55079 bytes
public/mstile-150x150.png | Bin 0 -> 6156 bytes
public/safari-pinned-tab.svg | 60 ++
public/site.webmanifest | 19 +
scripts/generateRss.js | 6 +
src/components/ButtonLink.tsx | 3 +-
src/components/Icon/IconCanary.tsx | 56 +-
src/components/Layout/Footer.tsx | 24 +
src/components/Layout/HomeContent.js | 28 +-
src/components/Layout/Page.tsx | 62 +-
.../Layout/Sidebar/SidebarRouteTree.tsx | 9 +-
src/components/Layout/TopNav/TopNav.tsx | 95 +-
src/components/MDX/ConsoleBlock.tsx | 81 +-
src/components/MDX/ExpandableCallout.tsx | 6 +-
src/components/MDX/InlineCode.tsx | 3 +-
src/components/MDX/LanguagesContext.tsx | 14 +
src/components/MDX/MDXComponents.tsx | 59 +-
src/components/MDX/Sandpack/SandpackRoot.tsx | 2 +-
src/components/MDX/Sandpack/createFileMap.ts | 5 +-
src/components/MDX/SandpackWithHTMLOutput.tsx | 85 ++
src/components/MDX/TeamMember.tsx | 6 +-
src/components/Search.tsx | 1 -
src/components/Seo.tsx | 16 +-
src/components/SocialBanner.tsx | 8 +-
...a-fetching-with-react-server-components.md | 3 +
.../blog/2021/06/08/the-plan-for-react-18.md | 3 +
.../blog/2021/12/17/react-conf-2021-recap.md | 3 +
.../blog/2022/03/08/react-18-upgrade-guide.md | 3 +
src/content/blog/2022/03/29/react-v18.md | 5 +-
...-what-we-have-been-working-on-june-2022.md | 5 +-
.../blog/2023/03/16/introducing-react-dev.md | 5 +-
...what-we-have-been-working-on-march-2023.md | 3 +
src/content/blog/2023/05/03/react-canaries.md | 3 +
...t-we-have-been-working-on-february-2024.md | 120 +++
.../blog/2024/04/25/react-19-upgrade-guide.md | 658 ++++++++++++++
src/content/blog/2024/04/25/react-19.md | 782 +++++++++++++++++
src/content/blog/index.md | 18 +
src/content/community/acknowledgements.md | 1 +
src/content/community/conferences.md | 62 +-
src/content/community/docs-contributors.md | 2 +-
src/content/community/team.md | 20 +-
src/content/community/translations.md | 35 +
src/content/community/versioning-policy.md | 2 +
.../learn/manipulating-the-dom-with-refs.md | 89 +-
.../learn/passing-data-deeply-with-context.md | 5 -
.../learn/reacting-to-input-with-state.md | 1 +
src/content/learn/rendering-lists.md | 2 +
.../learn/start-a-new-react-project.md | 49 +-
.../learn/synchronizing-with-effects.md | 29 +-
src/content/learn/tutorial-tic-tac-toe.md | 2 +-
src/content/learn/typescript.md | 8 +-
.../reference/react-dom/client/createRoot.md | 818 ++++++++++++++++-
.../reference/react-dom/client/hydrateRoot.md | 827 +++++++++++++++++-
.../reference/react-dom/components/common.md | 25 +-
.../reference/react-dom/components/form.md | 20 +-
.../reference/react-dom/components/index.md | 14 +
.../reference/react-dom/components/link.md | 228 +++++
.../reference/react-dom/components/meta.md | 102 +++
.../reference/react-dom/components/script.md | 149 ++++
.../reference/react-dom/components/style.md | 106 +++
.../reference/react-dom/components/title.md | 98 +++
src/content/reference/react-dom/flushSync.md | 1 -
.../reference/react-dom/hooks/index.md | 4 +-
.../react-dom/hooks/useFormStatus.md | 57 +-
src/content/reference/react-dom/hydrate.md | 2 +-
src/content/reference/react-dom/index.md | 13 +
src/content/reference/react-dom/preconnect.md | 96 ++
.../reference/react-dom/prefetchDNS.md | 96 ++
src/content/reference/react-dom/preinit.md | 133 +++
.../reference/react-dom/preinitModule.md | 106 +++
src/content/reference/react-dom/preload.md | 171 ++++
.../reference/react-dom/preloadModule.md | 107 +++
.../react-dom/server/renderToNodeStream.md | 4 +-
.../react-dom/server/renderToStaticMarkup.md | 4 +-
.../server/renderToStaticNodeStream.md | 4 +-
.../react-dom/server/renderToString.md | 4 +-
src/content/reference/react/Profiler.md | 2 +-
src/content/reference/react/StrictMode.md | 16 +-
src/content/reference/react/Suspense.md | 6 +-
src/content/reference/react/apis.md | 18 +
src/content/reference/react/components.md | 19 +-
.../react/experimental_taintUniqueValue.md | 4 +-
src/content/reference/react/hooks.md | 19 +-
src/content/reference/react/index.md | 12 +-
.../reference/react/startTransition.md | 6 +-
.../useActionState.md} | 56 +-
.../reference/react/useDeferredValue.md | 14 +-
.../reference/react/useInsertionEffect.md | 3 +-
.../reference/react/useSyncExternalStore.md | 4 +-
src/content/reference/react/useTransition.md | 20 +-
.../reference/{react => rsc}/directives.md | 4 +-
src/content/reference/rsc/server-actions.md | 213 +++++
.../reference/rsc/server-components.md | 297 +++++++
.../reference/{react => rsc}/use-client.md | 4 +-
.../reference/{react => rsc}/use-server.md | 18 +-
.../components-and-hooks-must-be-pure.md | 364 ++++++++
src/content/reference/rules/index.md | 52 ++
.../rules/react-calls-components-and-hooks.md | 101 +++
src/content/reference/rules/rules-of-hooks.md | 135 +++
src/content/versions.md | 282 ++++++
src/content/warnings/react-dom-test-utils.md | 87 ++
src/content/warnings/react-test-renderer.md | 14 +
src/pages/[[...markdownPath]].js | 15 +-
src/pages/_document.tsx | 79 ++
src/pages/errors/[errorCode].tsx | 2 +-
src/sidebarBlog.json | 21 +
src/sidebarCommunity.json | 4 +
src/sidebarReference.json | 145 ++-
src/siteConfig.js | 1 +
src/styles/index.css | 28 +-
src/styles/sandpack.css | 9 +-
src/utils/compileMDX.ts | 14 +-
src/utils/finishedTranslations.ts | 15 +
src/utils/rss.js | 82 ++
vercel.json | 165 ++++
yarn.lock | 50 +-
137 files changed, 7966 insertions(+), 441 deletions(-)
create mode 100644 .github/ISSUE_TEMPLATE/0-bug.yml
create mode 100644 .github/ISSUE_TEMPLATE/1-typo.yml
create mode 100644 .github/ISSUE_TEMPLATE/2-suggestion.yml
create mode 100644 .github/ISSUE_TEMPLATE/3-framework.yml
create mode 100644 .github/ISSUE_TEMPLATE/config.yml
create mode 100644 public/android-chrome-192x192.png
create mode 100644 public/android-chrome-384x384.png
create mode 100644 public/android-chrome-512x512.png
create mode 100644 public/apple-touch-icon.png
create mode 100644 public/browserconfig.xml
create mode 100644 public/favicon-16x16.png
create mode 100644 public/favicon-32x32.png
create mode 100644 public/favicon_old.ico
create mode 100644 public/images/team/jack-pope.jpg
create mode 100644 public/images/team/lesiutin.jpg
create mode 100644 public/images/uwu.png
create mode 100644 public/mstile-150x150.png
create mode 100644 public/safari-pinned-tab.svg
create mode 100644 public/site.webmanifest
create mode 100644 scripts/generateRss.js
create mode 100644 src/components/MDX/LanguagesContext.tsx
create mode 100644 src/components/MDX/SandpackWithHTMLOutput.tsx
create mode 100644 src/content/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024.md
create mode 100644 src/content/blog/2024/04/25/react-19-upgrade-guide.md
create mode 100644 src/content/blog/2024/04/25/react-19.md
create mode 100644 src/content/community/translations.md
create mode 100644 src/content/reference/react-dom/components/link.md
create mode 100644 src/content/reference/react-dom/components/meta.md
create mode 100644 src/content/reference/react-dom/components/script.md
create mode 100644 src/content/reference/react-dom/components/style.md
create mode 100644 src/content/reference/react-dom/components/title.md
create mode 100644 src/content/reference/react-dom/preconnect.md
create mode 100644 src/content/reference/react-dom/prefetchDNS.md
create mode 100644 src/content/reference/react-dom/preinit.md
create mode 100644 src/content/reference/react-dom/preinitModule.md
create mode 100644 src/content/reference/react-dom/preload.md
create mode 100644 src/content/reference/react-dom/preloadModule.md
rename src/content/reference/{react-dom/hooks/useFormState.md => react/useActionState.md} (67%)
rename src/content/reference/{react => rsc}/directives.md (69%)
create mode 100644 src/content/reference/rsc/server-actions.md
create mode 100644 src/content/reference/rsc/server-components.md
rename src/content/reference/{react => rsc}/use-client.md (99%)
rename src/content/reference/{react => rsc}/use-server.md (92%)
create mode 100644 src/content/reference/rules/components-and-hooks-must-be-pure.md
create mode 100644 src/content/reference/rules/index.md
create mode 100644 src/content/reference/rules/react-calls-components-and-hooks.md
create mode 100644 src/content/reference/rules/rules-of-hooks.md
create mode 100644 src/content/versions.md
create mode 100644 src/content/warnings/react-dom-test-utils.md
create mode 100644 src/content/warnings/react-test-renderer.md
create mode 100644 src/utils/finishedTranslations.ts
create mode 100644 src/utils/rss.js
diff --git a/.github/ISSUE_TEMPLATE/0-bug.yml b/.github/ISSUE_TEMPLATE/0-bug.yml
new file mode 100644
index 000000000..56d2e8540
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/0-bug.yml
@@ -0,0 +1,34 @@
+name: "🐛 Report a bug"
+description: "Report a problem on the website."
+title: "[Bug]: "
+labels: ["bug: unconfirmed"]
+body:
+ - type: textarea
+ attributes:
+ label: Summary
+ description: |
+ A clear and concise summary of what the bug is.
+ placeholder: |
+ Example bug report:
+ When I click the "Submit" button on "Feedback", nothing happens.
+ validations:
+ required: true
+ - type: input
+ attributes:
+ label: Page
+ description: |
+ What page(s) did you encounter this bug on?
+ placeholder: |
+ https://react.dev/
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Details
+ description: |
+ Please provide any additional details about the bug.
+ placeholder: |
+ Example details:
+ The "Submit" button is unresponsive. I've tried refreshing the page and using a different browser, but the issue persists.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/1-typo.yml b/.github/ISSUE_TEMPLATE/1-typo.yml
new file mode 100644
index 000000000..c86557a11
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/1-typo.yml
@@ -0,0 +1,34 @@
+name: "🤦 Typo or mistake"
+description: "Report a typo or mistake in the docs."
+title: "[Typo]: "
+labels: ["type: typos"]
+body:
+ - type: textarea
+ attributes:
+ label: Summary
+ description: |
+ A clear and concise summary of what the mistake is.
+ placeholder: |
+ Example:
+ The code example on the "useReducer" page includes an unused variable `nextId`.
+ validations:
+ required: true
+ - type: input
+ attributes:
+ label: Page
+ description: |
+ What page is the typo on?
+ placeholder: |
+ https://react.dev/
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Details
+ description: |
+ Please provide a explanation for why this is a mistake.
+ placeholder: |
+ Example mistake:
+ In the "useReducer" section of the "API Reference" page, the code example under "Writing a reducer function" includes an unused variable `nextId` that should be removed.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/2-suggestion.yml b/.github/ISSUE_TEMPLATE/2-suggestion.yml
new file mode 100644
index 000000000..ac0b480fe
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/2-suggestion.yml
@@ -0,0 +1,34 @@
+name: "💡 Suggestions"
+description: "Suggest a new page, section, or edit for an existing page."
+title: "[Suggestion]: "
+labels: ["type: documentation"]
+body:
+ - type: textarea
+ attributes:
+ label: Summary
+ description: |
+ A clear and concise summary of what we should add.
+ placeholder: |
+ Example:
+ Add a new page for how to use React with TypeScript.
+ validations:
+ required: true
+ - type: input
+ attributes:
+ label: Page
+ description: |
+ What page is this about?
+ placeholder: |
+ https://react.dev/
+ validations:
+ required: false
+ - type: textarea
+ attributes:
+ label: Details
+ description: |
+ Please provide a explanation for what you're suggesting.
+ placeholder: |
+ Example:
+ I think it would be helpful to have a page that explains how to use React with TypeScript. This could include a basic example of a component written in TypeScript, and a link to the TypeScript documentation.
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/3-framework.yml b/.github/ISSUE_TEMPLATE/3-framework.yml
new file mode 100644
index 000000000..a47295e1e
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/3-framework.yml
@@ -0,0 +1,116 @@
+name: "📄 Suggest new framework"
+description: "I am a framework author applying to be included as a recommended framework."
+title: "[Framework]: "
+labels: ["type: framework"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ ## Apply to be included as a recommended React framework
+
+ _This form is for framework authors to apply to be included as a recommended [React framework](https://react.dev/learn/start-a-new-react-project). If you are not a framework author, please contact the authors before submitting._
+
+ Our goal when recommending a framework is to start developers with a React project that solves common problems like code splitting, data fetching, routing, and HTML generation without any extra work later. We believe this will allow users to get started quickly with React, and scale their app to production.
+
+ While we understand that many frameworks may want to be featured, this page is not a place to advertise every possible React framework or all frameworks that you can add React to. There are many great frameworks that offer support for React that are not listed in our guides. The frameworks we recommend have invested significantly in the React ecosystem, and collaborated with the React team to be compatible with our [full-stack React architecture vision](https://react.dev/learn/start-a-new-react-project#which-features-make-up-the-react-teams-full-stack-architecture-vision).
+
+ To be included, frameworks must meet the following criteria:
+
+ - **Free & open-source**: must be open source and free to use.
+ - **Well maintained**. must be actively maintained, providing bug fixes and improvements.
+ - **Active community**: must have a sufficiently large and active community to support users.
+ - **Clear onboarding**: must have clear install steps to install the React version of the framework.
+ - **Ecosystem compatibility**: must support using the full range of libraries and tools in the React ecosystem.
+ - **Self-hosting option**: must support an option to self-host applications without losing access to features.
+ - **Developer experience**. must allow developers to be productive by supporting features like Fast Refresh.
+ - **User experience**. must provide built-in support for common problems like routing and data-fetching.
+ - **Compatible with our future vision for React**. React evolves over time, and frameworks that do not align with React’s direction risk isolating their users from the main React ecosystem over time. To be included on this page we must feel confident that the framework is setting its users up for success with React over time.
+
+ Please note, we have reviewed most of the popular frameworks available today, so it is unlikely we have not considered your framework already. But if you think we missed something, please complete the application below.
+ - type: input
+ attributes:
+ label: Name
+ description: |
+ What is the name of your framework?
+ validations:
+ required: true
+ - type: input
+ attributes:
+ label: Homepage
+ description: |
+ What is the URL of your homepage?
+ validations:
+ required: true
+ - type: input
+ attributes:
+ label: Install instructions
+ description: |
+ What is the URL of your getting started guide?
+ validations:
+ required: true
+ - type: dropdown
+ attributes:
+ label: Is your framework open source?
+ description: |
+ We only recommend free and open source frameworks.
+ options:
+ - 'No'
+ - 'Yes'
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Well maintained
+ description: |
+ Please describe how your framework is actively maintained. Include recent releases, bug fixes, and improvements as examples.
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Active community
+ description: |
+ Please describe your community. Include the size of your community, and links to community resources.
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Clear onboarding
+ description: |
+ Please describe how a user can install your framework with React. Include links to any relevant documentation.
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Ecosystem compatibility
+ description: |
+ Please describe any limitations your framework has with the React ecosystem. Include any libraries or tools that are not compatible with your framework.
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Self-hosting option
+ description: |
+ Please describe how your framework supports self-hosting. Include any limitations to features when self-hosting. Also include whether you require a server to deploy your framework.
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Developer Experience
+ description: |
+ Please describe how your framework provides a great developer experience. Include any limitations to React features like React DevTools, Chrome DevTools, and Fast Refresh.
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: User Experience
+ description: |
+ Please describe how your framework helps developers create high quality user experiences by solving common use-cases. Include specifics for how your framework offers built-in support for code-splitting, routing, HTML generation, and data-fetching in a way that avoids client/server waterfalls by default. Include details on how you offer features such as SSG and SSR.
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Compatible with our future vision for React
+ description: |
+ Please describe how your framework aligns with our future vision for React. Include how your framework will evolve with React over time, and your plans to support future React features like React Server Components.
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 000000000..63e310e0b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,7 @@
+contact_links:
+ - name: 📃 Bugs in React
+ url: https://github.com/facebook/react/issues/new/choose
+ about: This issue tracker is not for bugs in React. Please file React issues here.
+ - name: 🤔 Questions and Help
+ url: https://reactjs.org/community/support.html
+ about: This issue tracker is not for support questions. Please refer to the React community's help and discussion forums.
diff --git a/.gitignore b/.gitignore
index 4278f9b22..7bf71dbc5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,5 +37,5 @@ yarn-error.log*
# external fonts
public/fonts/**/Optimistic_*.woff2
-# IDE
-.idea
\ No newline at end of file
+# rss
+public/rss.xml
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 0e861af35..4c7e5ec74 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -79,6 +79,7 @@ Ignore this rule if you're specifically describing an experimental proposal. Mak
- Use semicolons.
- No space between function names and parens (`method() {}` not `method () {}`).
- When in doubt, use the default style favored by [Prettier](https://prettier.io/playground/).
+- Always capitalize React concepts such as Hooks, Effects, and Transitions.
### Highlighting
diff --git a/colors.js b/colors.js
index acf8214ee..872f33cac 100644
--- a/colors.js
+++ b/colors.js
@@ -11,7 +11,7 @@ module.exports = {
tertiary: '#5E687E', // gray-50
'tertiary-dark': '#99A1B3', // gray-30
link: '#087EA4', // blue-50
- 'link-dark': '#149ECA', // blue-40
+ 'link-dark': '#58C4DC', // blue-40
syntax: '#EBECF0', // gray-10
wash: '#FFFFFF',
'wash-dark': '#23272F', // gray-90
@@ -23,6 +23,8 @@ module.exports = {
'border-dark': '#343A46', // gray-80
'secondary-button': '#EBECF0', // gray-10
'secondary-button-dark': '#404756', // gray-70
+ brand: '#087EA4', // blue-40
+ 'brand-dark': '#58C4DC', // blue-40
// Gray
'gray-95': '#16181D',
diff --git a/package.json b/package.json
index f75ffbb28..26bb39657 100644
--- a/package.json
+++ b/package.json
@@ -15,14 +15,15 @@
"prettier:diff": "yarn nit:source",
"lint-heading-ids": "node scripts/headingIdLinter.js",
"fix-headings": "node scripts/headingIdLinter.js --fix",
- "ci-check": "npm-run-all prettier:diff --parallel lint tsc lint-heading-ids",
+ "ci-check": "npm-run-all prettier:diff --parallel lint tsc lint-heading-ids rss",
"tsc": "tsc --noEmit",
"start": "next start",
"postinstall": "patch-package && (is-ci || husky install .husky)",
- "check-all": "npm-run-all prettier lint:fix tsc"
+ "check-all": "npm-run-all prettier lint:fix tsc rss",
+ "rss": "node scripts/generateRss.js"
},
"dependencies": {
- "@codesandbox/sandpack-react": "2.6.0",
+ "@codesandbox/sandpack-react": "2.13.5",
"@docsearch/css": "3.0.0-alpha.41",
"@docsearch/react": "3.0.0-alpha.41",
"@headlessui/react": "^1.7.0",
@@ -97,7 +98,7 @@
"webpack-bundle-analyzer": "^4.5.0"
},
"engines": {
- "node": "^16.8.0 || ^18.0.0 || ^19.0.0 || ^20.0.0"
+ "node": ">=16.8.0"
},
"nextBundleAnalysis": {
"budget": null,
diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..5de701e1348fd295d2ffe83e069f6e51fd546877
GIT binary patch
literal 6000
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
Lgj}7BN$~#wm}VLf
literal 0
HcmV?d00001
diff --git a/public/android-chrome-384x384.png b/public/android-chrome-384x384.png
new file mode 100644
index 0000000000000000000000000000000000000000..f42a6776ec98f4d31e6cca0d0bf74db7d177defa
GIT binary patch
literal 28930
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