@comitor/ui 1.11.0 → 2.1.0
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/LICENSE +35 -0
- package/README.md +23 -7
- package/dist/components/ui/action-bar-constants.d.ts +31 -0
- package/dist/components/ui/action-bar-constants.js +9 -0
- package/dist/components/ui/action-bar-constants.js.map +1 -0
- package/dist/components/ui/action-bar.d.ts +67 -0
- package/dist/components/ui/action-bar.js +522 -0
- package/dist/components/ui/action-bar.js.map +1 -0
- package/dist/components/ui/badge-overflow.d.ts +30 -0
- package/dist/components/ui/badge-overflow.js +179 -0
- package/dist/components/ui/badge-overflow.js.map +1 -0
- package/dist/components/ui/banner.d.ts +79 -0
- package/dist/components/ui/banner.js +518 -0
- package/dist/components/ui/banner.js.map +1 -0
- package/dist/components/ui/circular-progress.d.ts +50 -0
- package/dist/components/ui/circular-progress.js +266 -0
- package/dist/components/ui/circular-progress.js.map +1 -0
- package/dist/components/ui/cropper-constants.d.ts +34 -0
- package/dist/components/ui/cropper-constants.js +10 -0
- package/dist/components/ui/cropper-constants.js.map +1 -0
- package/dist/components/ui/cropper.d.ts +106 -0
- package/dist/components/ui/cropper.js +1269 -0
- package/dist/components/ui/cropper.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +1 -1
- package/dist/components/ui/drawer.js +2 -2
- package/dist/components/ui/drawer.js.map +1 -1
- package/dist/components/ui/kanban-constants.d.ts +61 -0
- package/dist/components/ui/kanban-constants.js +21 -0
- package/dist/components/ui/kanban-constants.js.map +1 -0
- package/dist/components/ui/kanban.d.ts +72 -0
- package/dist/components/ui/kanban.js +787 -0
- package/dist/components/ui/kanban.js.map +1 -0
- package/dist/components/ui/key-value-constants.d.ts +33 -0
- package/dist/components/ui/key-value-constants.js +11 -0
- package/dist/components/ui/key-value-constants.js.map +1 -0
- package/dist/components/ui/key-value.d.ts +96 -0
- package/dist/components/ui/key-value.js +641 -0
- package/dist/components/ui/key-value.js.map +1 -0
- package/dist/components/ui/mask-input-constants.d.ts +99 -0
- package/dist/components/ui/mask-input-constants.js +601 -0
- package/dist/components/ui/mask-input-constants.js.map +1 -0
- package/dist/components/ui/mask-input.d.ts +36 -0
- package/dist/components/ui/mask-input.js +558 -0
- package/dist/components/ui/mask-input.js.map +1 -0
- package/dist/components/ui/mention.d.ts +31 -0
- package/dist/components/ui/mention.js +128 -0
- package/dist/components/ui/mention.js.map +1 -0
- package/dist/components/ui/phone-input-constants.d.ts +54 -0
- package/dist/components/ui/phone-input-constants.js +9 -0
- package/dist/components/ui/phone-input-constants.js.map +1 -0
- package/dist/components/ui/phone-input.d.ts +85 -0
- package/dist/components/ui/phone-input.js +743 -0
- package/dist/components/ui/phone-input.js.map +1 -0
- package/dist/components/ui/rating.d.ts +56 -0
- package/dist/components/ui/rating.js +646 -0
- package/dist/components/ui/rating.js.map +1 -0
- package/dist/components/ui/responsive-dialog.d.ts +35 -0
- package/dist/components/ui/responsive-dialog.js +193 -0
- package/dist/components/ui/responsive-dialog.js.map +1 -0
- package/dist/components/ui/scroll-spy.d.ts +42 -0
- package/dist/components/ui/scroll-spy.js +334 -0
- package/dist/components/ui/scroll-spy.js.map +1 -0
- package/dist/components/ui/stepper-constants.d.ts +29 -0
- package/dist/components/ui/stepper-constants.js +9 -0
- package/dist/components/ui/stepper-constants.js.map +1 -0
- package/dist/components/ui/stepper.d.ts +80 -0
- package/dist/components/ui/stepper.js +902 -0
- package/dist/components/ui/stepper.js.map +1 -0
- package/dist/components/ui/tags-input.d.ts +41 -0
- package/dist/components/ui/tags-input.js +127 -0
- package/dist/components/ui/tags-input.js.map +1 -0
- package/dist/components/ui/time-picker-constants.d.ts +48 -0
- package/dist/components/ui/time-picker-constants.js +14 -0
- package/dist/components/ui/time-picker-constants.js.map +1 -0
- package/dist/components/ui/time-picker.d.ts +115 -0
- package/dist/components/ui/time-picker.js +1620 -0
- package/dist/components/ui/time-picker.js.map +1 -0
- package/dist/components/ui/timeline.d.ts +32 -0
- package/dist/components/ui/timeline.js +559 -0
- package/dist/components/ui/timeline.js.map +1 -0
- package/dist/components/ui/tour-constants.d.ts +39 -0
- package/dist/components/ui/tour-constants.js +12 -0
- package/dist/components/ui/tour-constants.js.map +1 -0
- package/dist/components/ui/tour.d.ts +124 -0
- package/dist/components/ui/tour.js +1207 -0
- package/dist/components/ui/tour.js.map +1 -0
- package/dist/data-grid/data-grid-cell-variants.js +10 -6
- package/dist/data-grid/data-grid-cell-variants.js.map +1 -1
- package/dist/data-grid/data-grid-cell-wrapper.js +1 -1
- package/dist/data-grid/data-grid-cell-wrapper.js.map +1 -1
- package/dist/data-grid/data-grid-column-header.js +4 -2
- package/dist/data-grid/data-grid-column-header.js.map +1 -1
- package/dist/data-grid/data-grid-context-menu.js +5 -4
- package/dist/data-grid/data-grid-context-menu.js.map +1 -1
- package/dist/data-grid/data-grid-filter-menu.d.ts +12 -1
- package/dist/data-grid/data-grid-filter-menu.js +28 -17
- package/dist/data-grid/data-grid-filter-menu.js.map +1 -1
- package/dist/data-grid/data-grid-keyboard-shortcuts.d.ts +12 -1
- package/dist/data-grid/data-grid-keyboard-shortcuts.js +7 -5
- package/dist/data-grid/data-grid-keyboard-shortcuts.js.map +1 -1
- package/dist/data-grid/data-grid-locale.d.ts +24 -0
- package/dist/data-grid/data-grid-locale.js +25 -0
- package/dist/data-grid/data-grid-locale.js.map +1 -0
- package/dist/data-grid/data-grid-paste-dialog.js +3 -2
- package/dist/data-grid/data-grid-paste-dialog.js.map +1 -1
- package/dist/data-grid/data-grid-row-height-menu.d.ts +11 -1
- package/dist/data-grid/data-grid-row-height-menu.js +25 -28
- package/dist/data-grid/data-grid-row-height-menu.js.map +1 -1
- package/dist/data-grid/data-grid-row.js +1 -1
- package/dist/data-grid/data-grid-row.js.map +1 -1
- package/dist/data-grid/data-grid-search.js +6 -5
- package/dist/data-grid/data-grid-search.js.map +1 -1
- package/dist/data-grid/data-grid-select-column.js +3 -1
- package/dist/data-grid/data-grid-select-column.js.map +1 -1
- package/dist/data-grid/data-grid-sort-menu.d.ts +12 -1
- package/dist/data-grid/data-grid-sort-menu.js +25 -13
- package/dist/data-grid/data-grid-sort-menu.js.map +1 -1
- package/dist/data-grid/data-grid-view-menu.d.ts +12 -1
- package/dist/data-grid/data-grid-view-menu.js +12 -4
- package/dist/data-grid/data-grid-view-menu.js.map +1 -1
- package/dist/data-grid/data-grid.d.ts +14 -2
- package/dist/data-grid/data-grid.js +7 -4
- package/dist/data-grid/data-grid.js.map +1 -1
- package/dist/data-grid/filters.d.ts +17 -21
- package/dist/data-grid/filters.js +73 -52
- package/dist/data-grid/filters.js.map +1 -1
- package/dist/data-grid/index.d.ts +4 -1
- package/dist/data-grid/index.js +20 -2
- package/dist/data-grid/index.js.map +1 -1
- package/dist/data-grid/messages-en.d.ts +294 -0
- package/dist/data-grid/messages-en.js +279 -0
- package/dist/data-grid/messages-en.js.map +1 -0
- package/dist/data-grid/messages-vi.d.ts +12 -0
- package/dist/data-grid/messages-vi.js +279 -0
- package/dist/data-grid/messages-vi.js.map +1 -0
- package/dist/data-grid/messages.d.ts +549 -262
- package/dist/data-grid/messages.js +16 -275
- package/dist/data-grid/messages.js.map +1 -1
- package/dist/data-grid/sortable.js +1 -1
- package/dist/data-grid/sortable.js.map +1 -1
- package/dist/data-grid/use-data-grid-undo-redo.d.ts +13 -1
- package/dist/data-grid/use-data-grid-undo-redo.js +13 -10
- package/dist/data-grid/use-data-grid-undo-redo.js.map +1 -1
- package/dist/data-grid/use-data-grid.d.ts +281 -1
- package/dist/data-grid/use-data-grid.js +24 -19
- package/dist/data-grid/use-data-grid.js.map +1 -1
- package/dist/data-grid/utils.d.ts +9 -1
- package/dist/data-grid/utils.js +3 -2
- package/dist/data-grid/utils.js.map +1 -1
- package/dist/index.d.ts +31 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/compose-refs.js.map +1 -0
- package/dist/lib/use-as-ref.js.map +1 -0
- package/dist/lib/use-is-mobile.d.ts +10 -0
- package/dist/lib/use-is-mobile.js +21 -0
- package/dist/lib/use-is-mobile.js.map +1 -0
- package/dist/lib/use-isomorphic-layout-effect.js.map +1 -0
- package/dist/lib/use-lazy-ref.js.map +1 -0
- package/dist/lib/visually-hidden-input.d.ts +12 -0
- package/dist/lib/visually-hidden-input.js +105 -0
- package/dist/lib/visually-hidden-input.js.map +1 -0
- package/package.json +5 -1
- package/styles.css +19 -0
- package/dist/data-grid/compose-refs.js.map +0 -1
- package/dist/data-grid/use-as-ref.js.map +0 -1
- package/dist/data-grid/use-isomorphic-layout-effect.js.map +0 -1
- package/dist/data-grid/use-lazy-ref.js.map +0 -1
- /package/dist/{data-grid → lib}/compose-refs.d.ts +0 -0
- /package/dist/{data-grid → lib}/compose-refs.js +0 -0
- /package/dist/{data-grid → lib}/use-as-ref.d.ts +0 -0
- /package/dist/{data-grid → lib}/use-as-ref.js +0 -0
- /package/dist/{data-grid → lib}/use-isomorphic-layout-effect.d.ts +0 -0
- /package/dist/{data-grid → lib}/use-isomorphic-layout-effect.js +0 -0
- /package/dist/{data-grid → lib}/use-lazy-ref.d.ts +0 -0
- /package/dist/{data-grid → lib}/use-lazy-ref.js +0 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
function VisuallyHiddenInput(props) {
|
|
5
|
+
const { control, value, checked, bubbles = true, type = "hidden", style, ...inputProps } = props;
|
|
6
|
+
const isCheckInput = React.useMemo(() => type === "checkbox" || type === "radio" || type === "switch", [type]);
|
|
7
|
+
const inputRef = React.useRef(null);
|
|
8
|
+
const prevValueRef = React.useRef({
|
|
9
|
+
value: isCheckInput ? checked : value,
|
|
10
|
+
previous: isCheckInput ? checked : value
|
|
11
|
+
});
|
|
12
|
+
const prevValue = React.useMemo(() => {
|
|
13
|
+
const currentValue = isCheckInput ? checked : value;
|
|
14
|
+
if (prevValueRef.current.value !== currentValue) {
|
|
15
|
+
prevValueRef.current.previous = prevValueRef.current.value;
|
|
16
|
+
prevValueRef.current.value = currentValue;
|
|
17
|
+
}
|
|
18
|
+
return prevValueRef.current.previous;
|
|
19
|
+
}, [isCheckInput, value, checked]);
|
|
20
|
+
const [controlSize, setControlSize] = React.useState({});
|
|
21
|
+
React.useLayoutEffect(() => {
|
|
22
|
+
if (!control) {
|
|
23
|
+
setControlSize({});
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
setControlSize({
|
|
27
|
+
width: control.offsetWidth,
|
|
28
|
+
height: control.offsetHeight
|
|
29
|
+
});
|
|
30
|
+
if (typeof window === "undefined") return;
|
|
31
|
+
const resizeObserver = new ResizeObserver((entries) => {
|
|
32
|
+
if (!Array.isArray(entries) || !entries.length) return;
|
|
33
|
+
const entry = entries[0];
|
|
34
|
+
if (!entry) return;
|
|
35
|
+
let width;
|
|
36
|
+
let height;
|
|
37
|
+
if ("borderBoxSize" in entry) {
|
|
38
|
+
const borderSizeEntry = entry.borderBoxSize;
|
|
39
|
+
const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;
|
|
40
|
+
width = borderSize.inlineSize;
|
|
41
|
+
height = borderSize.blockSize;
|
|
42
|
+
} else {
|
|
43
|
+
width = control.offsetWidth;
|
|
44
|
+
height = control.offsetHeight;
|
|
45
|
+
}
|
|
46
|
+
setControlSize({ width, height });
|
|
47
|
+
});
|
|
48
|
+
resizeObserver.observe(control, { box: "border-box" });
|
|
49
|
+
return () => {
|
|
50
|
+
resizeObserver.disconnect();
|
|
51
|
+
};
|
|
52
|
+
}, [control]);
|
|
53
|
+
React.useEffect(() => {
|
|
54
|
+
const input = inputRef.current;
|
|
55
|
+
if (!input) return;
|
|
56
|
+
const inputProto = window.HTMLInputElement.prototype;
|
|
57
|
+
const propertyKey = isCheckInput ? "checked" : "value";
|
|
58
|
+
const eventType = isCheckInput ? "click" : "input";
|
|
59
|
+
const currentValue = isCheckInput ? checked : value;
|
|
60
|
+
const serializedCurrentValue = isCheckInput ? checked : typeof value === "object" && value !== null ? JSON.stringify(value) : value;
|
|
61
|
+
const descriptor = Object.getOwnPropertyDescriptor(inputProto, propertyKey);
|
|
62
|
+
const setter = descriptor?.set;
|
|
63
|
+
if (prevValue !== currentValue && setter) {
|
|
64
|
+
const event = new Event(eventType, { bubbles });
|
|
65
|
+
setter.call(input, serializedCurrentValue);
|
|
66
|
+
input.dispatchEvent(event);
|
|
67
|
+
}
|
|
68
|
+
}, [prevValue, value, checked, bubbles, isCheckInput]);
|
|
69
|
+
const composedStyle = React.useMemo(() => {
|
|
70
|
+
return {
|
|
71
|
+
...style,
|
|
72
|
+
...controlSize.width !== void 0 && controlSize.height !== void 0 ? controlSize : {},
|
|
73
|
+
border: 0,
|
|
74
|
+
clip: "rect(0 0 0 0)",
|
|
75
|
+
clipPath: "inset(50%)",
|
|
76
|
+
height: "1px",
|
|
77
|
+
margin: "-1px",
|
|
78
|
+
overflow: "hidden",
|
|
79
|
+
padding: 0,
|
|
80
|
+
position: "absolute",
|
|
81
|
+
whiteSpace: "nowrap",
|
|
82
|
+
width: "1px"
|
|
83
|
+
};
|
|
84
|
+
}, [style, controlSize]);
|
|
85
|
+
const [initialValue] = React.useState(
|
|
86
|
+
() => isCheckInput ? void 0 : typeof value === "object" && value !== null ? JSON.stringify(value) : value === void 0 || value === null ? void 0 : String(value)
|
|
87
|
+
);
|
|
88
|
+
return /* @__PURE__ */ jsx(
|
|
89
|
+
"input",
|
|
90
|
+
{
|
|
91
|
+
type,
|
|
92
|
+
...inputProps,
|
|
93
|
+
ref: inputRef,
|
|
94
|
+
"aria-hidden": isCheckInput,
|
|
95
|
+
tabIndex: -1,
|
|
96
|
+
defaultChecked: isCheckInput ? checked : void 0,
|
|
97
|
+
defaultValue: initialValue,
|
|
98
|
+
style: composedStyle
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
export {
|
|
103
|
+
VisuallyHiddenInput
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=visually-hidden-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/visually-hidden-input.tsx"],"sourcesContent":["\"use client\";\n\n/*\n * Port từ Dice UI (`components/visually-hidden-input.tsx`) — MIT, © 2024 Sadman Sakib.\n *\n * Ô `<input>` ẩn đứng thay cho một control tự dựng (Rating, TimePicker, KeyValue, PhoneInput…) để\n * control đó tham gia được `<form>` thật: có `name`, có mặt trong `FormData`, và phát sự kiện\n * `input`/`click` nổi bọt mỗi khi giá trị đổi — nhờ vậy `onChange` của form bên ngoài vẫn nghe được.\n */\n\nimport * as React from \"react\";\n\ntype InputValue = string[] | string;\n\ninterface VisuallyHiddenInputProps<T = InputValue>\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"value\" | \"checked\" | \"onReset\"> {\n value?: T;\n checked?: boolean;\n control: HTMLElement | null;\n bubbles?: boolean;\n}\n\nfunction VisuallyHiddenInput<T = InputValue>(props: VisuallyHiddenInputProps<T>) {\n const { control, value, checked, bubbles = true, type = \"hidden\", style, ...inputProps } = props;\n\n const isCheckInput = React.useMemo(() => type === \"checkbox\" || type === \"radio\" || type === \"switch\", [type]);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const prevValueRef = React.useRef<{\n value: T | boolean | undefined;\n previous: T | boolean | undefined;\n }>({\n value: isCheckInput ? checked : value,\n previous: isCheckInput ? checked : value\n });\n\n const prevValue = React.useMemo(() => {\n const currentValue = isCheckInput ? checked : value;\n if (prevValueRef.current.value !== currentValue) {\n prevValueRef.current.previous = prevValueRef.current.value;\n prevValueRef.current.value = currentValue;\n }\n return prevValueRef.current.previous;\n }, [isCheckInput, value, checked]);\n\n const [controlSize, setControlSize] = React.useState<{\n width?: number;\n height?: number;\n }>({});\n\n React.useLayoutEffect(() => {\n if (!control) {\n setControlSize({});\n return;\n }\n\n setControlSize({\n width: control.offsetWidth,\n height: control.offsetHeight\n });\n\n if (typeof window === \"undefined\") return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n if (!Array.isArray(entries) || !entries.length) return;\n\n const entry = entries[0];\n if (!entry) return;\n\n let width: number;\n let height: number;\n\n if (\"borderBoxSize\" in entry) {\n const borderSizeEntry = entry.borderBoxSize;\n const borderSize = Array.isArray(borderSizeEntry) ? borderSizeEntry[0] : borderSizeEntry;\n width = borderSize.inlineSize;\n height = borderSize.blockSize;\n } else {\n width = control.offsetWidth;\n height = control.offsetHeight;\n }\n\n setControlSize({ width, height });\n });\n\n resizeObserver.observe(control, { box: \"border-box\" });\n return () => {\n resizeObserver.disconnect();\n };\n }, [control]);\n\n React.useEffect(() => {\n const input = inputRef.current;\n if (!input) return;\n\n const inputProto = window.HTMLInputElement.prototype;\n const propertyKey = isCheckInput ? \"checked\" : \"value\";\n const eventType = isCheckInput ? \"click\" : \"input\";\n const currentValue = isCheckInput ? checked : value;\n\n const serializedCurrentValue = isCheckInput\n ? checked\n : typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : value;\n\n const descriptor = Object.getOwnPropertyDescriptor(inputProto, propertyKey);\n\n const setter = descriptor?.set;\n\n if (prevValue !== currentValue && setter) {\n const event = new Event(eventType, { bubbles });\n setter.call(input, serializedCurrentValue);\n input.dispatchEvent(event);\n }\n }, [prevValue, value, checked, bubbles, isCheckInput]);\n\n const composedStyle = React.useMemo<React.CSSProperties>(() => {\n return {\n ...style,\n ...(controlSize.width !== undefined && controlSize.height !== undefined ? controlSize : {}),\n border: 0,\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n height: \"1px\",\n margin: \"-1px\",\n overflow: \"hidden\",\n padding: 0,\n position: \"absolute\",\n whiteSpace: \"nowrap\",\n width: \"1px\"\n };\n }, [style, controlSize]);\n\n /*\n * ⚠ Khác thượng nguồn: bản gốc chỉ ghi giá trị vào ô khi nó ĐỔI (effect ở trên so với lần trước),\n * còn lượt render đầu thì không ghi gì — nên một form gửi đi khi người dùng CHƯA chạm vào control\n * mang chuỗi rỗng thay cho giá trị mặc định (Rating `defaultValue={3}` gửi `rating=\"\"`). Đã thấy\n * đúng như vậy ở render phía server. `defaultValue` chỉ đặt giá trị BAN ĐẦU; mọi lần đổi sau vẫn\n * đi qua setter + sự kiện như cũ.\n */\n const [initialValue] = React.useState(() =>\n isCheckInput\n ? undefined\n : typeof value === \"object\" && value !== null\n ? JSON.stringify(value)\n : value === undefined || value === null\n ? undefined\n : String(value)\n );\n\n return (\n <input\n type={type}\n {...inputProps}\n ref={inputRef}\n aria-hidden={isCheckInput}\n tabIndex={-1}\n defaultChecked={isCheckInput ? checked : undefined}\n defaultValue={initialValue}\n style={composedStyle}\n />\n );\n}\n\nexport { VisuallyHiddenInput };\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comitor/ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Comitor design system — Shadcn/UI tùy biến theo brand Comitor + component dùng chung cho hệ sinh thái SaaS (Tasks, Chat, CRM, HR…)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -114,10 +114,14 @@
|
|
|
114
114
|
}
|
|
115
115
|
},
|
|
116
116
|
"dependencies": {
|
|
117
|
+
"@diceui/mention": "^1.0.0",
|
|
118
|
+
"@diceui/tags-input": "^1.0.0",
|
|
117
119
|
"@dnd-kit/core": "^6.3.1",
|
|
118
120
|
"@dnd-kit/modifiers": "^9.0.0",
|
|
119
121
|
"@dnd-kit/sortable": "^10.0.0",
|
|
120
122
|
"@dnd-kit/utilities": "^3.2.2",
|
|
123
|
+
"@floating-ui/react": "^0.27.20",
|
|
124
|
+
"@floating-ui/react-dom": "^2.1.9",
|
|
121
125
|
"@radix-ui/react-accordion": "1.2.12",
|
|
122
126
|
"@radix-ui/react-alert-dialog": "1.1.15",
|
|
123
127
|
"@radix-ui/react-aspect-ratio": "1.1.8",
|
package/styles.css
CHANGED
|
@@ -1015,3 +1015,22 @@
|
|
|
1015
1015
|
-webkit-mask-image: repeating-linear-gradient(135deg, #000 0 6px, transparent 6px 9px);
|
|
1016
1016
|
mask-image: repeating-linear-gradient(135deg, #000 0 6px, transparent 6px 9px);
|
|
1017
1017
|
}
|
|
1018
|
+
|
|
1019
|
+
/* ─ VÒNG QUAY của `CircularProgress` ở trạng thái KHÔNG XÁC ĐỊNH (`value={null}`) ─
|
|
1020
|
+
Port từ Dice UI cùng component. Cung 25% quay trọn một vòng mỗi 0,8s, bắt đầu từ 12 giờ
|
|
1021
|
+
(-90deg) để khớp điểm xuất phát của cung ở trạng thái có giá trị. Component chỉ gắn hiệu ứng
|
|
1022
|
+
dưới `motion-safe:`, nên người dùng bật `prefers-reduced-motion` thấy một cung đứng yên.
|
|
1023
|
+
⚠ Thiếu khối này thì vòng không xác định ĐỨNG YÊN mà không có lỗi nào — nó trông y như
|
|
1024
|
+
"đang ở 25%", tức một con số sai chứ không phải một hiệu ứng hỏng. */
|
|
1025
|
+
@theme {
|
|
1026
|
+
--animate-spin-around: spin-around 0.8s linear infinite;
|
|
1027
|
+
|
|
1028
|
+
@keyframes spin-around {
|
|
1029
|
+
0% {
|
|
1030
|
+
transform: rotate(-90deg);
|
|
1031
|
+
}
|
|
1032
|
+
100% {
|
|
1033
|
+
transform: rotate(270deg);
|
|
1034
|
+
}
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data-grid/compose-refs.ts"],"sourcesContent":["/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/compose-refs/src/compose-refs.tsx\n */\n\nimport * as React from \"react\";\n\ntype PossibleRef<T> = React.Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value\n * This utility takes care of different types of refs: callback refs and RefObject(s)\n */\nfunction setRef<T>(ref: PossibleRef<T>, value: T) {\n if (typeof ref === \"function\") {\n return ref(value);\n }\n\n if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\n/**\n * A utility to compose multiple refs together\n * Accepts callback refs and RefObject(s)\n */\nfunction composeRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup === \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n\n // React <19 will log an error to the console if a callback ref returns a\n // value. We don't use ref cleanups internally so this will only happen if a\n // user's ref callback returns a value, which we only expect if they are\n // using the cleanup functionality added in React 19.\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup === \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n\n/**\n * A custom hook that composes multiple refs\n * Accepts callback refs and RefObject(s)\n */\nfunction useComposedRefs<T>(...refs: PossibleRef<T>[]): React.RefCallback<T> {\n // biome-ignore lint/correctness/useExhaustiveDependencies: we don't want to re-run this callback when the refs change\n return React.useCallback(composeRefs(...refs), refs);\n}\n\nexport { composeRefs, useComposedRefs };\n"],"mappings":"AAIA,YAAY,WAAW;AAQvB,SAAS,OAAU,KAAqB,OAAU;AAChD,MAAI,OAAO,QAAQ,YAAY;AAC7B,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,MAAI,QAAQ,QAAQ,QAAQ,QAAW;AACrC,QAAI,UAAU;AAAA,EAChB;AACF;AAMA,SAAS,eAAkB,MAA8C;AACvE,SAAO,CAAC,SAAS;AACf,QAAI,aAAa;AACjB,UAAM,WAAW,KAAK,IAAI,CAAC,QAAQ;AACjC,YAAM,UAAU,OAAO,KAAK,IAAI;AAChC,UAAI,CAAC,cAAc,OAAO,YAAY,YAAY;AAChD,qBAAa;AAAA,MACf;AACA,aAAO;AAAA,IACT,CAAC;AAMD,QAAI,YAAY;AACd,aAAO,MAAM;AACX,iBAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,gBAAM,UAAU,SAAS,CAAC;AAC1B,cAAI,OAAO,YAAY,YAAY;AACjC,oBAAQ;AAAA,UACV,OAAO;AACL,mBAAO,KAAK,CAAC,GAAG,IAAI;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAMA,SAAS,mBAAsB,MAA8C;AAE3E,SAAO,MAAM,YAAY,YAAY,GAAG,IAAI,GAAG,IAAI;AACrD;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data-grid/use-as-ref.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect.js\";\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\n}\n\nexport { useAsRef };\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,SAAS,iCAAiC;AAE1C,SAAS,SAAY,OAAU;AAC7B,QAAM,MAAM,MAAM,OAAU,KAAK;AAEjC,4BAA0B,MAAM;AAC9B,QAAI,UAAU;AAAA,EAChB,CAAC;AAED,SAAO;AACT;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data-grid/use-isomorphic-layout-effect.ts"],"sourcesContent":["import * as React from \"react\";\n\nconst useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\nexport { useIsomorphicLayoutEffect };\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,MAAM,4BAA4B,OAAO,WAAW,cAAc,MAAM,kBAAkB,MAAM;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data-grid/use-lazy-ref.ts"],"sourcesContent":["import * as React from \"react\";\n\nfunction useLazyRef<T>(fn: () => T): React.RefObject<T> {\n const ref = React.useRef<T | null>(null);\n if (ref.current === null) {\n ref.current = fn();\n }\n return ref as React.RefObject<T>;\n}\n\nexport { useLazyRef };\n"],"mappings":"AAAA,YAAY,WAAW;AAEvB,SAAS,WAAc,IAAiC;AACtD,QAAM,MAAM,MAAM,OAAiB,IAAI;AACvC,MAAI,IAAI,YAAY,MAAM;AACxB,QAAI,UAAU,GAAG;AAAA,EACnB;AACA,SAAO;AACT;","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|