@dxtmisha/wiki 0.57.1 → 0.57.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{defineProperty-3CuEayIP.js → defineProperty-Dcl1xgfx.js} +4 -4
- package/dist/library.js +2 -1
- package/dist/storybook.js +1 -1
- package/package.json +1 -1
- package/src/media/functional/figma/classes/FigmaPostAbstract/FigmaPostAbstract.en.mdx +46 -0
- package/src/media/functional/figma/classes/FigmaPostAbstract/FigmaPostAbstract.ru.mdx +46 -0
- package/src/media/functional/figma/classes/FigmaPostAbstract/FigmaPostAbstract.vi.mdx +46 -0
- package/src/media/functional/figma/classes/FigmaPostCode/FigmaPostCode.en.mdx +3 -23
- package/src/media/functional/figma/classes/FigmaPostCode/FigmaPostCode.ru.mdx +3 -23
- package/src/media/functional/figma/classes/FigmaPostCode/FigmaPostCode.vi.mdx +3 -23
- package/src/media/functional/figma/functions/fetchClientStorage/fetchClientStorage.en.mdx +46 -0
- package/src/media/functional/figma/functions/fetchClientStorage/fetchClientStorage.ru.mdx +46 -0
- package/src/media/functional/figma/functions/fetchClientStorage/fetchClientStorage.vi.mdx +46 -0
- package/src/media/functional/figma/functions/fetchFrameSelection/fetchFrameSelection.en.mdx +34 -0
- package/src/media/functional/figma/functions/fetchFrameSelection/fetchFrameSelection.ru.mdx +34 -0
- package/src/media/functional/figma/functions/fetchFrameSelection/fetchFrameSelection.vi.mdx +34 -0
- package/src/media/functional/figma/functions/fetchFrameStyles/fetchFrameStyles.en.mdx +49 -0
- package/src/media/functional/figma/functions/fetchFrameStyles/fetchFrameStyles.ru.mdx +49 -0
- package/src/media/functional/figma/functions/fetchFrameStyles/fetchFrameStyles.vi.mdx +49 -0
- package/src/media/functional/figma/functions/fetchFramesSelected/fetchFramesSelected.en.mdx +19 -8
- package/src/media/functional/figma/functions/fetchFramesSelected/fetchFramesSelected.ru.mdx +18 -7
- package/src/media/functional/figma/functions/fetchFramesSelected/fetchFramesSelected.vi.mdx +19 -8
- package/src/media/functional/figma/functions/fetchStorage/fetchStorage.en.mdx +42 -0
- package/src/media/functional/figma/functions/fetchStorage/fetchStorage.ru.mdx +42 -0
- package/src/media/functional/figma/functions/fetchStorage/fetchStorage.vi.mdx +42 -0
- package/src/media/functional/figma/functions/fetchTopLevelFrames/fetchTopLevelFrames.en.mdx +29 -7
- package/src/media/functional/figma/functions/fetchTopLevelFrames/fetchTopLevelFrames.ru.mdx +28 -6
- package/src/media/functional/figma/functions/fetchTopLevelFrames/fetchTopLevelFrames.vi.mdx +29 -7
- package/src/media/functional/figma/functions/sendClientStorage/sendClientStorage.en.mdx +29 -0
- package/src/media/functional/figma/functions/sendClientStorage/sendClientStorage.ru.mdx +29 -0
- package/src/media/functional/figma/functions/sendClientStorage/sendClientStorage.vi.mdx +29 -0
- package/src/media/functional/figma/functions/sendFrameSelection/sendFrameSelection.en.mdx +28 -0
- package/src/media/functional/figma/functions/sendFrameSelection/sendFrameSelection.ru.mdx +28 -0
- package/src/media/functional/figma/functions/sendFrameSelection/sendFrameSelection.vi.mdx +28 -0
- package/src/media/functional/figma/functions/sendFrameStyles/sendFrameStyles.en.mdx +40 -0
- package/src/media/functional/figma/functions/sendFrameStyles/sendFrameStyles.ru.mdx +40 -0
- package/src/media/functional/figma/functions/sendFrameStyles/sendFrameStyles.vi.mdx +40 -0
- package/src/media/functional/figma/functions/sendFramesSelected/sendFramesSelected.en.mdx +29 -0
- package/src/media/functional/figma/functions/sendFramesSelected/sendFramesSelected.ru.mdx +29 -0
- package/src/media/functional/figma/functions/sendFramesSelected/sendFramesSelected.vi.mdx +29 -0
- package/src/media/functional/figma/functions/sendStorage/sendStorage.en.mdx +30 -0
- package/src/media/functional/figma/functions/sendStorage/sendStorage.ru.mdx +30 -0
- package/src/media/functional/figma/functions/sendStorage/sendStorage.vi.mdx +30 -0
- package/src/media/functional/figma-code/classes/FigmaClientStorage/FigmaClientStorage.en.mdx +64 -0
- package/src/media/functional/figma-code/classes/FigmaClientStorage/FigmaClientStorage.ru.mdx +64 -0
- package/src/media/functional/figma-code/classes/FigmaClientStorage/FigmaClientStorage.vi.mdx +64 -0
- package/src/media/functional/figma-code/classes/FigmaFrame/FigmaFrame.en.mdx +168 -35
- package/src/media/functional/figma-code/classes/FigmaFrame/FigmaFrame.ru.mdx +168 -35
- package/src/media/functional/figma-code/classes/FigmaFrame/FigmaFrame.vi.mdx +168 -35
- package/src/media/functional/figma-code/classes/FigmaFramesSelected/FigmaFramesSelected.en.mdx +23 -69
- package/src/media/functional/figma-code/classes/FigmaFramesSelected/FigmaFramesSelected.ru.mdx +22 -68
- package/src/media/functional/figma-code/classes/FigmaFramesSelected/FigmaFramesSelected.vi.mdx +23 -69
- package/src/media/functional/figma-code/classes/FigmaItem/FigmaItem.en.mdx +79 -56
- package/src/media/functional/figma-code/classes/FigmaItem/FigmaItem.ru.mdx +79 -56
- package/src/media/functional/figma-code/classes/FigmaItem/FigmaItem.vi.mdx +79 -56
- package/src/media/functional/figma-code/classes/FigmaPluginMessenger/FigmaPluginMessenger.en.mdx +18 -48
- package/src/media/functional/figma-code/classes/FigmaPluginMessenger/FigmaPluginMessenger.ru.mdx +18 -48
- package/src/media/functional/figma-code/classes/FigmaPluginMessenger/FigmaPluginMessenger.vi.mdx +18 -48
- package/src/media/functional/figma-code/classes/FigmaStorage/FigmaStorage.en.mdx +22 -67
- package/src/media/functional/figma-code/classes/FigmaStorage/FigmaStorage.ru.mdx +22 -67
- package/src/media/functional/figma-code/classes/FigmaStorage/FigmaStorage.vi.mdx +22 -67
- package/src/media/functional/figma-code/classes/FigmaStorageData/FigmaStorageData.en.mdx +57 -0
- package/src/media/functional/figma-code/classes/FigmaStorageData/FigmaStorageData.ru.mdx +57 -0
- package/src/media/functional/figma-code/classes/FigmaStorageData/FigmaStorageData.vi.mdx +57 -0
- package/src/media/functional/figma-code/classes/FigmaTopLevelFrames/FigmaTopLevelFrames.en.mdx +24 -27
- package/src/media/functional/figma-code/classes/FigmaTopLevelFrames/FigmaTopLevelFrames.ru.mdx +23 -26
- package/src/media/functional/figma-code/classes/FigmaTopLevelFrames/FigmaTopLevelFrames.vi.mdx +24 -27
- package/src/media/functional/figma-code/functions/getFigmaFrameById/getFigmaFrameById.en.mdx +28 -0
- package/src/media/functional/figma-code/functions/getFigmaFrameById/getFigmaFrameById.ru.mdx +28 -0
- package/src/media/functional/figma-code/functions/getFigmaFrameById/getFigmaFrameById.vi.mdx +28 -0
- package/src/media/functional/figma-code/functions/getFigmaItemById/getFigmaItemById.en.mdx +43 -0
- package/src/media/functional/figma-code/functions/getFigmaItemById/getFigmaItemById.ru.mdx +43 -0
- package/src/media/functional/figma-code/functions/getFigmaItemById/getFigmaItemById.vi.mdx +43 -0
- package/src/media/functional/figma-code/functions/getFigmaItemByIdOrRoot/getFigmaItemByIdOrRoot.en.mdx +30 -0
- package/src/media/functional/figma-code/functions/getFigmaItemByIdOrRoot/getFigmaItemByIdOrRoot.ru.mdx +30 -0
- package/src/media/functional/figma-code/functions/getFigmaItemByIdOrRoot/getFigmaItemByIdOrRoot.vi.mdx +30 -0
- package/src/media/functional/figma-code/functions/makeFigmaFrameSelection/makeFigmaFrameSelection.en.mdx +21 -0
- package/src/media/functional/figma-code/functions/makeFigmaFrameSelection/makeFigmaFrameSelection.ru.mdx +21 -0
- package/src/media/functional/figma-code/functions/makeFigmaFrameSelection/makeFigmaFrameSelection.vi.mdx +21 -0
- package/src/media/functional/figma-code/functions/makeFigmaTexts/makeFigmaTexts.en.mdx +28 -0
- package/src/media/functional/figma-code/functions/makeFigmaTexts/makeFigmaTexts.ru.mdx +28 -0
- package/src/media/functional/figma-code/functions/makeFigmaTexts/makeFigmaTexts.vi.mdx +28 -0
- package/src/media/functional/figma-code/functions/setupClientStorage/setupClientStorage.en.mdx +28 -0
- package/src/media/functional/figma-code/functions/setupClientStorage/setupClientStorage.ru.mdx +28 -0
- package/src/media/functional/figma-code/functions/setupClientStorage/setupClientStorage.vi.mdx +28 -0
- package/src/media/functional/figma-code/functions/setupFrameSelection/setupFrameSelection.en.mdx +22 -0
- package/src/media/functional/figma-code/functions/setupFrameSelection/setupFrameSelection.ru.mdx +22 -0
- package/src/media/functional/figma-code/functions/setupFrameSelection/setupFrameSelection.vi.mdx +22 -0
- package/src/media/functional/figma-code/functions/setupFrameStyles/setupFrameStyles.en.mdx +19 -0
- package/src/media/functional/figma-code/functions/setupFrameStyles/setupFrameStyles.ru.mdx +19 -0
- package/src/media/functional/figma-code/functions/setupFrameStyles/setupFrameStyles.vi.mdx +19 -0
- package/src/media/functional/figma-code/functions/setupStorage/setupStorage.en.mdx +28 -0
- package/src/media/functional/figma-code/functions/setupStorage/setupStorage.ru.mdx +28 -0
- package/src/media/functional/figma-code/functions/setupStorage/setupStorage.vi.mdx +28 -0
- package/src/media/functional/figma-code/functions/toFrameSelection/toFrameSelection.en.mdx +27 -0
- package/src/media/functional/figma-code/functions/toFrameSelection/toFrameSelection.ru.mdx +27 -0
- package/src/media/functional/figma-code/functions/toFrameSelection/toFrameSelection.vi.mdx +27 -0
- package/src/media/functional/figma-ref/composables/useFigmaClientStorage/useFigmaClientStorage.en.mdx +26 -0
- package/src/media/functional/figma-ref/composables/useFigmaClientStorage/useFigmaClientStorage.ru.mdx +26 -0
- package/src/media/functional/figma-ref/composables/useFigmaClientStorage/useFigmaClientStorage.vi.mdx +26 -0
- package/src/media/functional/figma-ref/composables/useFigmaFrameSelection/useFigmaFrameSelection.en.mdx +35 -0
- package/src/media/functional/figma-ref/composables/useFigmaFrameSelection/useFigmaFrameSelection.ru.mdx +35 -0
- package/src/media/functional/figma-ref/composables/useFigmaFrameSelection/useFigmaFrameSelection.vi.mdx +35 -0
- package/src/media/functional/figma-ref/composables/useFigmaFrameStyles/useFigmaFrameStyles.en.mdx +33 -0
- package/src/media/functional/figma-ref/composables/useFigmaFrameStyles/useFigmaFrameStyles.ru.mdx +33 -0
- package/src/media/functional/figma-ref/composables/useFigmaFrameStyles/useFigmaFrameStyles.vi.mdx +33 -0
- package/src/media/functional/figma-ref/composables/useFigmaStorage/useFigmaStorage.en.mdx +28 -0
- package/src/media/functional/figma-ref/composables/useFigmaStorage/useFigmaStorage.ru.mdx +28 -0
- package/src/media/functional/figma-ref/composables/useFigmaStorage/useFigmaStorage.vi.mdx +28 -0
- package/src/media/functional/figma-ref/composables/useFigmaUiFrames/useFigmaUiFrames.en.mdx +7 -12
- package/src/media/functional/figma-ref/composables/useFigmaUiFrames/useFigmaUiFrames.ru.mdx +7 -12
- package/src/media/functional/figma-ref/composables/useFigmaUiFrames/useFigmaUiFrames.vi.mdx +8 -13
- package/src/media/functional/figma-ref/composables/useFigmaUiSelected/useFigmaUiSelected.en.mdx +12 -17
- package/src/media/functional/figma-ref/composables/useFigmaUiSelected/useFigmaUiSelected.ru.mdx +13 -18
- package/src/media/functional/figma-ref/composables/useFigmaUiSelected/useFigmaUiSelected.vi.mdx +14 -19
- package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.en.mdx +2 -3
- package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.ru.mdx +2 -3
- package/src/media/functional/functional/composables/useApiAsyncRef/useApiAsyncRef.vi.mdx +2 -3
- package/src/media/functional/functional/composables/useApiManagementRef/useApiManagementAsyncRef.en.mdx +41 -0
- package/src/media/functional/functional/composables/useApiManagementRef/useApiManagementAsyncRef.ru.mdx +41 -0
- package/src/media/functional/functional/composables/useApiManagementRef/useApiManagementAsyncRef.vi.mdx +41 -0
- package/src/media/functional/functional/composables/useApiManagementRef/useApiManagementRef.en.mdx +12 -0
- package/src/media/functional/functional/composables/useApiManagementRef/useApiManagementRef.ru.mdx +12 -0
- package/src/media/functional/functional/composables/useApiManagementRef/useApiManagementRef.vi.mdx +6 -0
- package/src/media/functional/functional/composables/useApiRef/useApiRef.en.mdx +12 -9
- package/src/media/functional/functional/composables/useApiRef/useApiRef.ru.mdx +12 -9
- package/src/media/functional/functional/composables/useApiRef/useApiRef.vi.mdx +11 -9
- package/src/media/functional/nitro-basic/functions/getInject.en.mdx +27 -0
- package/src/media/functional/nitro-basic/functions/getInject.ru.mdx +27 -0
- package/src/media/functional/nitro-basic/functions/getInject.vi.mdx +20 -0
- package/src/media/functional/ui-figma/about/about.en.mdx +52 -0
- package/src/media/functional/ui-figma/about/about.ru.mdx +52 -0
- package/src/media/functional/ui-figma/about/about.vi.mdx +52 -0
- package/src/media/functional/ui-figma/frames/frames.en.mdx +58 -0
- package/src/media/functional/ui-figma/frames/frames.ru.mdx +58 -0
- package/src/media/functional/ui-figma/frames/frames.vi.mdx +58 -0
- package/src/media/functional/ui-figma/messenger/messenger.en.mdx +67 -0
- package/src/media/functional/ui-figma/messenger/messenger.ru.mdx +67 -0
- package/src/media/functional/ui-figma/messenger/messenger.vi.mdx +67 -0
- package/src/media/functional/ui-figma/selection/selection.en.mdx +65 -0
- package/src/media/functional/ui-figma/selection/selection.ru.mdx +65 -0
- package/src/media/functional/ui-figma/selection/selection.vi.mdx +65 -0
- package/src/media/functional/ui-figma/storage/storage.en.mdx +53 -0
- package/src/media/functional/ui-figma/storage/storage.ru.mdx +53 -0
- package/src/media/functional/ui-figma/storage/storage.vi.mdx +53 -0
- package/src/media/functional/ui-figma/styles/styles.en.mdx +57 -0
- package/src/media/functional/ui-figma/styles/styles.ru.mdx +57 -0
- package/src/media/functional/ui-figma/styles/styles.vi.mdx +57 -0
- /package/src/media/functional/ui/{wiki-data.en.mdx → wiki/wiki-data.en.mdx} +0 -0
- /package/src/media/functional/ui/{wiki-data.ru.mdx → wiki/wiki-data.ru.mdx} +0 -0
- /package/src/media/functional/ui/{wiki-data.vi.mdx → wiki/wiki-data.vi.mdx} +0 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {Meta} from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/vi/functional/Composables/useApiManagementAsyncRef - Khởi tạo quản lý API bất đồng bộ'/>
|
|
4
|
+
|
|
5
|
+
# `useApiManagementAsyncRef`
|
|
6
|
+
|
|
7
|
+
`useApiManagementAsyncRef` là một wrapper bất đồng bộ cho [`useApiManagementRef`](./useApiManagementRef.vi.mdx), thực hiện khởi tạo yêu cầu ngay lập tức.
|
|
8
|
+
|
|
9
|
+
Khác với `useApiManagementRef` tiêu chuẩn, vốn khởi tạo "lười" (khi truy cập danh sách hoặc dữ liệu lần đầu), phương thức này gọi `initSsr()` ngay lập tức khi được tạo. Điều này làm cho nó trở thành lựa chọn lý tưởng để sử dụng trong môi trường SSR.
|
|
10
|
+
|
|
11
|
+
## Các tính năng chính
|
|
12
|
+
- **Khởi tạo ngay lập tức** — bắt đầu quá trình khởi tạo GET request ngay khi hook được gọi.
|
|
13
|
+
- **Hỗ trợ SSR** — đảm bảo dữ liệu được tải trên máy chủ trước khi trang được gửi đến máy khách.
|
|
14
|
+
- **Đầy đủ chức năng quản lý** — giữ lại tất cả các tính năng của `useApiManagementRef`, bao gồm formatter, tìm kiếm và mutation.
|
|
15
|
+
|
|
16
|
+
## Tham số
|
|
17
|
+
Các tham số giống hệt với [`useApiManagementRef`](./useApiManagementRef.vi.mdx):
|
|
18
|
+
|
|
19
|
+
- `propsGet: ApiManagementGet<Return, Type>` — cài đặt GET request chính.
|
|
20
|
+
- `formattersOptions?: FormattersOptions` — quy tắc định dạng.
|
|
21
|
+
- `searchOptions?: ApiManagementSearch<Item, Columns>` — cài đặt tìm kiếm.
|
|
22
|
+
- `postRequest / putRequest / deleteRequest` — cài đặt mutation.
|
|
23
|
+
- `action?: function` — callback sau mutation.
|
|
24
|
+
- `apiInstance?: ApiInstance` — instance của API.
|
|
25
|
+
|
|
26
|
+
## Giá trị trả về
|
|
27
|
+
Trả về một đối tượng quản lý API. Cấu trúc đối tượng trả về giống hệt với [`useApiManagementRef`](./useApiManagementRef.vi.mdx).
|
|
28
|
+
|
|
29
|
+
## Ví dụ
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { useApiManagementAsyncRef } from '@dxtmisha/functional'
|
|
33
|
+
|
|
34
|
+
// Khởi tạo (và chuẩn bị dữ liệu SSR) bắt đầu ngay lập tức
|
|
35
|
+
const { list, loading } = useApiManagementAsyncRef(
|
|
36
|
+
{
|
|
37
|
+
path: 'api/products',
|
|
38
|
+
skeleton: () => Array(3).fill({ id: 0, title: 'Đang tải...' })
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
```
|
package/src/media/functional/functional/composables/useApiManagementRef/useApiManagementRef.en.mdx
CHANGED
|
@@ -30,9 +30,15 @@ A powerful composable for comprehensive API request orchestration. It manages da
|
|
|
30
30
|
- `isSearch: ComputedRef<boolean>` — whether a search query is currently active.
|
|
31
31
|
- `search: Ref<string>` — reactive search string (Proxy to the provided `searchOptions.value`).
|
|
32
32
|
- `sendPost / sendPut / sendDelete: (request?: ApiFetch['request']) => Promise<any>` — methods to execute mutations.
|
|
33
|
+
- `init: () => void` — method for explicit manual initialization of request and observation.
|
|
34
|
+
- `initSsr: () => void` — method for server-side initialization (SSR).
|
|
33
35
|
- `reset: () => Promise<void>` — forces a manual restart/refresh of the main GET request.
|
|
34
36
|
- `abort: () => void` — aborts the ongoing network request.
|
|
35
37
|
|
|
38
|
+
## Async Version
|
|
39
|
+
|
|
40
|
+
For cases where immediate (non-lazy) initialization is required (e.g., for SSR), use [**`useApiManagementAsyncRef`**](./useApiManagementAsyncRef.en.mdx). It automatically calls `initSsr()` upon creation.
|
|
41
|
+
|
|
36
42
|
## Generic Constraints
|
|
37
43
|
|
|
38
44
|
- `Return extends ApiManagementValue` — logic model for data returned by the API.
|
|
@@ -61,6 +67,12 @@ A powerful composable for comprehensive API request orchestration. It manages da
|
|
|
61
67
|
- This triggers a data reload and updates the entire list. Thus, after deleting a row or adding a new one, your list always remains up to date without writing extra code.
|
|
62
68
|
6. **Parameter Reactivity**: If the `path` or `options` (in `propsGet`) are reactive (Vue Ref) and you set `reactivity: true`, the hook will watch for changes and automatically reload data when the URL or filtering parameters change.
|
|
63
69
|
|
|
70
|
+
## SSR and Initialization
|
|
71
|
+
|
|
72
|
+
To ensure correct operation of **Server Side Rendering (SSR)**, it is recommended to use the asynchronous version [**`useApiManagementAsyncRef`**](./useApiManagementAsyncRef.en.mdx). It automatically initializes the GET request for pre-fetching on the server.
|
|
73
|
+
|
|
74
|
+
If you are using the standard `useApiManagementRef`, you can manually include it in the SSR cycle by calling `initSsr()` in the component's `setup()`. This ensures that the data will be loaded on the server side.
|
|
75
|
+
|
|
64
76
|
## Core Architecture
|
|
65
77
|
|
|
66
78
|
`useApiManagementRef` is an orchestrator hook designed to manage standard CRUD views (like data tables). By passing configurations, you get an all-in-one return object that manages loading spinners, searches, formats data for display, handles CRUD actions, and automatically refetches lists.
|
package/src/media/functional/functional/composables/useApiManagementRef/useApiManagementRef.ru.mdx
CHANGED
|
@@ -30,9 +30,15 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
30
30
|
- `isSearch: ComputedRef<boolean>` — активен ли поиск (есть ли поисковый запрос).
|
|
31
31
|
- `search: Ref<string>` — реактивная строка поиска (Proxy к переданному `searchOptions.value`).
|
|
32
32
|
- `sendPost / sendPut / sendDelete: (request?: ApiFetch['request']) => Promise<any>` — методы для вызова мутаций.
|
|
33
|
+
- `init: () => void` — метод для явной ручной инициализации запроса и наблюдения.
|
|
34
|
+
- `initSsr: () => void` — метод для инициализации на стороне сервера (SSR).
|
|
33
35
|
- `reset: () => Promise<void>` — принудительный перезапуск GET-запроса и очистка текущего состояния.
|
|
34
36
|
- `abort: () => void` — прерывание текущего сетевого запроса.
|
|
35
37
|
|
|
38
|
+
## Асинхронная версия
|
|
39
|
+
|
|
40
|
+
Для случаев, когда требуется немедленная (не ленивая) инициализация запроса (например, для SSR), используйте [**`useApiManagementAsyncRef`**](./useApiManagementAsyncRef.ru.mdx). Он автоматически вызывает `initSsr()` при создании.
|
|
41
|
+
|
|
36
42
|
## Ограничения дженериков (Generic Constraints)
|
|
37
43
|
|
|
38
44
|
- `Return extends ApiManagementValue` — тип данных, возвращаемых API.
|
|
@@ -61,6 +67,12 @@ import {Meta} from '@storybook/addon-docs/blocks'
|
|
|
61
67
|
- Это приводит к повторной загрузке данных и обновлению всего списка. Таким образом, после удаления строки или добавления новой, ваш список всегда остается актуальным без написания лишнего кода.
|
|
62
68
|
6. **Реактивность параметров**: Если `path` или `options` (в `propsGet`) являются реактивными (Vue Ref), и вы установили `reactivity: true`, хук будет следить за их изменением и автоматически перезагружать данные при смене URL или параметров фильтрации.
|
|
63
69
|
|
|
70
|
+
## SSR и инициализация
|
|
71
|
+
|
|
72
|
+
Для обеспечения корректной работы **Server Side Rendering (SSR)** рекомендуется использовать асинхронную версию [**`useApiManagementAsyncRef`**](./useApiManagementAsyncRef.ru.mdx). Она автоматически инициализирует запрос для предзагрузки на сервере.
|
|
73
|
+
|
|
74
|
+
Если вы используете стандартный `useApiManagementRef`, вы можете вручную включить его в цикл SSR, вызвав `initSsr()` в `setup()` компонента. Это гарантирует, что данные будут загружены на стороне сервера.
|
|
75
|
+
|
|
64
76
|
## Архитектура
|
|
65
77
|
|
|
66
78
|
`useApiManagementRef` — это центральный оркестратор для CRUD-задач. Он объединяет четыре независимых хука (`useApiRef`, `useFormattersRef`, `useSearchRef` и мутации) в единую реактивную систему. Вместо управления десятками разрозненных состояний (загрузка, ошибки, данные, фильтры), разработчик описывает конфигурацию, а хук берет на себя синхронизацию их жизненных циклов.
|
package/src/media/functional/functional/composables/useApiManagementRef/useApiManagementRef.vi.mdx
CHANGED
|
@@ -61,6 +61,12 @@ Một composable mạnh mẽ để điều phối toàn diện các request API.
|
|
|
61
61
|
- Việc này kích hoạt tải lại dữ liệu và cập nhật toàn bộ danh sách. Do đó, sau khi xóa một dòng hoặc thêm mới, danh sách của bạn luôn được cập nhật mà không cần viết thêm mã xử lý thủ công.
|
|
62
62
|
6. **Tính phản xạ của tham số**: Nếu `path` hoặc `options` (trong `propsGet`) là các biến reactive (Vue Ref) và bạn thiết lập `reactivity: true`, hook sẽ theo dõi sự thay đổi của chúng và tự động tải lại dữ liệu khi URL hoặc tham số lọc thay đổi.
|
|
63
63
|
|
|
64
|
+
## SSR và Khởi tạo
|
|
65
|
+
|
|
66
|
+
Để đảm bảo hoạt động chính xác của **Server Side Rendering (SSR)**, bạn nên sử dụng phiên bản bất đồng bộ [**`useApiManagementAsyncRef`**](./useApiManagementAsyncRef.vi.mdx). Nó tự động khởi tạo GET request để tải trước trên máy chủ.
|
|
67
|
+
|
|
68
|
+
Nếu bạn đang sử dụng `useApiManagementRef` tiêu chuẩn, bạn có thể đưa nó vào chu trình SSR một cách thủ công bằng cách gọi `initSsr()` trong `setup()` của component. Điều này đảm bảo rằng dữ liệu sẽ được tải ở phía máy chủ.
|
|
69
|
+
|
|
64
70
|
## Kiến trúc phần lõi
|
|
65
71
|
|
|
66
72
|
`useApiManagementRef` là một hook điều hướng được thiết kế chuyên biệt để quản lý các mẫu màn hình CRUD tiêu chuẩn (ví dụ như data tables). Thông qua cấu hình tham số, bạn sẽ nhận được một đối tượng "tất cả trong một" để quản lý loading spinners, bộ tìm kiếm, chuẩn hóa dữ liệu cho UI, điều khiển thao tác CRUD và tự động tải lại danh sách.
|
|
@@ -35,6 +35,7 @@ Methods:
|
|
|
35
35
|
- `isReading(): boolean` — A synchronous method that returns the current value of the `reading` flag.
|
|
36
36
|
- `getItem(): ApiData<R> | undefined` — Method to get the current value of `data` without creating a reactive dependency.
|
|
37
37
|
- `init(awaitFetch?: boolean): Promise<void>` — Method for explicit request and watcher initialization. Triggered automatically on first access to `data`. If `awaitFetch` is `true`, it waits for the first request to complete.
|
|
38
|
+
- `initSsr(): void` — Method for server-side initialization. Uses `onServerPrefetch` to fetch data during SSR.
|
|
38
39
|
- `reset(): Promise<void>` — An asynchronous method to force re-run the request. Cancels the current active request (if any) and initiates a new one.
|
|
39
40
|
- `stop(): void` — Stops watching reactive dependencies and resets `data` to `undefined`.
|
|
40
41
|
- `abort(): void` — Cancels the current HTTP request via the internal `AbortController`, while keeping already loaded data in `data`.
|
|
@@ -47,20 +48,22 @@ Requests and watching mechanisms **are not started** immediately when `useApiRef
|
|
|
47
48
|
|
|
48
49
|
`setApiRefGlobalConditions(conditions)` — sets a global condition for all `useApiRef` instances. Only works on the first call.
|
|
49
50
|
|
|
50
|
-
## SSR
|
|
51
|
+
## SSR (Server-Side Rendering)
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
To ensure correct operation on the server side (SSR), the **`initSsr()`** method must be used.
|
|
53
54
|
|
|
54
|
-
###
|
|
55
|
+
### The `initSsr()` Method
|
|
56
|
+
When called in a component's `setup()`, it ensures that data is loaded on the server before page rendering and applied instantly on the client.
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
+
```typescript
|
|
59
|
+
const { data, initSsr } = useApiRef('path/to/api')
|
|
58
60
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
+
// Call this for SSR support
|
|
62
|
+
initSsr()
|
|
63
|
+
```
|
|
61
64
|
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
### Automation via `AsyncRef`
|
|
66
|
+
To avoid calling `initSsr()` manually, you can use the asynchronous version — [**`useApiAsyncRef`**](./useApiAsyncRef.en.mdx). It automatically calls `initSsr()` upon creation.
|
|
64
67
|
## ApiOptions Object
|
|
65
68
|
|
|
66
69
|
`ApiOptions` — can accept a string with the `method` name (e.g., `'GET'`) or an object of type `ApiFetch`. Fields of the `ApiFetch` object:
|
|
@@ -37,6 +37,7 @@ Composable для удобной работы с API-запросами во Vue
|
|
|
37
37
|
- `isReading(): boolean` — Синхронный метод, возвращающий текущее значение флага `reading`.
|
|
38
38
|
- `getItem(): ApiData<R> | undefined` — Метод для получения текущего значения `data` без создания реактивной зависимости.
|
|
39
39
|
- `init(awaitFetch?: boolean): Promise<void>` — Метод для явной инициализации запроса и watchers. Вызывается автоматически при первом обращении к `data`. Если `awaitFetch` передано как `true`, дожидается выполнения первого запроса.
|
|
40
|
+
- `initSsr(): void` — Метод для инициализации на стороне сервера. Использует `onServerPrefetch` для выполнения запроса во время SSR.
|
|
40
41
|
- `reset(): Promise<void>` — Асинхронный метод для принудительного перезапуска запроса. Отменяет текущий активный запрос (если есть) и инициирует новый.
|
|
41
42
|
- `stop(): void` — Останавливает наблюдение за реактивными зависимостями и сбрасывает `data` в `undefined`.
|
|
42
43
|
- `abort(): void` — Вызывает отмену текущего HTTP-запроса через внутренний `AbortController`, сохраняя при этом уже загруженные данные в `data`.
|
|
@@ -49,20 +50,22 @@ Composable для удобной работы с API-запросами во Vue
|
|
|
49
50
|
|
|
50
51
|
`setApiRefGlobalConditions(conditions)` — устанавливает глобальное условие для всех экземпляров `useApiRef`. Работает только один раз.
|
|
51
52
|
|
|
52
|
-
## SSR
|
|
53
|
+
## SSR (Server-Side Rendering)
|
|
53
54
|
|
|
54
|
-
|
|
55
|
+
Для корректной работы на стороне сервера (SSR) необходимо использовать метод **`initSsr()`**.
|
|
55
56
|
|
|
56
|
-
###
|
|
57
|
+
### Метод `initSsr()`
|
|
58
|
+
При вызове в `setup()` компонента гарантирует, что данные будут загружены на сервере перед рендерингом страницы, а на клиенте подставятся мгновенно.
|
|
57
59
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
```typescript
|
|
61
|
+
const { data, initSsr } = useApiRef('path/to/api')
|
|
60
62
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
+
// Вызываем для поддержки SSR
|
|
64
|
+
initSsr()
|
|
65
|
+
```
|
|
63
66
|
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
### Автоматизация через `AsyncRef`
|
|
68
|
+
Чтобы не вызывать `initSsr()` вручную, можно использовать асинхронную версию композабла — [**`useApiAsyncRef`**](./useApiAsyncRef.ru.mdx). Он автоматически вызывает `initSsr()` при создании.
|
|
66
69
|
## Объект ApiOptions
|
|
67
70
|
|
|
68
71
|
`ApiOptions` — может принимать строку с названием `method` (например, `'GET'`) или объект типа `ApiFetch`. Поля объекта `ApiFetch`:
|
|
@@ -49,20 +49,22 @@ Yêu cầu và cơ chế theo dõi thay đổi **không được bắt đầu**
|
|
|
49
49
|
|
|
50
50
|
`setApiRefGlobalConditions(conditions)` — thiết lập điều kiện toàn cục cho tất cả các instance `useApiRef`. Chỉ có hiệu lực một lần.
|
|
51
51
|
|
|
52
|
-
## SSR
|
|
52
|
+
## SSR (Server-Side Rendering)
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
Để đảm bảo hoạt động chính xác ở phía máy chủ (SSR), phương thức **`initSsr()`** phải được sử dụng.
|
|
55
55
|
|
|
56
|
-
###
|
|
56
|
+
### Phương thức `initSsr()`
|
|
57
|
+
Khi được gọi trong `setup()` của một component, nó đảm bảo dữ liệu được tải trên máy chủ trước khi render trang và được áp dụng ngay lập tức ở phía máy khách.
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
```typescript
|
|
60
|
+
const { data, initSsr } = useApiRef('path/to/api')
|
|
60
61
|
|
|
61
|
-
|
|
62
|
-
|
|
62
|
+
// Gọi phương thức này để hỗ trợ SSR
|
|
63
|
+
initSsr()
|
|
64
|
+
```
|
|
63
65
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
### Tự động hóa qua `AsyncRef`
|
|
67
|
+
Để tránh việc gọi `initSsr()` thủ công, bạn có thể sử dụng phiên bản bất đồng bộ — [**`useApiAsyncRef`**](./useApiAsyncRef.vi.mdx). Nó tự động gọi `initSsr()` khi được tạo.
|
|
66
68
|
## Đối tượng ApiOptions
|
|
67
69
|
|
|
68
70
|
`ApiOptions` — có thể nhận một chuỗi tên `method` (ví dụ: `'GET'`) hoặc một đối tượng kiểu `ApiFetch`. Các trường của đối tượng `ApiFetch`:
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/en/nitro-basic/Functions/getInject - Get Injected Value'/>
|
|
4
|
+
|
|
5
|
+
# `getInject`
|
|
6
|
+
|
|
7
|
+
A utility function that safely reads an injected value by name from the current Vue component instance. If there is no active component instance or the value is not provided, it returns `undefined`.
|
|
8
|
+
|
|
9
|
+
**Parameters:**
|
|
10
|
+
- `name: string` — The injection key name.
|
|
11
|
+
|
|
12
|
+
**Returns:**
|
|
13
|
+
`T | undefined` — The injected value if it exists, otherwise `undefined`.
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { provide } from 'vue'
|
|
17
|
+
import { getInject } from '@dxtmisha/nitro-basic'
|
|
18
|
+
|
|
19
|
+
provide('theme', 'dark')
|
|
20
|
+
|
|
21
|
+
// Returns 'dark'
|
|
22
|
+
const theme = getInject<string>('theme')
|
|
23
|
+
|
|
24
|
+
// Returns undefined when the key is missing
|
|
25
|
+
const language = getInject<string>('language')
|
|
26
|
+
```
|
|
27
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/ru/nitro-basic/Functions/getInject - Получение внедренного значения'/>
|
|
4
|
+
|
|
5
|
+
# `getInject`
|
|
6
|
+
|
|
7
|
+
Утилитарная функция, которая безопасно получает внедренное значение по имени из текущего экземпляра Vue-компонента. Если активного экземпляра компонента нет или значение не было предоставлено, функция возвращает `undefined`.
|
|
8
|
+
|
|
9
|
+
**Параметры:**
|
|
10
|
+
- `name: string` — Имя ключа внедрения.
|
|
11
|
+
|
|
12
|
+
**Возвращает:**
|
|
13
|
+
`T | undefined` — Внедренное значение, если оно существует, иначе `undefined`.
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { provide } from 'vue'
|
|
17
|
+
import { getInject } from '@dxtmisha/nitro-basic'
|
|
18
|
+
|
|
19
|
+
provide('theme', 'dark')
|
|
20
|
+
|
|
21
|
+
// Возвращает 'dark'
|
|
22
|
+
const theme = getInject<string>('theme')
|
|
23
|
+
|
|
24
|
+
// Возвращает undefined, если ключ отсутствует
|
|
25
|
+
const language = getInject<string>('language')
|
|
26
|
+
```
|
|
27
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/vi/nitro-basic/Functions/getInject - Lấy giá trị được inject'/>
|
|
4
|
+
|
|
5
|
+
# `getInject`
|
|
6
|
+
|
|
7
|
+
Một hàm tiện ích dùng để lấy an toàn giá trị được inject theo tên từ instance Vue hiện tại. Nếu không có instance component đang hoạt động hoặc giá trị chưa được cung cấp, hàm sẽ trả về `undefined`.
|
|
8
|
+
|
|
9
|
+
**Tham số:**
|
|
10
|
+
- `name: string` — Tên của khóa inject.
|
|
11
|
+
|
|
12
|
+
**Trả về:**
|
|
13
|
+
`T | undefined` — Giá trị được inject nếu tồn tại, ngược lại trả về `undefined`.
|
|
14
|
+
|
|
15
|
+
**Ví dụ sử dụng:**
|
|
16
|
+
- Gọi `getInject<string>('theme')` trong `setup()` để lấy giá trị đã được `provide`.
|
|
17
|
+
- Nếu key không tồn tại hoặc không có component instance hiện tại, kết quả sẽ là `undefined`.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/en/# UI Figma/! About the library'/>
|
|
4
|
+
|
|
5
|
+
# UI Figma Ecosystem
|
|
6
|
+
|
|
7
|
+
The `UI Figma` system is a comprehensive infrastructure for developing Figma plugins. It is designed to bridge the gap between the "Code Side" (plugin backend) and the "UI Side" (frontend), providing seamless interaction, reactive data management, and full type safety.
|
|
8
|
+
|
|
9
|
+
The ecosystem is built on a three-tier architecture, where each layer handles a specific part of the plugin lifecycle.
|
|
10
|
+
|
|
11
|
+
## Three Layers of Interaction
|
|
12
|
+
|
|
13
|
+
### 1. Communication Core (@dxtmisha/figma)
|
|
14
|
+
The fundamental package that defines interaction protocols. It contains:
|
|
15
|
+
- Message type constants.
|
|
16
|
+
- Shared data types and interfaces.
|
|
17
|
+
- Abstract messenger classes to standardize data exchange.
|
|
18
|
+
- Utilities for routing messages between the UI and the Figma sandbox.
|
|
19
|
+
|
|
20
|
+
### 2. Plugin Logic (@dxtmisha/figma-code)
|
|
21
|
+
A package running in the Figma execution environment (Sandbox). This is the "brain" of the plugin, with direct access to the Figma API:
|
|
22
|
+
- **Element Analysis**: `FigmaItem` and `FigmaFrame` classes for deep document structure exploration.
|
|
23
|
+
- **Data Persistence**: `FigmaStorage` for working with PluginData (storing data directly in the `.fig` file).
|
|
24
|
+
- **Exporting**: Tools for automated screenshot creation and asset export.
|
|
25
|
+
- **Synchronization**: `FigmaTopLevelFrames` and `FigmaFramesSelected` classes for passing the current document state to the UI.
|
|
26
|
+
|
|
27
|
+
### 3. Reactive Interface (@dxtmisha/figma-ref)
|
|
28
|
+
A package for developing the user interface using Vue 3. It transforms asynchronous plugin responses into convenient reactive references (composables):
|
|
29
|
+
- **Reactive Stores**: `useFigmaStorage` and `useFigmaClientStorage` for instant data binding between UI and Figma storage.
|
|
30
|
+
- **Observers**: `useFigmaUiFrames` for automatic updates of the available frame list.
|
|
31
|
+
- **Selection Management**: `useFigmaUiSelected` for linking UI-selected elements with Figma's active selection.
|
|
32
|
+
|
|
33
|
+
## System Features
|
|
34
|
+
|
|
35
|
+
**Seamless Interaction**
|
|
36
|
+
Developers no longer need to manually manage `postMessage` calls and event listeners. The system handles routing and type validation automatically.
|
|
37
|
+
|
|
38
|
+
**Out-of-the-box Reactivity**
|
|
39
|
+
Using the Vue Composition API allows you to build plugin interfaces as easily as standard web applications, with data automatically persisting in the Figma document.
|
|
40
|
+
|
|
41
|
+
**Type Safety**
|
|
42
|
+
All messages and data structures are strictly typed, eliminating errors when passing data between isolated environments (UI and Sandbox).
|
|
43
|
+
|
|
44
|
+
## Why Use This Ecosystem?
|
|
45
|
+
|
|
46
|
+
- **Development Speed**: Ready-made foundation for typical tasks (selection, settings, screenshots).
|
|
47
|
+
- **Clean Architecture**: Clear separation of concerns between business logic and the user interface.
|
|
48
|
+
- **Scalability**: Easy to add new features thanks to the modular structure and the Messenger pattern.
|
|
49
|
+
|
|
50
|
+
## Git
|
|
51
|
+
|
|
52
|
+
[https://github.com/dxtmisha/dxt-ui/tree/main/packages/figma](https://github.com/dxtmisha/dxt-ui/tree/main/packages/figma)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/ru/# UI Figma/! О библиотеке'/>
|
|
4
|
+
|
|
5
|
+
# Экосистема UI Figma
|
|
6
|
+
|
|
7
|
+
Система `UI Figma` представляет собой комплексную инфраструктуру для разработки плагинов Figma. Она разработана для устранения барьера между «стороной кода» (backend плагина) и «стороной UI» (frontend), обеспечивая бесшовное взаимодействие, реактивное управление данными и полную типизацию.
|
|
8
|
+
|
|
9
|
+
В основе системы лежит трехуровневая архитектура, где каждый уровень отвечает за свою часть жизненного цикла плагина.
|
|
10
|
+
|
|
11
|
+
## Три уровня взаимодействия
|
|
12
|
+
|
|
13
|
+
### 1. Основа связи (@dxtmisha/figma)
|
|
14
|
+
Фундаментальный пакет, определяющий протоколы взаимодействия. Содержит:
|
|
15
|
+
- Константы типов сообщений.
|
|
16
|
+
- Общие типы данных и интерфейсы.
|
|
17
|
+
- Абстрактные классы мессенджеров для стандартизации обмена данными.
|
|
18
|
+
- Утилиты для маршрутизации сообщений между UI и песочницей Figma.
|
|
19
|
+
|
|
20
|
+
### 2. Логика плагина (@dxtmisha/figma-code)
|
|
21
|
+
Пакет, работающий в среде выполнения Figma (Sandbox). Это «мозг» плагина, имеющий прямой доступ к Figma API:
|
|
22
|
+
- **Анализ элементов**: Классы `FigmaItem` и `FigmaFrame` для глубокого исследования структуры документа.
|
|
23
|
+
- **Хранение данных**: `FigmaStorage` для работы с PluginData (хранение данных в самом файле документа).
|
|
24
|
+
- **Экспорт**: Инструменты для автоматизированного создания скриншотов и экспорта ресурсов.
|
|
25
|
+
- **Синхронизация**: Классы `FigmaTopLevelFrames` и `FigmaFramesSelected` для передачи актуального состояния документа в UI.
|
|
26
|
+
|
|
27
|
+
### 3. Реактивный интерфейс (@dxtmisha/figma-ref)
|
|
28
|
+
Пакет для разработки пользовательского интерфейса на Vue 3. Он превращает асинхронные ответы от плагина в удобные реактивные ссылки (composables):
|
|
29
|
+
- **Реактивные хранилища**: `useFigmaStorage` и `useFigmaClientStorage` для мгновенной связи данных UI с хранилищем Figma.
|
|
30
|
+
- **Наблюдатели**: `useFigmaUiFrames` для автоматического обновления списка доступных фреймов.
|
|
31
|
+
- **Управление выбором**: `useFigmaUiSelected` для связи выделенных элементов в UI со списком выбора в плагине.
|
|
32
|
+
|
|
33
|
+
## Возможности системы
|
|
34
|
+
|
|
35
|
+
**Бесшовное взаимодействие**
|
|
36
|
+
Разработчику больше не нужно вручную прописывать `postMessage` и слушатели событий. Система берет на себя маршрутизацию и проверку типов.
|
|
37
|
+
|
|
38
|
+
**Реактивность «из коробки»**
|
|
39
|
+
Использование Vue Composition API позволяет строить интерфейс плагина так же просто, как обычное веб-приложение, при этом данные будут автоматически сохраняться в документе Figma.
|
|
40
|
+
|
|
41
|
+
**Типобезопасность**
|
|
42
|
+
Все сообщения и структуры данных строго типизированы, что исключает ошибки при передаче данных между изолированными средами (UI и Sandbox).
|
|
43
|
+
|
|
44
|
+
## Преимущества использования
|
|
45
|
+
|
|
46
|
+
- **Ускорение разработки**: Готовая база для типичных задач (выделение, чтение настроек, скриншоты).
|
|
47
|
+
- **Чистая архитектура**: Четкое разделение ответственности между бизнес-логикой плагина и его интерфейсом.
|
|
48
|
+
- **Масштабируемость**: Легкое добавление новых функций за счет модульной структуры и использования паттерна Messenger.
|
|
49
|
+
|
|
50
|
+
## Git
|
|
51
|
+
|
|
52
|
+
[https://github.com/dxtmisha/dxt-ui/tree/main/packages/figma](https://github.com/dxtmisha/dxt-ui/tree/main/packages/figma)
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/vi/# UI Figma/! Giới thiệu về thư viện'/>
|
|
4
|
+
|
|
5
|
+
# Hệ sinh thái UI Figma
|
|
6
|
+
|
|
7
|
+
Hệ thống `UI Figma` là một cơ sở hạ tầng toàn diện để phát triển các plugin Figma. Nó được thiết kế để xóa bỏ rào cản giữa "phía Mã" (backend của plugin) và "phía UI" (frontend), cung cấp khả năng tương tác liền mạch, quản lý dữ liệu phản hồi và định kiểu dữ liệu đầy đủ.
|
|
8
|
+
|
|
9
|
+
Hệ sinh thái được xây dựng trên kiến trúc ba tầng, trong đó mỗi lớp xử lý một phần cụ thể trong vòng đời của plugin.
|
|
10
|
+
|
|
11
|
+
## Ba tầng tương tác
|
|
12
|
+
|
|
13
|
+
### 1. Cốt lõi giao tiếp (@dxtmisha/figma)
|
|
14
|
+
Gói cơ bản xác định các giao thức tương tác. Nó bao gồm:
|
|
15
|
+
- Các hằng số loại tin nhắn.
|
|
16
|
+
- Các kiểu dữ liệu và giao diện dùng chung.
|
|
17
|
+
- Các lớp trình nhắn tin trừu tượng để tiêu chuẩn hóa việc trao đổi dữ liệu.
|
|
18
|
+
- Các tiện ích để định tuyến tin nhắn giữa UI và sandbox của Figma.
|
|
19
|
+
|
|
20
|
+
### 2. Logic Plugin (@dxtmisha/figma-code)
|
|
21
|
+
Một gói chạy trong môi trường thực thi của Figma (Sandbox). Đây là "bộ não" của plugin, có quyền truy cập trực tiếp vào Figma API:
|
|
22
|
+
- **Phân tích phần tử**: Các lớp `FigmaItem` và `FigmaFrame` để khám phá sâu cấu trúc tài liệu.
|
|
23
|
+
- **Lưu trữ dữ liệu**: `FigmaStorage` để làm việc với PluginData (lưu trữ dữ liệu trực tiếp trong tệp `.fig`).
|
|
24
|
+
- **Xuất dữ liệu**: Các công cụ để tự động tạo ảnh chụp màn hình và xuất tài sản.
|
|
25
|
+
- **Đồng bộ hóa**: Các lớp `FigmaTopLevelFrames` và `FigmaFramesSelected` để chuyển trạng thái tài liệu hiện tại sang UI.
|
|
26
|
+
|
|
27
|
+
### 3. Giao diện phản hồi (@dxtmisha/figma-ref)
|
|
28
|
+
Một gói để phát triển giao diện người dùng bằng Vue 3. Nó chuyển đổi các phản hồi bất đồng bộ từ plugin thành các tham chiếu phản hồi (composables) thuận tiện:
|
|
29
|
+
- **Kho lưu trữ phản hồi**: `useFigmaStorage` và `useFigmaClientStorage` để liên kết dữ liệu tức thì giữa UI và bộ nhớ Figma.
|
|
30
|
+
- **Trình quan sát**: `useFigmaUiFrames` để tự động cập nhật danh sách các frame có sẵn.
|
|
31
|
+
- **Quản lý lựa chọn**: `useFigmaUiSelected` để liên kết các phần tử được chọn trong UI với vùng lựa chọn hoạt động trong Figma.
|
|
32
|
+
|
|
33
|
+
## Các tính năng của hệ thống
|
|
34
|
+
|
|
35
|
+
**Tương tác liền mạch**
|
|
36
|
+
Các nhà phát triển không còn cần phải quản lý thủ công các lệnh gọi `postMessage` và trình lắng nghe sự kiện. Hệ thống tự động xử lý việc định tuyến và xác thực kiểu dữ liệu.
|
|
37
|
+
|
|
38
|
+
**Tính phản hồi có sẵn**
|
|
39
|
+
Sử dụng Vue Composition API cho phép bạn xây dựng giao diện plugin dễ dàng như các ứng dụng web tiêu chuẩn, với dữ liệu tự động được lưu trữ bền vững trong tài liệu Figma.
|
|
40
|
+
|
|
41
|
+
**An toàn kiểu dữ liệu**
|
|
42
|
+
Tất cả các tin nhắn và cấu trúc dữ liệu đều được định kiểu nghiêm ngặt, loại bỏ lỗi khi chuyển dữ liệu giữa các môi trường biệt lập (UI và Sandbox).
|
|
43
|
+
|
|
44
|
+
## Tại sao nên sử dụng hệ sinh thái này?
|
|
45
|
+
|
|
46
|
+
- **Tốc độ phát triển**: Nền tảng có sẵn cho các tác vụ điển hình (lựa chọn, cài đặt, ảnh chụp màn hình).
|
|
47
|
+
- **Kiến trúc sạch**: Phân tách rõ ràng các mối quan tâm giữa logic nghiệp vụ và giao diện người dùng.
|
|
48
|
+
- **Khả năng mở rộng**: Dễ dàng thêm các tính năng mới nhờ cấu trúc mô-đun và mô hình Messenger.
|
|
49
|
+
|
|
50
|
+
## Git
|
|
51
|
+
|
|
52
|
+
[https://github.com/dxtmisha/dxt-ui/tree/main/packages/figma](https://github.com/dxtmisha/dxt-ui/tree/main/packages/figma)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/en/# UI Figma/# Working with Frames'/>
|
|
4
|
+
|
|
5
|
+
# Working with Frames
|
|
6
|
+
|
|
7
|
+
The library provides tools for managing the list of frames on the current Figma page and tracking selected elements. This allows you to build complex navigation interfaces and bulk selection systems within your plugin.
|
|
8
|
+
|
|
9
|
+
## Backend (Backend / plugin/code.ts)
|
|
10
|
+
|
|
11
|
+
For automatic frame data synchronization, the corresponding handlers must be initialized on the plugin side.
|
|
12
|
+
|
|
13
|
+
### Initialization
|
|
14
|
+
```typescript
|
|
15
|
+
import { FigmaTopLevelFrames, FigmaFramesSelected } from '@dxtmisha/figma-code'
|
|
16
|
+
|
|
17
|
+
// Activate listeners for frame list and selection management
|
|
18
|
+
FigmaTopLevelFrames.send()
|
|
19
|
+
FigmaFramesSelected.send()
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Interface (UI / Iframe)
|
|
23
|
+
|
|
24
|
+
Data about all frames on the page and tools for managing the plugin's internal selection list are available in the interface.
|
|
25
|
+
|
|
26
|
+
### Page Frame List (Vue)
|
|
27
|
+
Allows you to retrieve a list of all frames and sections at the root of the current page with screenshots.
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { useFigmaUiFrames } from '@dxtmisha/figma-ref'
|
|
31
|
+
|
|
32
|
+
const { frames, loading } = useFigmaUiFrames()
|
|
33
|
+
|
|
34
|
+
/* frames.value contains a list of objects:
|
|
35
|
+
{
|
|
36
|
+
id: string,
|
|
37
|
+
name: string,
|
|
38
|
+
image: Uint8Array | string // JPG screenshot
|
|
39
|
+
}
|
|
40
|
+
*/
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Plugin Selected Elements (Vue)
|
|
44
|
+
A mechanism for tracking and modifying the list of "selected" elements within the plugin's interface. This state is preserved globally at the plugin session level.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { useFigmaUiSelected } from '@dxtmisha/figma-ref'
|
|
48
|
+
|
|
49
|
+
const {
|
|
50
|
+
selected, // List of selected frame IDs
|
|
51
|
+
isSelected, // Check function: isSelected(id)
|
|
52
|
+
toggleSelected, // Toggle function: toggleSelected(id, boolean)
|
|
53
|
+
} = useFigmaUiSelected()
|
|
54
|
+
|
|
55
|
+
// Example usage:
|
|
56
|
+
const active = isSelected('1:123')
|
|
57
|
+
const toggle = () => toggleSelected('1:123', !active.value)
|
|
58
|
+
```
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Meta } from '@storybook/addon-docs/blocks'
|
|
2
|
+
|
|
3
|
+
<Meta title='@dxtmisha/ru/# UI Figma/# Работа с фреймами'/>
|
|
4
|
+
|
|
5
|
+
# Работа с фреймами
|
|
6
|
+
|
|
7
|
+
Библиотека предоставляет инструменты для управления списком фреймов на текущей странице Figma и отслеживания выбранных элементов. Это позволяет строить сложные интерфейсы навигации и системы массового выбора внутри плагина.
|
|
8
|
+
|
|
9
|
+
## Бэкенд (Backend / plugin/code.ts)
|
|
10
|
+
|
|
11
|
+
Для автоматической синхронизации данных о фреймах необходимо инициализировать соответствующие обработчики на стороне плагина.
|
|
12
|
+
|
|
13
|
+
### Инициализация
|
|
14
|
+
```typescript
|
|
15
|
+
import { FigmaTopLevelFrames, FigmaFramesSelected } from '@dxtmisha/figma-code'
|
|
16
|
+
|
|
17
|
+
// Активация слушателей списка фреймов и управления выбором
|
|
18
|
+
FigmaTopLevelFrames.send()
|
|
19
|
+
FigmaFramesSelected.send()
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Интерфейс (UI / Iframe)
|
|
23
|
+
|
|
24
|
+
В интерфейсе доступны данные о всех фреймах страницы и инструменты для управления внутренним списком выбора плагина.
|
|
25
|
+
|
|
26
|
+
### Список фреймов страницы (Vue)
|
|
27
|
+
Позволяет получить список всех фреймов и секций в корне текущей страницы со скриншотами.
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { useFigmaUiFrames } from '@dxtmisha/figma-ref'
|
|
31
|
+
|
|
32
|
+
const { frames, loading } = useFigmaUiFrames()
|
|
33
|
+
|
|
34
|
+
/* frames.value содержит список объектов:
|
|
35
|
+
{
|
|
36
|
+
id: string,
|
|
37
|
+
name: string,
|
|
38
|
+
image: Uint8Array | string // Скриншот JPG
|
|
39
|
+
}
|
|
40
|
+
*/
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Выбранные элементы плагина (Vue)
|
|
44
|
+
Механизм для отслеживания и изменения списка «выбранных» элементов внутри интерфейса плагина. Это состояние сохраняется глобально на уровне сессии плагина.
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import { useFigmaUiSelected } from '@dxtmisha/figma-ref'
|
|
48
|
+
|
|
49
|
+
const {
|
|
50
|
+
selected, // Список ID выбранных фреймов
|
|
51
|
+
isSelected, // Функция проверки: isSelected(id)
|
|
52
|
+
toggleSelected, // Функция переключения: toggleSelected(id, boolean)
|
|
53
|
+
} = useFigmaUiSelected()
|
|
54
|
+
|
|
55
|
+
// Пример использования:
|
|
56
|
+
const active = isSelected('1:123')
|
|
57
|
+
const toggle = () => toggleSelected('1:123', !active.value)
|
|
58
|
+
```
|