diff --git a/README.md b/README.md
index e5ea1f9..81c83f7 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,6 @@
Shared library for BI next.js projects.
-
---
## Install
@@ -18,7 +17,9 @@ yarn add git+https://git.d.aiengines.ir/bi/uikit.git
```bash
yarn upgrade uikit
```
+
or
+
```bash
rm -rf .next
rm -rf node_modules/.vite
@@ -32,14 +33,15 @@ yarn upgrade uikit
# imports
-| مسیر | کاربرد | dependency اضافی |
+| مسیر | کاربرد | dependency اضافی |
| ------------------ | ------------------------------------- | --------------------------------------- |
| `uikit` | utility functions | - |
| `uikit/utils` | utility functions | - |
| `uikit/pagination` | pagination | Chakra + React + react-icons |
| `uikit/layout` | Header | Chakra + React |
-| `uikit/core` | API، BiProvider، Keycloak، Permission | Chakra + React Query + Axios + Keycloak |
+| `uikit/core` | API، BiProvider، Keycloak، Permission | Chakra + React Query + Axios + Keycloak |
| `uikit/table` | DataTable | Chakra + TanStack Table + Pagination |
+| `uikit/remote/ui` | Remote UI components مثل `GBadge` | Chakra + React + remote static file |
---
@@ -52,6 +54,7 @@ toFaDigits(123456);
toEnDigits("۱۲۳۴۵۶");
toFaNumber(123456);
```
+
or
```js
@@ -159,19 +162,22 @@ export default function App() {
## BiProvider props
-| Prop |
-| -------------------- |
-| `apiBaseUrl` |
-| `keycloakClientId` |
-| `permissionClientId` |
-| `loading` |
-| `updateChecker` |
-| `updateCheckerProps` |
-| `keycloakUrl` |
-| `keycloakRealm` |
-| `permissionUrl` |
-| `keycloakEnabled` |
-| `permissionEnabled` |
+| Prop |
+| ----------------------------- |
+| `apiBaseUrl` |
+| `keycloakClientId` |
+| `permissionClientId` |
+| `loading` |
+| `updateChecker` |
+| `updateCheckerProps` |
+| `keycloakUrl` |
+| `keycloakRealm` |
+| `permissionUrl` |
+| `keycloakEnabled` |
+| `permissionEnabled` |
+| `remoteUiEnabled` |
+| `remoteUiUrl` |
+| `remoteUiChakraProviderProps` |
---
@@ -182,6 +188,85 @@ keycloakUrl = "https://auth.ibagher.ir";
keycloakRealm = "bi";
permissionUrl = "https://api.d.aiengines.ir/user_api/v1/permissions/list";
updateChecker = false;
+remoteUiEnabled = true;
+remoteUiUrl = "https://uikit.d.aiengines.ir/GBadge.js";
+```
+
+---
+
+## BiProvider with Remote UI
+
+`BiProvider` به صورت خودکار dependencyهای لازم برای کامپوننتهای `remote/ui` را setup میکند.
+
+پس اگر سامانه مقصد از `BiProvider` استفاده میکند، برای استفاده از `GBadge` کار اضافهای لازم نیست.
+
+```jsx
+import { BiProvider } from "uikit/core";
+import { GBadge } from "uikit/remote/ui";
+
+export default function App() {
+ return (
+
+
+ فعال
+
+
+ );
+}
+```
+
+در این حالت `GBadge` همچنان از Chakra استفاده میکند، ولی فایل remote آن، یعنی `GBadge.js`، خودش Chakra و React و font را داخل bundle نمیآورد.
+
+dependencyهای لازم از خود سامانه مقصد گرفته میشوند.
+
+---
+
+## Change Remote UI URL
+
+اگر فایل remote روی آدرس دیگری deploy شده باشد:
+
+```jsx
+import { BiProvider } from "uikit/core";
+
+export default function App() {
+ return (
+
+
+
+ );
+}
+```
+
+---
+
+## Disable Remote UI setup in BiProvider
+
+اگر نمیخواهید `BiProvider` به صورت خودکار remote ui را setup کند:
+
+```jsx
+import { BiProvider } from "uikit/core";
+
+export default function App() {
+ return (
+
+
+
+ );
+}
```
---
@@ -210,6 +295,7 @@ import { api } from "uikit/core";
const response = await api.get("/users");
```
+
or
```js
@@ -303,6 +389,311 @@ function Page() {
---
+# Remote UI
+
+`remote/ui` برای کامپوننتهایی است که باید بدون build مجدد سامانه مقصد، از طریق فایل remote بهروزرسانی شوند.
+
+مثلاً `GBadge` از این مسیر استفاده میشود:
+
+```jsx
+import { GBadge } from "uikit/remote/ui";
+
+function Page() {
+ return (
+
+ فعال
+
+ );
+}
+```
+
+---
+
+## GBadge
+
+required dependencies:
+
+```bash
+yarn add @chakra-ui/react @emotion/react @emotion/styled framer-motion
+```
+
+using:
+
+```jsx
+import { GBadge } from "uikit/remote/ui";
+
+function Page({ item }) {
+ return (
+
+ {item}
+
+ );
+}
+```
+
+`GBadge` از Chakra `Badge` استفاده میکند.
+
+اما برای کم شدن حجم فایل remote، این موارد داخل `GBadge.js` bundle نمیشوند:
+
+```txt
+React
+ReactDOM
+Chakra
+Emotion
+theme
+Fonts
+font files
+```
+
+این موارد باید در سامانه مقصد وجود داشته باشند.
+
+---
+
+## GBadge with BiProvider
+
+اگر سامانه مقصد از `BiProvider` استفاده میکند، نیازی به setup دستی نیست:
+
+```jsx
+import { BiProvider } from "uikit/core";
+import { GBadge } from "uikit/remote/ui";
+
+function App() {
+ return (
+
+
+ فعال
+
+
+ );
+}
+```
+
+---
+
+## GBadge without BiProvider
+
+اگر سامانه مقصد از `BiProvider` استفاده نمیکند، دو حالت وجود دارد.
+
+### حالت ساده
+
+اگر theme خاصی ندارید، فقط استفاده از `GBadge` کافی است:
+
+```jsx
+import { GBadge } from "uikit/remote/ui";
+
+function Page() {
+ return (
+
+ فعال
+
+ );
+}
+```
+
+در این حالت wrapper مربوط به `GBadge` خودش dependencyهای لازم را setup میکند.
+
+---
+
+### حالت با theme اختصاصی
+
+اگر سامانه مقصد theme اختصاصی Chakra دارد، بهتر است در entry اصلی پروژه یک بار setup انجام شود.
+
+مثلاً در `main.jsx`، `App.jsx` یا `_app.jsx`:
+
+```jsx
+import React from "react";
+import { createRoot } from "react-dom/client";
+import { ChakraProvider } from "@chakra-ui/react";
+import { setupUikitRemoteDeps } from "uikit/remote/ui";
+import { theme } from "./theme";
+import App from "./App";
+
+setupUikitRemoteDeps({
+ theme,
+});
+
+createRoot(document.getElementById("root")).render(
+
+
+ ,
+);
+```
+
+برای Next.js:
+
+```jsx
+import { ChakraProvider } from "@chakra-ui/react";
+import { setupUikitRemoteDeps } from "uikit/remote/ui";
+import { theme } from "@/theme";
+
+setupUikitRemoteDeps({
+ theme,
+});
+
+export default function App({ Component, pageProps }) {
+ return (
+
+
+
+ );
+}
+```
+
+---
+
+## Remote URL without BiProvider
+
+اگر سامانه مقصد از `BiProvider` استفاده نمیکند و آدرس فایل remote متفاوت است:
+
+```jsx
+import { setupUikitRemoteDeps } from "uikit/remote/ui";
+import { theme } from "./theme";
+
+setupUikitRemoteDeps({
+ theme,
+ remoteUrl: "https://static.example.com/uikit/GBadge.js",
+});
+```
+
+یا مستقیم روی خود کامپوننت:
+
+```jsx
+import { GBadge } from "uikit/remote/ui";
+
+function Page() {
+ return (
+
+ فعال
+
+ );
+}
+```
+
+---
+
+## Font
+
+فونت داخل فایل remote باندل نمیشود.
+
+اگر سامانه مقصد از `BiProvider` استفاده میکند، فونت و theme اصلی از همان `BiProvider` میآید.
+
+اگر سامانه مقصد `BiProvider` ندارد، فونت را در خود سامانه مقصد ست کنید:
+
+```css
+@font-face {
+ font-family: Estedad;
+ src: url("/fonts/estedad.woff2") format("woff2");
+ font-weight: 400;
+ font-style: normal;
+ font-display: swap;
+}
+
+:root {
+ --uikit-font-family: Estedad, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+}
+
+body {
+ font-family: var(--uikit-font-family);
+}
+```
+
+`GBadge` از این مقدار استفاده میکند:
+
+```css
+var(--uikit-font-family, inherit)
+```
+
+---
+
+## Build Remote UI
+
+برای ساخت فایل remote:
+
+```bash
+yarn build:remote
+```
+
+خروجی remote:
+
+```txt
+dist/remote/GBadge.js
+```
+
+این فایل باید روی static server یا CDN داخلی deploy شود.
+
+مثلاً:
+
+```txt
+https://uikit.d.aiengines.ir/GBadge.js
+```
+
+---
+
+## Deploy Remote UI
+
+بعد از تغییر در `GBadge.remote.jsx` یا کامپوننتهای remote:
+
+```bash
+yarn build:remote
+```
+
+سپس فایل زیر را deploy کنید:
+
+```txt
+dist/remote/GBadge.js
+```
+
+سامانههای مقصد بعد از reload صفحه، نسخه جدید remote را دریافت میکنند.
+
+اگر cache سمت browser یا CDN فعال است، باید cache فایل remote کنترل شود.
+
+---
+
+## Important Notes
+
+اگر از مسیر زیر استفاده شود:
+
+```js
+import { GBadge } from "uikit/remote/ui";
+```
+
+خود کامپوننت از فایل remote استفاده میکند.
+
+اما اگر کامپوننتی از مسیر معمولی package import شود، مثل:
+
+```js
+import { SomeComponent } from "uikit";
+```
+
+یا:
+
+```js
+import { SomeComponent } from "uikit/table";
+```
+
+آن کامپوننت داخل build سامانه مقصد bundle میشود و برای آپدیت شدن نیاز به rebuild یا `yarn upgrade` دارد.
+
+پس:
+
+```txt
+uikit/remote/ui => update by remote file
+uikit/table => update by package upgrade
+uikit/core => update by package upgrade
+uikit/layout => update by package upgrade
+```
+
+---
+
# DataTable
required dependencies:
@@ -310,6 +701,7 @@ required dependencies:
```bash
yarn add @chakra-ui/react @emotion/react @emotion/styled framer-motion @tanstack/react-table react-icons
```
+
using:
```jsx
@@ -347,5 +739,3 @@ function UsersTable({ data, columns }) {
);
}
```
-
----