@comitor/ui 3.2.0 → 3.3.1
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/components/composite/confirm-dialog.js +35 -56
- package/dist/components/composite/confirm-dialog.js.map +1 -1
- package/dist/components/composite/toast.d.ts +1 -1
- package/dist/components/composite/toast.js +25 -18
- package/dist/components/composite/toast.js.map +1 -1
- package/dist/components/ui/action-bar.d.ts +20 -0
- package/dist/components/ui/action-bar.js +59 -8
- package/dist/components/ui/action-bar.js.map +1 -1
- package/dist/components/ui/alert-dialog.d.ts +1 -1
- package/dist/components/ui/alert-dialog.js +17 -3
- package/dist/components/ui/alert-dialog.js.map +1 -1
- package/dist/components/ui/dialog.d.ts +1 -1
- package/dist/components/ui/dialog.js +7 -0
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/sheet.d.ts +1 -1
- package/dist/components/ui/sheet.js +7 -0
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/sonner.d.ts +1 -1
- package/dist/components/ui/sonner.js +5 -1
- package/dist/components/ui/sonner.js.map +1 -1
- package/dist/data-grid/use-data-grid.d.ts +2 -2
- package/dist/i18n/namespaces/toast.d.ts +13 -4
- package/dist/i18n/namespaces/toast.js +10 -2
- package/dist/i18n/namespaces/toast.js.map +1 -1
- package/dist/lib/use-modal-return-focus.d.ts +39 -0
- package/dist/lib/use-modal-return-focus.js +66 -0
- package/dist/lib/use-modal-return-focus.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Chữ của `toastPromise`.
|
|
2
|
+
* Chữ của hai toaster (`Toaster` của entry chính, `SonnerToaster` của `/shell`) và của `toastPromise`.
|
|
3
3
|
*
|
|
4
4
|
* `toastPromise` là hàm THƯỜNG gọi từ event handler, ngoài lượt render — nó không tự đọc được
|
|
5
|
-
* `ComitorLocaleProvider`. Toaster (luôn nằm trong cây, dưới provider
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* `ComitorLocaleProvider`. Toaster (luôn nằm trong cây, dưới provider) ghi bảng này theo ngôn ngữ
|
|
6
|
+
* hiện hành cho nó dùng; xem `lib/toast-language.ts`.
|
|
7
|
+
*
|
|
8
|
+
* ⚠ Hai khoá `…AriaLabel` (3.3.0) thay hai chuỗi TIẾNG ANH CỨNG của sonner — thứ trước bản này là
|
|
9
|
+
* chữ tiếng Anh DUY NHẤT còn lại trên một trang tiếng Việt đã đặt provider (đo trên comitor-account):
|
|
10
|
+
* · `containerAriaLabel` — tên vùng toast (`<section aria-label>`), chỗ trình đọc màn hình nhảy tới
|
|
11
|
+
* bằng phím tắt. Sonner TỰ NỐI phím tắt vào sau ("Thông báo alt+T"), nên ở đây chỉ có phần chữ.
|
|
12
|
+
* · `closeButtonAriaLabel` — tên nút × trên từng toast, chỉ hiện khi app bật `closeButton`.
|
|
8
13
|
*/
|
|
9
14
|
interface ToastMessages {
|
|
10
15
|
/** Chữ của toast lúc Promise còn chạy — `messages.loading` của `toastPromise` */
|
|
11
16
|
loading: string;
|
|
17
|
+
/** Tên vùng chứa toast cho trình đọc màn hình — prop `containerAriaLabel` của sonner */
|
|
18
|
+
containerAriaLabel: string;
|
|
19
|
+
/** Tên nút đóng trên mỗi toast — `toastOptions.closeButtonAriaLabel` của sonner */
|
|
20
|
+
closeButtonAriaLabel: string;
|
|
12
21
|
}
|
|
13
22
|
declare const toastEn: ToastMessages;
|
|
14
23
|
declare const toastVi: ToastMessages;
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
const toastEn = {
|
|
2
|
-
|
|
1
|
+
const toastEn = {
|
|
2
|
+
loading: "Working\u2026",
|
|
3
|
+
containerAriaLabel: "Notifications",
|
|
4
|
+
closeButtonAriaLabel: "Close notification"
|
|
5
|
+
};
|
|
6
|
+
const toastVi = {
|
|
7
|
+
loading: "\u0110ang x\u1EED l\xFD\u2026",
|
|
8
|
+
containerAriaLabel: "Th\xF4ng b\xE1o",
|
|
9
|
+
closeButtonAriaLabel: "\u0110\xF3ng th\xF4ng b\xE1o"
|
|
10
|
+
};
|
|
3
11
|
export {
|
|
4
12
|
toastEn,
|
|
5
13
|
toastVi
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/i18n/namespaces/toast.ts"],"sourcesContent":["/**\n * Chữ của `toastPromise`.\n *\n * `toastPromise` là hàm THƯỜNG gọi từ event handler, ngoài lượt render — nó không tự đọc được\n * `ComitorLocaleProvider`. Toaster (luôn nằm trong cây, dưới provider
|
|
1
|
+
{"version":3,"sources":["../../../src/i18n/namespaces/toast.ts"],"sourcesContent":["/**\n * Chữ của hai toaster (`Toaster` của entry chính, `SonnerToaster` của `/shell`) và của `toastPromise`.\n *\n * `toastPromise` là hàm THƯỜNG gọi từ event handler, ngoài lượt render — nó không tự đọc được\n * `ComitorLocaleProvider`. Toaster (luôn nằm trong cây, dưới provider) ghi bảng này theo ngôn ngữ\n * hiện hành cho nó dùng; xem `lib/toast-language.ts`.\n *\n * ⚠ Hai khoá `…AriaLabel` (3.3.0) thay hai chuỗi TIẾNG ANH CỨNG của sonner — thứ trước bản này là\n * chữ tiếng Anh DUY NHẤT còn lại trên một trang tiếng Việt đã đặt provider (đo trên comitor-account):\n * · `containerAriaLabel` — tên vùng toast (`<section aria-label>`), chỗ trình đọc màn hình nhảy tới\n * bằng phím tắt. Sonner TỰ NỐI phím tắt vào sau (\"Thông báo alt+T\"), nên ở đây chỉ có phần chữ.\n * · `closeButtonAriaLabel` — tên nút × trên từng toast, chỉ hiện khi app bật `closeButton`.\n */\nexport interface ToastMessages {\n /** Chữ của toast lúc Promise còn chạy — `messages.loading` của `toastPromise` */\n loading: string;\n /** Tên vùng chứa toast cho trình đọc màn hình — prop `containerAriaLabel` của sonner */\n containerAriaLabel: string;\n /** Tên nút đóng trên mỗi toast — `toastOptions.closeButtonAriaLabel` của sonner */\n closeButtonAriaLabel: string;\n}\n\nexport const toastEn: ToastMessages = {\n loading: \"Working…\",\n containerAriaLabel: \"Notifications\",\n closeButtonAriaLabel: \"Close notification\"\n};\n\nexport const toastVi: ToastMessages = {\n loading: \"Đang xử lý…\",\n containerAriaLabel: \"Thông báo\",\n closeButtonAriaLabel: \"Đóng thông báo\"\n};\n"],"mappings":"AAsBO,MAAM,UAAyB;AAAA,EACpC,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,sBAAsB;AACxB;AAEO,MAAM,UAAyB;AAAA,EACpC,SAAS;AAAA,EACT,oBAAoB;AAAA,EACpB,sBAAsB;AACxB;","names":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* TRẢ FOCUS khi một lớp modal của Radix (`Dialog`, `Sheet`, `AlertDialog`) đóng mà nó được mở KHÔNG
|
|
5
|
+
* qua Trigger — nội bộ, không nằm trong barrel nào.
|
|
6
|
+
*
|
|
7
|
+
* Radix chỉ trả focus về Trigger: handler `onCloseAutoFocus` của chính nó chặn mặc định của
|
|
8
|
+
* `FocusScope` rồi gọi `triggerRef.current?.focus()` — thiếu Trigger là focus vào `null`. Mà mở bằng
|
|
9
|
+
* `open` từ một mục menu, một dòng bảng, một `ActionBar` hay một phím tắt là cách hộp thoại được dùng
|
|
10
|
+
* nhiều nhất trong app thật: đóng xong (Escape, nút ×, nút Huỷ) là focus rơi xuống `<body>`, Tab kế
|
|
11
|
+
* tiếp chạy lại từ đầu trang (WCAG 2.4.3).
|
|
12
|
+
*
|
|
13
|
+
* Luật — ai thắng khi nhiều bên cùng muốn đưa focus đi:
|
|
14
|
+
* 1. App: handler `onCloseAutoFocus` của app chạy TRƯỚC; app gọi `preventDefault()` là app nhận việc
|
|
15
|
+
* (Radix cũng bỏ qua Trigger), gói không làm gì thêm.
|
|
16
|
+
* 2. Radix: handler của nó chạy ngay SAU handler này và trả focus về Trigger nếu có — nên phép kiểm
|
|
17
|
+
* của gói đợi qua một microtask để Radix đi trước.
|
|
18
|
+
* 3. Gói: chỉ khi focus THẬT SỰ đã rơi (`<body>`) mới trả về phần tử giữ focus ngay trước khi lớp
|
|
19
|
+
* mở. Phần tử đó đã bị gỡ khỏi DOM (dòng vừa xoá) thì gói không đoán.
|
|
20
|
+
*
|
|
21
|
+
* Ghi phần tử mở ở HAI chỗ (3.3.1):
|
|
22
|
+
* · `recorder` — phần tử trả về, component gọi đặt nó làm con ĐẦU TIÊN của `…Primitive.Content`.
|
|
23
|
+
* Ghi sớm nhất, trước cả `autoFocus` của con — lý do ở `ReturnFocusRecorder`. Chỉ ghi nếu chu kỳ
|
|
24
|
+
* mở này chưa ghi gì: StrictMode được phép chạy lại effect của cùng một lần mount, và lần chạy
|
|
25
|
+
* lại ấy thấy focus đã ở ô con.
|
|
26
|
+
* · `onOpenAutoFocus` — Radix chỉ gọi khi focus còn NGOÀI lớp, nên giá trị lúc đó luôn đúng và luôn
|
|
27
|
+
* ĐÈ lên. Nó là đường duy nhất cho nội dung `forceMount` (mount một lần, không mount lại khi mở —
|
|
28
|
+
* nơi gọi không đặt `recorder` cho ca đó).
|
|
29
|
+
* Chu kỳ khép lại ở `onCloseAutoFocus`.
|
|
30
|
+
*/
|
|
31
|
+
declare function useModalReturnFocus<E extends Event>(onOpenAutoFocusProp: ((event: E) => void) | undefined, onCloseAutoFocusProp: ((event: E) => void) | undefined): {
|
|
32
|
+
onOpenAutoFocus: (event: E) => void;
|
|
33
|
+
onCloseAutoFocus: (event: E) => void;
|
|
34
|
+
recorder: React.FunctionComponentElement<{
|
|
35
|
+
record: () => void;
|
|
36
|
+
}>;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export { useModalReturnFocus };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
function returnTargetFrom(active) {
|
|
3
|
+
let current = active;
|
|
4
|
+
for (let depth = 0; depth < 5; depth++) {
|
|
5
|
+
if (!(current instanceof HTMLElement) || current === current.ownerDocument.body) return null;
|
|
6
|
+
const menu = current.closest('[role="menu"]');
|
|
7
|
+
if (!menu) return current;
|
|
8
|
+
const ownerDocument = menu.ownerDocument;
|
|
9
|
+
const labelledBy = menu.getAttribute("aria-labelledby");
|
|
10
|
+
const byLabel = labelledBy ? ownerDocument.getElementById(labelledBy) : null;
|
|
11
|
+
const byControls = menu.id ? ownerDocument.querySelector(`[aria-controls="${CSS.escape(menu.id)}"]`) : null;
|
|
12
|
+
const opener = byLabel ?? byControls;
|
|
13
|
+
if (!opener) return current;
|
|
14
|
+
current = opener;
|
|
15
|
+
}
|
|
16
|
+
return current instanceof HTMLElement ? current : null;
|
|
17
|
+
}
|
|
18
|
+
function ReturnFocusRecorder({ record }) {
|
|
19
|
+
React.useInsertionEffect(() => {
|
|
20
|
+
record();
|
|
21
|
+
}, [record]);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
function useModalReturnFocus(onOpenAutoFocusProp, onCloseAutoFocusProp) {
|
|
25
|
+
const returnFocusRef = React.useRef(null);
|
|
26
|
+
const recordedRef = React.useRef(false);
|
|
27
|
+
const recordOnMount = React.useCallback(() => {
|
|
28
|
+
if (recordedRef.current) return;
|
|
29
|
+
recordedRef.current = true;
|
|
30
|
+
returnFocusRef.current = returnTargetFrom(document.activeElement);
|
|
31
|
+
}, []);
|
|
32
|
+
const onOpenAutoFocus = React.useCallback(
|
|
33
|
+
(event) => {
|
|
34
|
+
recordedRef.current = true;
|
|
35
|
+
returnFocusRef.current = returnTargetFrom(document.activeElement);
|
|
36
|
+
onOpenAutoFocusProp?.(event);
|
|
37
|
+
},
|
|
38
|
+
[onOpenAutoFocusProp]
|
|
39
|
+
);
|
|
40
|
+
const onCloseAutoFocus = React.useCallback(
|
|
41
|
+
(event) => {
|
|
42
|
+
onCloseAutoFocusProp?.(event);
|
|
43
|
+
const target = returnFocusRef.current;
|
|
44
|
+
returnFocusRef.current = null;
|
|
45
|
+
recordedRef.current = false;
|
|
46
|
+
if (event.defaultPrevented) return;
|
|
47
|
+
queueMicrotask(() => {
|
|
48
|
+
const ownerDocument = target?.ownerDocument ?? document;
|
|
49
|
+
const active = ownerDocument.activeElement;
|
|
50
|
+
if (active && active !== ownerDocument.body) return;
|
|
51
|
+
if (!target?.isConnected) return;
|
|
52
|
+
target.focus({ preventScroll: true });
|
|
53
|
+
});
|
|
54
|
+
},
|
|
55
|
+
[onCloseAutoFocusProp]
|
|
56
|
+
);
|
|
57
|
+
const recorder = React.useMemo(
|
|
58
|
+
() => React.createElement(ReturnFocusRecorder, { record: recordOnMount }),
|
|
59
|
+
[recordOnMount]
|
|
60
|
+
);
|
|
61
|
+
return { onOpenAutoFocus, onCloseAutoFocus, recorder };
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
useModalReturnFocus
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=use-modal-return-focus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/use-modal-return-focus.ts"],"sourcesContent":["import * as React from \"react\";\n\n/**\n * Phần tử để trả focus về: phần tử đang giữ focus lúc lớp mở — TRỪ khi nó nằm trong một MENU.\n *\n * Mở hộp thoại từ một mục `DropdownMenu` (\"Đổi vai trò…\" trên dòng bảng) là ca phổ biến nhất, và\n * lúc hộp thoại lấy focus thì phần tử đang giữ focus là chính MỤC MENU — thứ bị gỡ cùng menu ngay\n * sau đó. Ghi nó lại là trả về một phần tử đã chết, tức lại rơi xuống `<body>` (đo được trước khi\n * có nhánh này). Người dùng \"đứng\" ở NÚT MỞ menu: Radix nối nó vào nội dung menu bằng\n * `aria-labelledby` (id của nút), và nút trỏ lại bằng `aria-controls` (id của nội dung) — tra cả hai,\n * vì app đặt `id` riêng cho nút mở thì `aria-labelledby` trỏ vào một id không còn tồn tại.\n * Menu con: lặp lên tới menu gốc (nút mở menu con cũng bị gỡ theo).\n */\nfunction returnTargetFrom(active: Element | null): HTMLElement | null {\n let current = active;\n for (let depth = 0; depth < 5; depth++) {\n if (!(current instanceof HTMLElement) || current === current.ownerDocument.body) return null;\n const menu = current.closest<HTMLElement>('[role=\"menu\"]');\n if (!menu) return current;\n\n const ownerDocument = menu.ownerDocument;\n const labelledBy = menu.getAttribute(\"aria-labelledby\");\n const byLabel = labelledBy ? ownerDocument.getElementById(labelledBy) : null;\n const byControls = menu.id ? ownerDocument.querySelector(`[aria-controls=\"${CSS.escape(menu.id)}\"]`) : null;\n const opener = byLabel ?? byControls;\n // Không tìm ra nút mở (menu không phải của Radix): trả về chính phần tử — lúc đóng, nó đã bị gỡ\n // thì gói không đoán, như mọi ca khác.\n if (!opener) return current;\n current = opener;\n }\n return current instanceof HTMLElement ? current : null;\n}\n\n/**\n * Ghi phần tử mở NGAY LÚC nội dung lớp được gắn vào cây — trước mọi `autoFocus` của con.\n *\n * ── Vì sao không đủ nếu chỉ ghi ở `onOpenAutoFocus` (cách của 3.3.0) ─────────────────────\n * Ô con có `autoFocus` được React focus trong `commitMount` — pha LAYOUT của chính lần commit gắn\n * nội dung — TRƯỚC effect của `FocusScope`. Tới lượt `FocusScope`, focus đã nằm trong lớp, và Radix\n * BỎ QUA hẳn sự kiện auto-focus lúc mount (`container.contains(previouslyFocusedElement)`) — tức\n * `onOpenAutoFocus` không bao giờ được gọi, gói không biết ai đã mở lớp, và đóng xong focus rơi\n * xuống `<body>`. Đo được ở comitor-account bằng log `focus()`: focusin nút mở → `INPUT.focus()` từ\n * `commitMount` → lúc đóng không có lời gọi `focus()` nào. Chín hộp thoại của app đó dính.\n *\n * `useInsertionEffect` chạy ở pha MUTATION, và React chạy insertion effect của CẢ cây trước khi pha\n * layout bắt đầu — nên nó đứng trước `autoFocus` của bất kỳ con nào, bất kể con nằm ở đâu trong cây.\n * Không cần ref nào (ref chưa gắn ở pha này), chỉ đọc `document.activeElement`.\n *\n * Component này phải đứng TRONG nội dung (`…Primitive.Content`), không đứng ở vỏ `DialogContent`:\n * vỏ mount một lần khi app render `<Dialog>` đang ĐÓNG, còn nội dung mount lại ở MỖI lần mở.\n */\nfunction ReturnFocusRecorder({ record }: { record: () => void }) {\n React.useInsertionEffect(() => {\n record();\n }, [record]);\n return null;\n}\n\n/**\n * TRẢ FOCUS khi một lớp modal của Radix (`Dialog`, `Sheet`, `AlertDialog`) đóng mà nó được mở KHÔNG\n * qua Trigger — nội bộ, không nằm trong barrel nào.\n *\n * Radix chỉ trả focus về Trigger: handler `onCloseAutoFocus` của chính nó chặn mặc định của\n * `FocusScope` rồi gọi `triggerRef.current?.focus()` — thiếu Trigger là focus vào `null`. Mà mở bằng\n * `open` từ một mục menu, một dòng bảng, một `ActionBar` hay một phím tắt là cách hộp thoại được dùng\n * nhiều nhất trong app thật: đóng xong (Escape, nút ×, nút Huỷ) là focus rơi xuống `<body>`, Tab kế\n * tiếp chạy lại từ đầu trang (WCAG 2.4.3).\n *\n * Luật — ai thắng khi nhiều bên cùng muốn đưa focus đi:\n * 1. App: handler `onCloseAutoFocus` của app chạy TRƯỚC; app gọi `preventDefault()` là app nhận việc\n * (Radix cũng bỏ qua Trigger), gói không làm gì thêm.\n * 2. Radix: handler của nó chạy ngay SAU handler này và trả focus về Trigger nếu có — nên phép kiểm\n * của gói đợi qua một microtask để Radix đi trước.\n * 3. Gói: chỉ khi focus THẬT SỰ đã rơi (`<body>`) mới trả về phần tử giữ focus ngay trước khi lớp\n * mở. Phần tử đó đã bị gỡ khỏi DOM (dòng vừa xoá) thì gói không đoán.\n *\n * Ghi phần tử mở ở HAI chỗ (3.3.1):\n * · `recorder` — phần tử trả về, component gọi đặt nó làm con ĐẦU TIÊN của `…Primitive.Content`.\n * Ghi sớm nhất, trước cả `autoFocus` của con — lý do ở `ReturnFocusRecorder`. Chỉ ghi nếu chu kỳ\n * mở này chưa ghi gì: StrictMode được phép chạy lại effect của cùng một lần mount, và lần chạy\n * lại ấy thấy focus đã ở ô con.\n * · `onOpenAutoFocus` — Radix chỉ gọi khi focus còn NGOÀI lớp, nên giá trị lúc đó luôn đúng và luôn\n * ĐÈ lên. Nó là đường duy nhất cho nội dung `forceMount` (mount một lần, không mount lại khi mở —\n * nơi gọi không đặt `recorder` cho ca đó).\n * Chu kỳ khép lại ở `onCloseAutoFocus`.\n */\nexport function useModalReturnFocus<E extends Event>(\n onOpenAutoFocusProp: ((event: E) => void) | undefined,\n onCloseAutoFocusProp: ((event: E) => void) | undefined\n) {\n const returnFocusRef = React.useRef<HTMLElement | null>(null);\n const recordedRef = React.useRef(false);\n\n const recordOnMount = React.useCallback(() => {\n if (recordedRef.current) return;\n recordedRef.current = true;\n returnFocusRef.current = returnTargetFrom(document.activeElement);\n }, []);\n\n const onOpenAutoFocus = React.useCallback(\n (event: E) => {\n // Chạy TRƯỚC khi Radix đưa focus vào lớp: phần tử đang giữ focus là nơi người dùng đứng.\n recordedRef.current = true;\n returnFocusRef.current = returnTargetFrom(document.activeElement);\n onOpenAutoFocusProp?.(event);\n },\n [onOpenAutoFocusProp]\n );\n\n const onCloseAutoFocus = React.useCallback(\n (event: E) => {\n onCloseAutoFocusProp?.(event);\n const target = returnFocusRef.current;\n returnFocusRef.current = null;\n recordedRef.current = false;\n if (event.defaultPrevented) return;\n\n queueMicrotask(() => {\n const ownerDocument = target?.ownerDocument ?? document;\n const active = ownerDocument.activeElement;\n if (active && active !== ownerDocument.body) return;\n if (!target?.isConnected) return;\n target.focus({ preventScroll: true });\n });\n },\n [onCloseAutoFocusProp]\n );\n\n const recorder = React.useMemo(\n () => React.createElement(ReturnFocusRecorder, { record: recordOnMount }),\n [recordOnMount]\n );\n\n return { onOpenAutoFocus, onCloseAutoFocus, recorder };\n}\n"],"mappings":"AAAA,YAAY,WAAW;AAavB,SAAS,iBAAiB,QAA4C;AACpE,MAAI,UAAU;AACd,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,QAAI,EAAE,mBAAmB,gBAAgB,YAAY,QAAQ,cAAc,KAAM,QAAO;AACxF,UAAM,OAAO,QAAQ,QAAqB,eAAe;AACzD,QAAI,CAAC,KAAM,QAAO;AAElB,UAAM,gBAAgB,KAAK;AAC3B,UAAM,aAAa,KAAK,aAAa,iBAAiB;AACtD,UAAM,UAAU,aAAa,cAAc,eAAe,UAAU,IAAI;AACxE,UAAM,aAAa,KAAK,KAAK,cAAc,cAAc,mBAAmB,IAAI,OAAO,KAAK,EAAE,CAAC,IAAI,IAAI;AACvG,UAAM,SAAS,WAAW;AAG1B,QAAI,CAAC,OAAQ,QAAO;AACpB,cAAU;AAAA,EACZ;AACA,SAAO,mBAAmB,cAAc,UAAU;AACpD;AAoBA,SAAS,oBAAoB,EAAE,OAAO,GAA2B;AAC/D,QAAM,mBAAmB,MAAM;AAC7B,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,CAAC;AACX,SAAO;AACT;AA8BO,SAAS,oBACd,qBACA,sBACA;AACA,QAAM,iBAAiB,MAAM,OAA2B,IAAI;AAC5D,QAAM,cAAc,MAAM,OAAO,KAAK;AAEtC,QAAM,gBAAgB,MAAM,YAAY,MAAM;AAC5C,QAAI,YAAY,QAAS;AACzB,gBAAY,UAAU;AACtB,mBAAe,UAAU,iBAAiB,SAAS,aAAa;AAAA,EAClE,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,UAAa;AAEZ,kBAAY,UAAU;AACtB,qBAAe,UAAU,iBAAiB,SAAS,aAAa;AAChE,4BAAsB,KAAK;AAAA,IAC7B;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,mBAAmB,MAAM;AAAA,IAC7B,CAAC,UAAa;AACZ,6BAAuB,KAAK;AAC5B,YAAM,SAAS,eAAe;AAC9B,qBAAe,UAAU;AACzB,kBAAY,UAAU;AACtB,UAAI,MAAM,iBAAkB;AAE5B,qBAAe,MAAM;AACnB,cAAM,gBAAgB,QAAQ,iBAAiB;AAC/C,cAAM,SAAS,cAAc;AAC7B,YAAI,UAAU,WAAW,cAAc,KAAM;AAC7C,YAAI,CAAC,QAAQ,YAAa;AAC1B,eAAO,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,IACA,CAAC,oBAAoB;AAAA,EACvB;AAEA,QAAM,WAAW,MAAM;AAAA,IACrB,MAAM,MAAM,cAAc,qBAAqB,EAAE,QAAQ,cAAc,CAAC;AAAA,IACxE,CAAC,aAAa;AAAA,EAChB;AAEA,SAAO,EAAE,iBAAiB,kBAAkB,SAAS;AACvD;","names":[]}
|
package/package.json
CHANGED