@tokis/react 1.0.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 +21 -0
- package/README.md +50 -0
- package/dist/cjs/components/accordion/index.js +36 -0
- package/dist/cjs/components/alert/index.js +14 -0
- package/dist/cjs/components/app-bar/index.js +9 -0
- package/dist/cjs/components/avatar/index.js +64 -0
- package/dist/cjs/components/badge/index.js +6 -0
- package/dist/cjs/components/bottom-nav/index.js +12 -0
- package/dist/cjs/components/breadcrumbs/index.js +19 -0
- package/dist/cjs/components/button/ButtonIcon.js +9 -0
- package/dist/cjs/components/button/ButtonLabel.js +9 -0
- package/dist/cjs/components/button/ButtonRoot.js +23 -0
- package/dist/cjs/components/button/index.js +11 -0
- package/dist/cjs/components/button/useButton.js +14 -0
- package/dist/cjs/components/card/index.js +25 -0
- package/dist/cjs/components/charts/index.js +214 -0
- package/dist/cjs/components/checkbox/index.js +18 -0
- package/dist/cjs/components/chip/index.js +6 -0
- package/dist/cjs/components/circular-progress/index.js +28 -0
- package/dist/cjs/components/codeblock/CodeBlock.js +35 -0
- package/dist/cjs/components/codeblock/index.js +5 -0
- package/dist/cjs/components/command-palette/index.js +84 -0
- package/dist/cjs/components/confirm-dialog/index.js +10 -0
- package/dist/cjs/components/context-menu/index.js +82 -0
- package/dist/cjs/components/dialog/index.js +43 -0
- package/dist/cjs/components/divider/index.js +6 -0
- package/dist/cjs/components/drawer/index.js +37 -0
- package/dist/cjs/components/dropdown/index.js +104 -0
- package/dist/cjs/components/emptystate/index.js +9 -0
- package/dist/cjs/components/extended/index.js +329 -0
- package/dist/cjs/components/hover-card/index.js +107 -0
- package/dist/cjs/components/infinite-scroll/index.js +21 -0
- package/dist/cjs/components/input/index.js +27 -0
- package/dist/cjs/components/layout/index.js +34 -0
- package/dist/cjs/components/link/index.js +7 -0
- package/dist/cjs/components/list/index.js +14 -0
- package/dist/cjs/components/menu/index.js +120 -0
- package/dist/cjs/components/nav-rail/index.js +12 -0
- package/dist/cjs/components/pagination/index.js +46 -0
- package/dist/cjs/components/popover/index.js +114 -0
- package/dist/cjs/components/portal/index.js +10 -0
- package/dist/cjs/components/progress/index.js +21 -0
- package/dist/cjs/components/radio/index.js +60 -0
- package/dist/cjs/components/result/index.js +25 -0
- package/dist/cjs/components/search-field/index.js +30 -0
- package/dist/cjs/components/select/index.js +88 -0
- package/dist/cjs/components/skeleton/index.js +6 -0
- package/dist/cjs/components/slider/index.js +73 -0
- package/dist/cjs/components/snackbar/index.js +41 -0
- package/dist/cjs/components/spinner/index.js +6 -0
- package/dist/cjs/components/statistic/index.js +17 -0
- package/dist/cjs/components/stepper/index.js +24 -0
- package/dist/cjs/components/switch/index.js +19 -0
- package/dist/cjs/components/table/index.js +26 -0
- package/dist/cjs/components/tabs/index.js +44 -0
- package/dist/cjs/components/tag/index.js +6 -0
- package/dist/cjs/components/timeline/index.js +12 -0
- package/dist/cjs/components/toggle/index.js +32 -0
- package/dist/cjs/components/tooltip/index.js +116 -0
- package/dist/cjs/components/treeview/index.js +89 -0
- package/dist/cjs/components/typography/index.js +20 -0
- package/dist/cjs/components/virtual-list/index.js +25 -0
- package/dist/cjs/context/ConfigProvider.js +22 -0
- package/dist/cjs/context/ThemeContext.js +25 -0
- package/dist/cjs/hooks/useControllableState.js +31 -0
- package/dist/cjs/hooks/useDialog.js +35 -0
- package/dist/cjs/hooks/useId.js +13 -0
- package/dist/cjs/hooks/useMenu.js +64 -0
- package/dist/cjs/hooks/usePopover.js +32 -0
- package/dist/cjs/hooks/useTabs.js +51 -0
- package/dist/cjs/index.js +102 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/utils/cn.js +10 -0
- package/dist/components/accordion/index.d.ts +19 -0
- package/dist/components/accordion/index.d.ts.map +1 -0
- package/dist/components/accordion/index.js +34 -0
- package/dist/components/accordion/index.js.map +1 -0
- package/dist/components/alert/index.d.ts +11 -0
- package/dist/components/alert/index.d.ts.map +1 -0
- package/dist/components/alert/index.js +12 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/app-bar/index.d.ts +17 -0
- package/dist/components/app-bar/index.d.ts.map +1 -0
- package/dist/components/app-bar/index.js +7 -0
- package/dist/components/app-bar/index.js.map +1 -0
- package/dist/components/avatar/index.d.ts +33 -0
- package/dist/components/avatar/index.d.ts.map +1 -0
- package/dist/components/avatar/index.js +28 -0
- package/dist/components/avatar/index.js.map +1 -0
- package/dist/components/badge/index.d.ts +3 -0
- package/dist/components/badge/index.d.ts.map +1 -0
- package/dist/components/badge/index.js +3 -0
- package/dist/components/badge/index.js.map +1 -0
- package/dist/components/bottom-nav/index.d.ts +18 -0
- package/dist/components/bottom-nav/index.d.ts.map +1 -0
- package/dist/components/bottom-nav/index.js +10 -0
- package/dist/components/bottom-nav/index.js.map +1 -0
- package/dist/components/breadcrumbs/index.d.ts +19 -0
- package/dist/components/breadcrumbs/index.d.ts.map +1 -0
- package/dist/components/breadcrumbs/index.js +17 -0
- package/dist/components/breadcrumbs/index.js.map +1 -0
- package/dist/components/button/ButtonIcon.d.ts +8 -0
- package/dist/components/button/ButtonIcon.d.ts.map +1 -0
- package/dist/components/button/ButtonIcon.js +6 -0
- package/dist/components/button/ButtonIcon.js.map +1 -0
- package/dist/components/button/ButtonLabel.d.ts +6 -0
- package/dist/components/button/ButtonLabel.d.ts.map +1 -0
- package/dist/components/button/ButtonLabel.js +6 -0
- package/dist/components/button/ButtonLabel.js.map +1 -0
- package/dist/components/button/ButtonRoot.d.ts +15 -0
- package/dist/components/button/ButtonRoot.d.ts.map +1 -0
- package/dist/components/button/ButtonRoot.js +21 -0
- package/dist/components/button/ButtonRoot.js.map +1 -0
- package/dist/components/button/index.d.ts +9 -0
- package/dist/components/button/index.d.ts.map +1 -0
- package/dist/components/button/index.js +5 -0
- package/dist/components/button/index.js.map +1 -0
- package/dist/components/button/useButton.d.ts +16 -0
- package/dist/components/button/useButton.d.ts.map +1 -0
- package/dist/components/button/useButton.js +12 -0
- package/dist/components/button/useButton.js.map +1 -0
- package/dist/components/card/index.d.ts +17 -0
- package/dist/components/card/index.d.ts.map +1 -0
- package/dist/components/card/index.js +23 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/charts/index.d.ts +60 -0
- package/dist/components/charts/index.d.ts.map +1 -0
- package/dist/components/charts/index.js +209 -0
- package/dist/components/charts/index.js.map +1 -0
- package/dist/components/checkbox/index.d.ts +17 -0
- package/dist/components/checkbox/index.d.ts.map +1 -0
- package/dist/components/checkbox/index.js +16 -0
- package/dist/components/checkbox/index.js.map +1 -0
- package/dist/components/chip/index.d.ts +3 -0
- package/dist/components/chip/index.d.ts.map +1 -0
- package/dist/components/chip/index.js +3 -0
- package/dist/components/chip/index.js.map +1 -0
- package/dist/components/circular-progress/index.d.ts +15 -0
- package/dist/components/circular-progress/index.d.ts.map +1 -0
- package/dist/components/circular-progress/index.js +26 -0
- package/dist/components/circular-progress/index.js.map +1 -0
- package/dist/components/codeblock/CodeBlock.d.ts +13 -0
- package/dist/components/codeblock/CodeBlock.d.ts.map +1 -0
- package/dist/components/codeblock/CodeBlock.js +32 -0
- package/dist/components/codeblock/CodeBlock.js.map +1 -0
- package/dist/components/codeblock/index.d.ts +3 -0
- package/dist/components/codeblock/index.d.ts.map +1 -0
- package/dist/components/codeblock/index.js +2 -0
- package/dist/components/codeblock/index.js.map +1 -0
- package/dist/components/command-palette/index.d.ts +22 -0
- package/dist/components/command-palette/index.d.ts.map +1 -0
- package/dist/components/command-palette/index.js +82 -0
- package/dist/components/command-palette/index.js.map +1 -0
- package/dist/components/confirm-dialog/index.d.ts +17 -0
- package/dist/components/confirm-dialog/index.d.ts.map +1 -0
- package/dist/components/confirm-dialog/index.js +8 -0
- package/dist/components/confirm-dialog/index.js.map +1 -0
- package/dist/components/context-menu/index.d.ts +19 -0
- package/dist/components/context-menu/index.d.ts.map +1 -0
- package/dist/components/context-menu/index.js +47 -0
- package/dist/components/context-menu/index.js.map +1 -0
- package/dist/components/dialog/index.d.ts +16 -0
- package/dist/components/dialog/index.d.ts.map +1 -0
- package/dist/components/dialog/index.js +41 -0
- package/dist/components/dialog/index.js.map +1 -0
- package/dist/components/divider/index.d.ts +3 -0
- package/dist/components/divider/index.d.ts.map +1 -0
- package/dist/components/divider/index.js +3 -0
- package/dist/components/divider/index.js.map +1 -0
- package/dist/components/drawer/index.d.ts +16 -0
- package/dist/components/drawer/index.d.ts.map +1 -0
- package/dist/components/drawer/index.js +35 -0
- package/dist/components/drawer/index.js.map +1 -0
- package/dist/components/dropdown/index.d.ts +16 -0
- package/dist/components/dropdown/index.d.ts.map +1 -0
- package/dist/components/dropdown/index.js +69 -0
- package/dist/components/dropdown/index.js.map +1 -0
- package/dist/components/emptystate/index.d.ts +13 -0
- package/dist/components/emptystate/index.d.ts.map +1 -0
- package/dist/components/emptystate/index.js +7 -0
- package/dist/components/emptystate/index.js.map +1 -0
- package/dist/components/extended/index.d.ts +163 -0
- package/dist/components/extended/index.d.ts.map +1 -0
- package/dist/components/extended/index.js +267 -0
- package/dist/components/extended/index.js.map +1 -0
- package/dist/components/hover-card/index.d.ts +14 -0
- package/dist/components/hover-card/index.d.ts.map +1 -0
- package/dist/components/hover-card/index.js +72 -0
- package/dist/components/hover-card/index.js.map +1 -0
- package/dist/components/infinite-scroll/index.d.ts +16 -0
- package/dist/components/infinite-scroll/index.d.ts.map +1 -0
- package/dist/components/infinite-scroll/index.js +19 -0
- package/dist/components/infinite-scroll/index.js.map +1 -0
- package/dist/components/input/index.d.ts +19 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/input/index.js +25 -0
- package/dist/components/input/index.js.map +1 -0
- package/dist/components/layout/index.d.ts +39 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/index.js +32 -0
- package/dist/components/layout/index.js.map +1 -0
- package/dist/components/link/index.d.ts +3 -0
- package/dist/components/link/index.d.ts.map +1 -0
- package/dist/components/link/index.js +3 -0
- package/dist/components/link/index.js.map +1 -0
- package/dist/components/list/index.d.ts +13 -0
- package/dist/components/list/index.d.ts.map +1 -0
- package/dist/components/list/index.js +12 -0
- package/dist/components/list/index.js.map +1 -0
- package/dist/components/menu/index.d.ts +19 -0
- package/dist/components/menu/index.d.ts.map +1 -0
- package/dist/components/menu/index.js +85 -0
- package/dist/components/menu/index.js.map +1 -0
- package/dist/components/nav-rail/index.d.ts +20 -0
- package/dist/components/nav-rail/index.d.ts.map +1 -0
- package/dist/components/nav-rail/index.js +10 -0
- package/dist/components/nav-rail/index.js.map +1 -0
- package/dist/components/pagination/index.d.ts +9 -0
- package/dist/components/pagination/index.d.ts.map +1 -0
- package/dist/components/pagination/index.js +44 -0
- package/dist/components/pagination/index.js.map +1 -0
- package/dist/components/popover/index.d.ts +16 -0
- package/dist/components/popover/index.d.ts.map +1 -0
- package/dist/components/popover/index.js +79 -0
- package/dist/components/popover/index.js.map +1 -0
- package/dist/components/portal/index.d.ts +7 -0
- package/dist/components/portal/index.d.ts.map +1 -0
- package/dist/components/portal/index.js +8 -0
- package/dist/components/portal/index.js.map +1 -0
- package/dist/components/progress/index.d.ts +25 -0
- package/dist/components/progress/index.d.ts.map +1 -0
- package/dist/components/progress/index.js +19 -0
- package/dist/components/progress/index.js.map +1 -0
- package/dist/components/radio/index.d.ts +25 -0
- package/dist/components/radio/index.d.ts.map +1 -0
- package/dist/components/radio/index.js +24 -0
- package/dist/components/radio/index.js.map +1 -0
- package/dist/components/result/index.d.ts +14 -0
- package/dist/components/result/index.d.ts.map +1 -0
- package/dist/components/result/index.js +23 -0
- package/dist/components/result/index.js.map +1 -0
- package/dist/components/search-field/index.d.ts +15 -0
- package/dist/components/search-field/index.d.ts.map +1 -0
- package/dist/components/search-field/index.js +28 -0
- package/dist/components/search-field/index.js.map +1 -0
- package/dist/components/select/index.d.ts +23 -0
- package/dist/components/select/index.d.ts.map +1 -0
- package/dist/components/select/index.js +86 -0
- package/dist/components/select/index.js.map +1 -0
- package/dist/components/skeleton/index.d.ts +3 -0
- package/dist/components/skeleton/index.d.ts.map +1 -0
- package/dist/components/skeleton/index.js +3 -0
- package/dist/components/skeleton/index.js.map +1 -0
- package/dist/components/slider/index.d.ts +18 -0
- package/dist/components/slider/index.d.ts.map +1 -0
- package/dist/components/slider/index.js +71 -0
- package/dist/components/slider/index.js.map +1 -0
- package/dist/components/snackbar/index.d.ts +27 -0
- package/dist/components/snackbar/index.d.ts.map +1 -0
- package/dist/components/snackbar/index.js +38 -0
- package/dist/components/snackbar/index.js.map +1 -0
- package/dist/components/spinner/index.d.ts +3 -0
- package/dist/components/spinner/index.d.ts.map +1 -0
- package/dist/components/spinner/index.js +3 -0
- package/dist/components/spinner/index.js.map +1 -0
- package/dist/components/statistic/index.d.ts +13 -0
- package/dist/components/statistic/index.d.ts.map +1 -0
- package/dist/components/statistic/index.js +15 -0
- package/dist/components/statistic/index.js.map +1 -0
- package/dist/components/stepper/index.d.ts +17 -0
- package/dist/components/stepper/index.d.ts.map +1 -0
- package/dist/components/stepper/index.js +22 -0
- package/dist/components/stepper/index.js.map +1 -0
- package/dist/components/switch/index.d.ts +16 -0
- package/dist/components/switch/index.d.ts.map +1 -0
- package/dist/components/switch/index.js +17 -0
- package/dist/components/switch/index.js.map +1 -0
- package/dist/components/table/index.d.ts +17 -0
- package/dist/components/table/index.d.ts.map +1 -0
- package/dist/components/table/index.js +24 -0
- package/dist/components/table/index.js.map +1 -0
- package/dist/components/tabs/index.d.ts +19 -0
- package/dist/components/tabs/index.d.ts.map +1 -0
- package/dist/components/tabs/index.js +42 -0
- package/dist/components/tabs/index.js.map +1 -0
- package/dist/components/tag/index.d.ts +3 -0
- package/dist/components/tag/index.d.ts.map +1 -0
- package/dist/components/tag/index.js +3 -0
- package/dist/components/tag/index.js.map +1 -0
- package/dist/components/timeline/index.d.ts +16 -0
- package/dist/components/timeline/index.d.ts.map +1 -0
- package/dist/components/timeline/index.js +10 -0
- package/dist/components/timeline/index.js.map +1 -0
- package/dist/components/toggle/index.d.ts +32 -0
- package/dist/components/toggle/index.d.ts.map +1 -0
- package/dist/components/toggle/index.js +29 -0
- package/dist/components/toggle/index.js.map +1 -0
- package/dist/components/tooltip/index.d.ts +11 -0
- package/dist/components/tooltip/index.d.ts.map +1 -0
- package/dist/components/tooltip/index.js +81 -0
- package/dist/components/tooltip/index.js.map +1 -0
- package/dist/components/treeview/index.d.ts +19 -0
- package/dist/components/treeview/index.d.ts.map +1 -0
- package/dist/components/treeview/index.js +87 -0
- package/dist/components/treeview/index.js.map +1 -0
- package/dist/components/typography/index.d.ts +11 -0
- package/dist/components/typography/index.d.ts.map +1 -0
- package/dist/components/typography/index.js +18 -0
- package/dist/components/typography/index.js.map +1 -0
- package/dist/components/virtual-list/index.d.ts +15 -0
- package/dist/components/virtual-list/index.d.ts.map +1 -0
- package/dist/components/virtual-list/index.js +23 -0
- package/dist/components/virtual-list/index.js.map +1 -0
- package/dist/context/ConfigProvider.d.ts +12 -0
- package/dist/context/ConfigProvider.d.ts.map +1 -0
- package/dist/context/ConfigProvider.js +18 -0
- package/dist/context/ConfigProvider.js.map +1 -0
- package/dist/context/ThemeContext.d.ts +15 -0
- package/dist/context/ThemeContext.d.ts.map +1 -0
- package/dist/context/ThemeContext.js +21 -0
- package/dist/context/ThemeContext.js.map +1 -0
- package/dist/hooks/useControllableState.d.ts +10 -0
- package/dist/hooks/useControllableState.d.ts.map +1 -0
- package/dist/hooks/useControllableState.js +29 -0
- package/dist/hooks/useControllableState.js.map +1 -0
- package/dist/hooks/useDialog.d.ts +24 -0
- package/dist/hooks/useDialog.d.ts.map +1 -0
- package/dist/hooks/useDialog.js +33 -0
- package/dist/hooks/useDialog.js.map +1 -0
- package/dist/hooks/useId.d.ts +7 -0
- package/dist/hooks/useId.d.ts.map +1 -0
- package/dist/hooks/useId.js +11 -0
- package/dist/hooks/useId.js.map +1 -0
- package/dist/hooks/useMenu.d.ts +21 -0
- package/dist/hooks/useMenu.d.ts.map +1 -0
- package/dist/hooks/useMenu.js +62 -0
- package/dist/hooks/useMenu.js.map +1 -0
- package/dist/hooks/usePopover.d.ts +22 -0
- package/dist/hooks/usePopover.d.ts.map +1 -0
- package/dist/hooks/usePopover.js +30 -0
- package/dist/hooks/usePopover.js.map +1 -0
- package/dist/hooks/useTabs.d.ts +22 -0
- package/dist/hooks/useTabs.d.ts.map +1 -0
- package/dist/hooks/useTabs.js +49 -0
- package/dist/hooks/useTabs.js.map +1 -0
- package/dist/index.d.ts +65 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/cn.d.ts +6 -0
- package/dist/utils/cn.d.ts.map +1 -0
- package/dist/utils/cn.js +8 -0
- package/dist/utils/cn.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Menu = Menu;
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
39
|
+
const cn_js_1 = require("../../utils/cn");
|
|
40
|
+
const index_js_1 = require("../portal/index");
|
|
41
|
+
function Menu({ trigger, items, placement = 'bottom-start', className }) {
|
|
42
|
+
const [open, setOpen] = (0, react_1.useState)(false);
|
|
43
|
+
const [pos, setPos] = (0, react_1.useState)({ top: 0, left: 0 });
|
|
44
|
+
const [focusedIndex, setFocusedIndex] = (0, react_1.useState)(-1);
|
|
45
|
+
const triggerRef = (0, react_1.useRef)(null);
|
|
46
|
+
const contentRef = (0, react_1.useRef)(null);
|
|
47
|
+
const menuId = (0, react_1.useId)();
|
|
48
|
+
const updatePosition = (0, react_1.useCallback)(() => {
|
|
49
|
+
if (!triggerRef.current)
|
|
50
|
+
return;
|
|
51
|
+
const rect = triggerRef.current.getBoundingClientRect();
|
|
52
|
+
const isBottom = placement.startsWith('bottom');
|
|
53
|
+
const isStart = placement.endsWith('start');
|
|
54
|
+
setPos({
|
|
55
|
+
top: isBottom ? rect.bottom + window.scrollY + 4 : rect.top + window.scrollY - 4,
|
|
56
|
+
left: isStart ? rect.left + window.scrollX : rect.right + window.scrollX,
|
|
57
|
+
});
|
|
58
|
+
}, [placement]);
|
|
59
|
+
const clickableItems = items.filter((i) => i.type !== 'separator' && i.type !== 'label' && !i.disabled);
|
|
60
|
+
(0, react_1.useEffect)(() => {
|
|
61
|
+
if (!open)
|
|
62
|
+
return;
|
|
63
|
+
const handle = (e) => {
|
|
64
|
+
if (!triggerRef.current?.contains(e.target) && !contentRef.current?.contains(e.target))
|
|
65
|
+
setOpen(false);
|
|
66
|
+
};
|
|
67
|
+
const handleKey = (e) => {
|
|
68
|
+
if (e.key === 'Escape') {
|
|
69
|
+
setOpen(false);
|
|
70
|
+
triggerRef.current?.focus();
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
document.addEventListener('mousedown', handle);
|
|
74
|
+
document.addEventListener('keydown', handleKey);
|
|
75
|
+
return () => { document.removeEventListener('mousedown', handle); document.removeEventListener('keydown', handleKey); };
|
|
76
|
+
}, [open]);
|
|
77
|
+
const handleTriggerKeyDown = (e) => {
|
|
78
|
+
if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
updatePosition();
|
|
81
|
+
setOpen(true);
|
|
82
|
+
setFocusedIndex(0);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const handleMenuKeyDown = (e) => {
|
|
86
|
+
if (e.key === 'ArrowDown') {
|
|
87
|
+
e.preventDefault();
|
|
88
|
+
setFocusedIndex((p) => (p + 1) % clickableItems.length);
|
|
89
|
+
}
|
|
90
|
+
if (e.key === 'ArrowUp') {
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
setFocusedIndex((p) => (p - 1 + clickableItems.length) % clickableItems.length);
|
|
93
|
+
}
|
|
94
|
+
if (e.key === 'Enter' && focusedIndex >= 0) {
|
|
95
|
+
clickableItems[focusedIndex].onClick?.();
|
|
96
|
+
setOpen(false);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
let clickableIdx = -1;
|
|
100
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [react_1.default.cloneElement(trigger, {
|
|
101
|
+
ref: triggerRef,
|
|
102
|
+
'aria-haspopup': 'menu',
|
|
103
|
+
'aria-expanded': open,
|
|
104
|
+
'aria-controls': open ? menuId : undefined,
|
|
105
|
+
onClick: (e) => { updatePosition(); setOpen((v) => !v); trigger.props.onClick?.(e); },
|
|
106
|
+
onKeyDown: handleTriggerKeyDown,
|
|
107
|
+
}), open && ((0, jsx_runtime_1.jsx)(index_js_1.Portal, { children: (0, jsx_runtime_1.jsx)("div", { ref: contentRef, id: menuId, role: "menu", tabIndex: -1, className: (0, cn_js_1.cn)('tokis-menu-content', className), style: { position: 'absolute', top: pos.top, left: pos.left, ...(placement.endsWith('end') && { transform: 'translateX(-100%)' }) }, onKeyDown: handleMenuKeyDown, children: items.map((item, i) => {
|
|
108
|
+
if (item.type === 'separator')
|
|
109
|
+
return (0, jsx_runtime_1.jsx)("div", { className: "tokis-menu-separator", role: "separator" }, i);
|
|
110
|
+
if (item.type === 'label')
|
|
111
|
+
return (0, jsx_runtime_1.jsx)("div", { className: "tokis-menu-group-label", children: item.label }, i);
|
|
112
|
+
clickableIdx++;
|
|
113
|
+
const isFocused = clickableIdx === focusedIndex;
|
|
114
|
+
const idx = clickableIdx;
|
|
115
|
+
return ((0, jsx_runtime_1.jsxs)("button", { role: "menuitem", className: (0, cn_js_1.cn)('tokis-menu-item', item.destructive && 'tokis-menu-item--destructive'), "data-focused": isFocused ? 'true' : undefined, "data-disabled": item.disabled ? 'true' : undefined, "aria-disabled": item.disabled, disabled: item.disabled, tabIndex: isFocused ? 0 : -1, onClick: () => { if (!item.disabled) {
|
|
116
|
+
item.onClick?.();
|
|
117
|
+
setOpen(false);
|
|
118
|
+
} }, onMouseEnter: () => setFocusedIndex(idx), children: [item.icon && (0, jsx_runtime_1.jsx)("span", { className: "tokis-menu-item__icon", "aria-hidden": "true", children: item.icon }), (0, jsx_runtime_1.jsx)("span", { className: "tokis-menu-item__label", children: item.label }), item.shortcut && (0, jsx_runtime_1.jsx)("span", { className: "tokis-menu-item__shortcut", "aria-label": `keyboard shortcut: ${item.shortcut}`, children: item.shortcut })] }, i));
|
|
119
|
+
}) }) }))] }));
|
|
120
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NavigationRail = NavigationRail;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const cn_js_1 = require("../../utils/cn");
|
|
6
|
+
function NavigationRail({ items, value, onChange, header, footer, className }) {
|
|
7
|
+
return ((0, jsx_runtime_1.jsxs)("nav", { className: (0, cn_js_1.cn)('tokis-nav-rail', className), "aria-label": "Navigation rail", children: [header && (0, jsx_runtime_1.jsx)("div", { className: "tokis-nav-rail__header", children: header }), (0, jsx_runtime_1.jsx)("div", { className: "tokis-nav-rail__items", children: items.map((item) => {
|
|
8
|
+
const isActive = item.value === value;
|
|
9
|
+
return ((0, jsx_runtime_1.jsxs)("button", { className: (0, cn_js_1.cn)('tokis-nav-rail__item', isActive && 'tokis-nav-rail__item--active'), onClick: () => onChange(item.value), "aria-current": isActive ? 'page' : undefined, "aria-label": item.label, children: [(0, jsx_runtime_1.jsxs)("span", { className: "tokis-nav-rail__icon", children: [item.badge !== undefined && ((0, jsx_runtime_1.jsx)("span", { className: "tokis-nav-rail__badge", "aria-label": `${item.badge} notifications`, children: item.badge })), item.icon] }), (0, jsx_runtime_1.jsx)("span", { className: "tokis-nav-rail__label", children: item.label })] }, item.value));
|
|
10
|
+
}) }), footer && (0, jsx_runtime_1.jsx)("div", { className: "tokis-nav-rail__footer", children: footer })] }));
|
|
11
|
+
}
|
|
12
|
+
NavigationRail.displayName = 'NavigationRail';
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Pagination = Pagination;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const cn_js_1 = require("../../utils/cn");
|
|
7
|
+
function range(start, end) {
|
|
8
|
+
const length = end - start + 1;
|
|
9
|
+
return Array.from({ length }, (_, i) => start + i);
|
|
10
|
+
}
|
|
11
|
+
function usePaginationItems(page, totalPages, siblingCount) {
|
|
12
|
+
return (0, react_1.useMemo)(() => {
|
|
13
|
+
const totalPageNumbers = siblingCount * 2 + 5; // siblings + first + last + current + 2 ellipsis
|
|
14
|
+
if (totalPages <= totalPageNumbers) {
|
|
15
|
+
return range(1, totalPages);
|
|
16
|
+
}
|
|
17
|
+
const leftSiblingIndex = Math.max(page - siblingCount, 1);
|
|
18
|
+
const rightSiblingIndex = Math.min(page + siblingCount, totalPages);
|
|
19
|
+
const showLeftEllipsis = leftSiblingIndex > 2;
|
|
20
|
+
const showRightEllipsis = rightSiblingIndex < totalPages - 1;
|
|
21
|
+
if (!showLeftEllipsis && showRightEllipsis) {
|
|
22
|
+
const leftRange = range(1, 3 + siblingCount * 2);
|
|
23
|
+
return [...leftRange, 'ellipsis-end', totalPages];
|
|
24
|
+
}
|
|
25
|
+
if (showLeftEllipsis && !showRightEllipsis) {
|
|
26
|
+
const rightRange = range(totalPages - (2 + siblingCount * 2), totalPages);
|
|
27
|
+
return [1, 'ellipsis-start', ...rightRange];
|
|
28
|
+
}
|
|
29
|
+
const middleRange = range(leftSiblingIndex, rightSiblingIndex);
|
|
30
|
+
return [1, 'ellipsis-start', ...middleRange, 'ellipsis-end', totalPages];
|
|
31
|
+
}, [page, totalPages, siblingCount]);
|
|
32
|
+
}
|
|
33
|
+
function Pagination({ page, totalPages, onChange, siblingCount = 1, className, }) {
|
|
34
|
+
const items = usePaginationItems(page, totalPages, siblingCount);
|
|
35
|
+
const handlePrev = () => { if (page > 1)
|
|
36
|
+
onChange(page - 1); };
|
|
37
|
+
const handleNext = () => { if (page < totalPages)
|
|
38
|
+
onChange(page + 1); };
|
|
39
|
+
return ((0, jsx_runtime_1.jsxs)("nav", { className: (0, cn_js_1.cn)('tokis-pagination', className), "aria-label": "Pagination navigation", role: "navigation", children: [(0, jsx_runtime_1.jsx)("button", { className: (0, cn_js_1.cn)('tokis-pagination__item', 'tokis-pagination__prev', page === 1 && 'tokis-pagination__item--disabled'), onClick: handlePrev, disabled: page === 1, "aria-label": "Go to previous page", "aria-disabled": page === 1, children: (0, jsx_runtime_1.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("path", { d: "M10 12L6 8l4-4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }) }), items.map((item, index) => {
|
|
40
|
+
if (item === 'ellipsis-start' || item === 'ellipsis-end') {
|
|
41
|
+
return ((0, jsx_runtime_1.jsx)("span", { className: "tokis-pagination__ellipsis", "aria-hidden": "true", children: "\u2026" }, item));
|
|
42
|
+
}
|
|
43
|
+
const isActive = item === page;
|
|
44
|
+
return ((0, jsx_runtime_1.jsx)("button", { className: (0, cn_js_1.cn)('tokis-pagination__item', isActive && 'tokis-pagination__item--active'), onClick: () => onChange(item), "aria-label": `Go to page ${item}`, "aria-current": isActive ? 'page' : undefined, disabled: isActive, children: item }, `${item}-${index}`));
|
|
45
|
+
}), (0, jsx_runtime_1.jsx)("button", { className: (0, cn_js_1.cn)('tokis-pagination__item', 'tokis-pagination__next', page === totalPages && 'tokis-pagination__item--disabled'), onClick: handleNext, disabled: page === totalPages, "aria-label": "Go to next page", "aria-disabled": page === totalPages, children: (0, jsx_runtime_1.jsx)("svg", { width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("path", { d: "M6 4l4 4-4 4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) }) })] }));
|
|
46
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Popover = Popover;
|
|
37
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
39
|
+
const cn_js_1 = require("../../utils/cn");
|
|
40
|
+
const index_js_1 = require("../portal/index");
|
|
41
|
+
function Popover({ trigger, content, title, placement = 'bottom-start', open, defaultOpen = false, onOpenChange, closeOnClickOutside = true, closeOnEsc = true, className }) {
|
|
42
|
+
const [internalOpen, setInternalOpen] = (0, react_1.useState)(defaultOpen);
|
|
43
|
+
const isOpen = open ?? internalOpen;
|
|
44
|
+
const [pos, setPos] = (0, react_1.useState)({ top: 0, left: 0 });
|
|
45
|
+
const triggerRef = (0, react_1.useRef)(null);
|
|
46
|
+
const contentRef = (0, react_1.useRef)(null);
|
|
47
|
+
const popoverId = (0, react_1.useId)();
|
|
48
|
+
const setOpen = (0, react_1.useCallback)((val) => {
|
|
49
|
+
if (open === undefined)
|
|
50
|
+
setInternalOpen(val);
|
|
51
|
+
onOpenChange?.(val);
|
|
52
|
+
}, [open, onOpenChange]);
|
|
53
|
+
const updatePosition = (0, react_1.useCallback)(() => {
|
|
54
|
+
if (!triggerRef.current)
|
|
55
|
+
return;
|
|
56
|
+
const rect = triggerRef.current.getBoundingClientRect();
|
|
57
|
+
const gap = 8;
|
|
58
|
+
let top = 0;
|
|
59
|
+
let left = 0;
|
|
60
|
+
const base = placement.split('-')[0];
|
|
61
|
+
const align = placement.split('-')[1];
|
|
62
|
+
if (base === 'bottom') {
|
|
63
|
+
top = rect.bottom + window.scrollY + gap;
|
|
64
|
+
}
|
|
65
|
+
if (base === 'top') {
|
|
66
|
+
top = rect.top + window.scrollY - gap;
|
|
67
|
+
}
|
|
68
|
+
if (base === 'right') {
|
|
69
|
+
left = rect.right + window.scrollX + gap;
|
|
70
|
+
top = rect.top + window.scrollY;
|
|
71
|
+
}
|
|
72
|
+
if (base === 'left') {
|
|
73
|
+
left = rect.left + window.scrollX - gap;
|
|
74
|
+
top = rect.top + window.scrollY;
|
|
75
|
+
}
|
|
76
|
+
if (!align || align === 'start') {
|
|
77
|
+
left = rect.left + window.scrollX;
|
|
78
|
+
}
|
|
79
|
+
if (align === 'end') {
|
|
80
|
+
left = rect.right + window.scrollX;
|
|
81
|
+
}
|
|
82
|
+
if (align === 'center' || (base === 'top' || base === 'bottom') && !align) {
|
|
83
|
+
left = rect.left + window.scrollX + rect.width / 2;
|
|
84
|
+
}
|
|
85
|
+
setPos({ top, left });
|
|
86
|
+
}, [placement]);
|
|
87
|
+
(0, react_1.useEffect)(() => {
|
|
88
|
+
if (!isOpen || !closeOnClickOutside)
|
|
89
|
+
return;
|
|
90
|
+
const handle = (e) => {
|
|
91
|
+
if (!triggerRef.current?.contains(e.target) && !contentRef.current?.contains(e.target)) {
|
|
92
|
+
setOpen(false);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
document.addEventListener('mousedown', handle);
|
|
96
|
+
return () => document.removeEventListener('mousedown', handle);
|
|
97
|
+
}, [isOpen, closeOnClickOutside, setOpen]);
|
|
98
|
+
(0, react_1.useEffect)(() => {
|
|
99
|
+
if (!isOpen || !closeOnEsc)
|
|
100
|
+
return;
|
|
101
|
+
const h = (e) => { if (e.key === 'Escape')
|
|
102
|
+
setOpen(false); };
|
|
103
|
+
document.addEventListener('keydown', h);
|
|
104
|
+
return () => document.removeEventListener('keydown', h);
|
|
105
|
+
}, [isOpen, closeOnEsc, setOpen]);
|
|
106
|
+
const handleToggle = () => { updatePosition(); setOpen(!isOpen); };
|
|
107
|
+
return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [react_1.default.cloneElement(trigger, {
|
|
108
|
+
ref: triggerRef,
|
|
109
|
+
'aria-expanded': isOpen,
|
|
110
|
+
'aria-haspopup': 'dialog',
|
|
111
|
+
'aria-controls': isOpen ? popoverId : undefined,
|
|
112
|
+
onClick: (e) => { handleToggle(); trigger.props.onClick?.(e); },
|
|
113
|
+
}), isOpen && ((0, jsx_runtime_1.jsx)(index_js_1.Portal, { children: (0, jsx_runtime_1.jsxs)("div", { ref: contentRef, id: popoverId, role: "dialog", "aria-modal": "false", tabIndex: -1, className: (0, cn_js_1.cn)('tokis-popover-content', className), style: { position: 'absolute', top: pos.top, left: pos.left }, children: [title && (0, jsx_runtime_1.jsx)("p", { className: "tokis-popover-title", children: title }), (0, jsx_runtime_1.jsx)("button", { className: "tokis-popover-close", onClick: () => setOpen(false), "aria-label": "Close", children: (0, jsx_runtime_1.jsx)("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("path", { d: "M1 1l10 10M11 1L1 11", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) }) }), content] }) }))] }));
|
|
114
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Portal = Portal;
|
|
4
|
+
const react_dom_1 = require("react-dom");
|
|
5
|
+
function Portal({ children, container }) {
|
|
6
|
+
if (typeof document === 'undefined')
|
|
7
|
+
return null;
|
|
8
|
+
const target = container ?? document.body;
|
|
9
|
+
return (0, react_dom_1.createPortal)(children, target);
|
|
10
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Spinner = exports.Skeleton = exports.Progress = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const cn_js_1 = require("../../utils/cn");
|
|
7
|
+
exports.Progress = (0, react_1.forwardRef)(({ value, max = 100, label, showValue = false, variant = 'default', size = 'md', className, ...props }, ref) => {
|
|
8
|
+
const pct = value !== undefined ? Math.min(100, Math.max(0, (value / max) * 100)) : undefined;
|
|
9
|
+
const isIndeterminate = pct === undefined;
|
|
10
|
+
return ((0, jsx_runtime_1.jsxs)("div", { ref: ref, className: (0, cn_js_1.cn)('tokis-progress-root', className), ...props, children: [(label || showValue) && ((0, jsx_runtime_1.jsxs)("div", { className: "tokis-progress-label", children: [label && (0, jsx_runtime_1.jsx)("span", { className: "tokis-progress-label-text", children: label }), showValue && !isIndeterminate && (0, jsx_runtime_1.jsxs)("span", { className: "tokis-progress-label-value", children: [Math.round(pct), "%"] })] })), (0, jsx_runtime_1.jsx)("div", { role: "progressbar", "aria-valuenow": isIndeterminate ? undefined : pct, "aria-valuemin": 0, "aria-valuemax": 100, "aria-label": label, className: (0, cn_js_1.cn)('tokis-progress-track', size !== 'md' && `tokis-progress-track--${size}`), children: (0, jsx_runtime_1.jsx)("div", { className: (0, cn_js_1.cn)('tokis-progress-fill', variant !== 'default' && `tokis-progress-fill--${variant}`, isIndeterminate && 'tokis-progress-fill--indeterminate'), style: !isIndeterminate ? { width: `${pct}%` } : undefined }) })] }));
|
|
11
|
+
});
|
|
12
|
+
exports.Progress.displayName = 'Progress';
|
|
13
|
+
exports.Skeleton = (0, react_1.forwardRef)(({ variant = 'rectangular', width, height, lines, className, style, ...props }, ref) => {
|
|
14
|
+
if (lines && lines > 1) {
|
|
15
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: className, children: Array.from({ length: lines }).map((_, i) => ((0, jsx_runtime_1.jsx)("span", { className: (0, cn_js_1.cn)('tokis-skeleton tokis-skeleton--text'), style: { width: i === lines - 1 ? '70%' : '100%', marginBottom: i < lines - 1 ? '8px' : 0 } }, i))) }));
|
|
16
|
+
}
|
|
17
|
+
return ((0, jsx_runtime_1.jsx)("span", { ref: ref, className: (0, cn_js_1.cn)('tokis-skeleton', variant === 'text' && 'tokis-skeleton--text', variant === 'circular' && 'tokis-skeleton--circle', variant === 'wave' && 'tokis-skeleton--wave', className), style: { display: 'block', width, height, ...style }, "aria-hidden": "true", ...props }));
|
|
18
|
+
});
|
|
19
|
+
exports.Skeleton.displayName = 'Skeleton';
|
|
20
|
+
exports.Spinner = (0, react_1.forwardRef)(({ size = 'md', variant = 'default', label = 'Loading…', className, ...props }, ref) => ((0, jsx_runtime_1.jsx)("span", { ref: ref, role: "status", "aria-label": label, className: (0, cn_js_1.cn)('tokis-spinner', size !== 'md' && `tokis-spinner--${size}`, variant === 'white' && 'tokis-spinner--white', className), ...props })));
|
|
21
|
+
exports.Spinner.displayName = 'Spinner';
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.Radio = Radio;
|
|
37
|
+
exports.RadioGroup = RadioGroup;
|
|
38
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
39
|
+
const react_1 = __importStar(require("react"));
|
|
40
|
+
const cn_js_1 = require("../../utils/cn");
|
|
41
|
+
function Radio({ value, label, description, disabled = false, checked = false, name, onChange, className }) {
|
|
42
|
+
const autoId = (0, react_1.useId)();
|
|
43
|
+
const radioId = `radio-${autoId}`;
|
|
44
|
+
const descId = description ? `${radioId}-desc` : undefined;
|
|
45
|
+
return ((0, jsx_runtime_1.jsxs)("label", { className: (0, cn_js_1.cn)('tokis-radio-root', className), "data-disabled": disabled || undefined, htmlFor: radioId, children: [(0, jsx_runtime_1.jsx)("input", { type: "radio", id: radioId, name: name, value: value, checked: checked, disabled: disabled, onChange: (e) => e.target.checked && onChange?.(value), className: "tokis-radio-native", "aria-describedby": descId }), (0, jsx_runtime_1.jsx)("span", { "aria-hidden": "true", className: "tokis-radio-control", "data-checked": checked ? 'true' : undefined }), (label || description) && ((0, jsx_runtime_1.jsxs)("div", { children: [label && (0, jsx_runtime_1.jsx)("span", { className: "tokis-radio-label", children: label }), description && (0, jsx_runtime_1.jsx)("p", { id: descId, className: "tokis-radio-description", children: description })] }))] }));
|
|
46
|
+
}
|
|
47
|
+
function RadioGroup({ value, onChange, name, orientation = 'vertical', disabled = false, children, className, label }) {
|
|
48
|
+
const groupId = (0, react_1.useId)();
|
|
49
|
+
return ((0, jsx_runtime_1.jsxs)("div", { role: "radiogroup", "aria-labelledby": label ? groupId : undefined, "aria-disabled": disabled, className: (0, cn_js_1.cn)('tokis-radio-group', orientation === 'horizontal' && 'tokis-radio-group--horizontal', className), children: [label && (0, jsx_runtime_1.jsx)("span", { id: groupId, className: "tokis-label", style: { marginBottom: 'var(--tokis-spacing-1)' }, children: label }), react_1.default.Children.map(children, (child) => {
|
|
50
|
+
if (!react_1.default.isValidElement(child))
|
|
51
|
+
return child;
|
|
52
|
+
const item = child;
|
|
53
|
+
return react_1.default.cloneElement(item, {
|
|
54
|
+
name: name ?? groupId,
|
|
55
|
+
checked: value !== undefined ? item.props.value === value : item.props.checked,
|
|
56
|
+
disabled: disabled || item.props.disabled,
|
|
57
|
+
onChange: (v) => onChange?.(v),
|
|
58
|
+
});
|
|
59
|
+
})] }));
|
|
60
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Result = Result;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const cn_js_1 = require("../../utils/cn");
|
|
6
|
+
const StatusIcon = ({ status }) => {
|
|
7
|
+
if (status === 'success') {
|
|
8
|
+
return ((0, jsx_runtime_1.jsxs)("svg", { width: "48", height: "48", viewBox: "0 0 48 48", fill: "none", "aria-hidden": "true", children: [(0, jsx_runtime_1.jsx)("circle", { cx: "24", cy: "24", r: "22", stroke: "currentColor", strokeWidth: "2" }), (0, jsx_runtime_1.jsx)("path", { d: "M14 24l7 7 13-14", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" })] }));
|
|
9
|
+
}
|
|
10
|
+
if (status === 'error') {
|
|
11
|
+
return ((0, jsx_runtime_1.jsxs)("svg", { width: "48", height: "48", viewBox: "0 0 48 48", fill: "none", "aria-hidden": "true", children: [(0, jsx_runtime_1.jsx)("circle", { cx: "24", cy: "24", r: "22", stroke: "currentColor", strokeWidth: "2" }), (0, jsx_runtime_1.jsx)("path", { d: "M16 16l16 16M32 16L16 32", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" })] }));
|
|
12
|
+
}
|
|
13
|
+
if (status === 'warning') {
|
|
14
|
+
return ((0, jsx_runtime_1.jsxs)("svg", { width: "48", height: "48", viewBox: "0 0 48 48", fill: "none", "aria-hidden": "true", children: [(0, jsx_runtime_1.jsx)("path", { d: "M24 6L42 40H6L24 6z", stroke: "currentColor", strokeWidth: "2", strokeLinejoin: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M24 20v10M24 34v2", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" })] }));
|
|
15
|
+
}
|
|
16
|
+
if (status === 'info') {
|
|
17
|
+
return ((0, jsx_runtime_1.jsxs)("svg", { width: "48", height: "48", viewBox: "0 0 48 48", fill: "none", "aria-hidden": "true", children: [(0, jsx_runtime_1.jsx)("circle", { cx: "24", cy: "24", r: "22", stroke: "currentColor", strokeWidth: "2" }), (0, jsx_runtime_1.jsx)("path", { d: "M24 22v12M24 16v2", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round" })] }));
|
|
18
|
+
}
|
|
19
|
+
// loading
|
|
20
|
+
return ((0, jsx_runtime_1.jsx)("svg", { width: "48", height: "48", viewBox: "0 0 48 48", fill: "none", "aria-hidden": "true", className: "tokis-result__spin", children: (0, jsx_runtime_1.jsx)("circle", { cx: "24", cy: "24", r: "20", stroke: "currentColor", strokeWidth: "3", strokeDasharray: "31.4 94.2", strokeLinecap: "round" }) }));
|
|
21
|
+
};
|
|
22
|
+
function Result({ status, title, description, extra, className }) {
|
|
23
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, cn_js_1.cn)('tokis-result', `tokis-result--${status}`, className), children: [(0, jsx_runtime_1.jsx)("div", { className: (0, cn_js_1.cn)('tokis-result__icon', `tokis-result__icon--${status}`), children: (0, jsx_runtime_1.jsx)(StatusIcon, { status: status }) }), (0, jsx_runtime_1.jsx)("h3", { className: "tokis-result__title", children: title }), description && (0, jsx_runtime_1.jsx)("p", { className: "tokis-result__description", children: description }), extra && (0, jsx_runtime_1.jsx)("div", { className: "tokis-result__extra", children: extra })] }));
|
|
24
|
+
}
|
|
25
|
+
Result.displayName = 'Result';
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SearchField = SearchField;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const cn_js_1 = require("../../utils/cn");
|
|
7
|
+
function SearchField({ value, onChange, onSearch, placeholder = 'Search…', loading = false, debounce = 300, label, className, }) {
|
|
8
|
+
const debounceRef = (0, react_1.useRef)();
|
|
9
|
+
const handleChange = (0, react_1.useCallback)((e) => {
|
|
10
|
+
const val = e.target.value;
|
|
11
|
+
onChange(val);
|
|
12
|
+
if (onSearch) {
|
|
13
|
+
clearTimeout(debounceRef.current);
|
|
14
|
+
debounceRef.current = setTimeout(() => onSearch(val), debounce);
|
|
15
|
+
}
|
|
16
|
+
}, [onChange, onSearch, debounce]);
|
|
17
|
+
const handleKeyDown = (0, react_1.useCallback)((e) => {
|
|
18
|
+
if (e.key === 'Enter' && onSearch) {
|
|
19
|
+
clearTimeout(debounceRef.current);
|
|
20
|
+
onSearch(value);
|
|
21
|
+
}
|
|
22
|
+
if (e.key === 'Escape') {
|
|
23
|
+
onChange('');
|
|
24
|
+
onSearch?.('');
|
|
25
|
+
}
|
|
26
|
+
}, [value, onChange, onSearch]);
|
|
27
|
+
(0, react_1.useEffect)(() => () => clearTimeout(debounceRef.current), []);
|
|
28
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, cn_js_1.cn)('tokis-search-field', className), children: [label && (0, jsx_runtime_1.jsx)("label", { className: "tokis-search-field__label", children: label }), (0, jsx_runtime_1.jsxs)("div", { className: "tokis-search-field__wrap", children: [(0, jsx_runtime_1.jsx)("span", { className: "tokis-search-field__icon", "aria-hidden": "true", children: (0, jsx_runtime_1.jsxs)("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", children: [(0, jsx_runtime_1.jsx)("circle", { cx: "6", cy: "6", r: "4", stroke: "currentColor", strokeWidth: "1.4" }), (0, jsx_runtime_1.jsx)("path", { d: "M9.5 9.5L12 12", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round" })] }) }), (0, jsx_runtime_1.jsx)("input", { type: "search", className: "tokis-search-field__input", value: value, onChange: handleChange, onKeyDown: handleKeyDown, placeholder: placeholder, "aria-label": label ?? placeholder }), loading && ((0, jsx_runtime_1.jsx)("span", { className: "tokis-search-field__spinner", "aria-label": "Searching\u2026" })), !loading && value && ((0, jsx_runtime_1.jsx)("button", { type: "button", className: "tokis-search-field__clear", onClick: () => { onChange(''); onSearch?.(''); }, "aria-label": "Clear search", children: (0, jsx_runtime_1.jsx)("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", children: (0, jsx_runtime_1.jsx)("path", { d: "M2 2l8 8M10 2l-8 8", stroke: "currentColor", strokeWidth: "1.4", strokeLinecap: "round" }) }) }))] })] }));
|
|
29
|
+
}
|
|
30
|
+
SearchField.displayName = 'SearchField';
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Select = Select;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const cn_js_1 = require("../../utils/cn");
|
|
7
|
+
const index_js_1 = require("../portal/index");
|
|
8
|
+
function Select({ value, defaultValue, onChange, options, placeholder = 'Select an option', disabled = false, label, helperText, error = false, required, id, className, size = 'md', }) {
|
|
9
|
+
const autoId = (0, react_1.useId)();
|
|
10
|
+
const selectId = id ?? `select-${autoId}`;
|
|
11
|
+
const [open, setOpen] = (0, react_1.useState)(false);
|
|
12
|
+
const [internalValue, setInternalValue] = (0, react_1.useState)(defaultValue ?? '');
|
|
13
|
+
const [focusedIndex, setFocusedIndex] = (0, react_1.useState)(-1);
|
|
14
|
+
const triggerRef = (0, react_1.useRef)(null);
|
|
15
|
+
const contentRef = (0, react_1.useRef)(null);
|
|
16
|
+
const [position, setPosition] = (0, react_1.useState)({ top: 0, left: 0, width: 0 });
|
|
17
|
+
const currentValue = value !== undefined ? value : internalValue;
|
|
18
|
+
const selectedOption = options.find((o) => o.value === currentValue);
|
|
19
|
+
const enabledOptions = options.filter((o) => !o.disabled);
|
|
20
|
+
const updatePosition = (0, react_1.useCallback)(() => {
|
|
21
|
+
if (!triggerRef.current)
|
|
22
|
+
return;
|
|
23
|
+
const rect = triggerRef.current.getBoundingClientRect();
|
|
24
|
+
setPosition({ top: rect.bottom + window.scrollY + 4, left: rect.left + window.scrollX, width: rect.width });
|
|
25
|
+
}, []);
|
|
26
|
+
const handleSelect = (val) => {
|
|
27
|
+
if (value === undefined)
|
|
28
|
+
setInternalValue(val);
|
|
29
|
+
onChange?.(val);
|
|
30
|
+
setOpen(false);
|
|
31
|
+
triggerRef.current?.focus();
|
|
32
|
+
};
|
|
33
|
+
const handleKeyDown = (e) => {
|
|
34
|
+
if (disabled)
|
|
35
|
+
return;
|
|
36
|
+
if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
|
|
37
|
+
e.preventDefault();
|
|
38
|
+
if (!open) {
|
|
39
|
+
updatePosition();
|
|
40
|
+
setOpen(true);
|
|
41
|
+
setFocusedIndex(0);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
setFocusedIndex((prev) => {
|
|
45
|
+
const next = e.key === 'ArrowDown' ? (prev + 1) % enabledOptions.length : (prev - 1 + enabledOptions.length) % enabledOptions.length;
|
|
46
|
+
return next;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
50
|
+
e.preventDefault();
|
|
51
|
+
if (!open) {
|
|
52
|
+
updatePosition();
|
|
53
|
+
setOpen(true);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (focusedIndex >= 0)
|
|
57
|
+
handleSelect(enabledOptions[focusedIndex].value);
|
|
58
|
+
}
|
|
59
|
+
if (e.key === 'Escape') {
|
|
60
|
+
setOpen(false);
|
|
61
|
+
triggerRef.current?.focus();
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
(0, react_1.useEffect)(() => {
|
|
65
|
+
if (!open)
|
|
66
|
+
return;
|
|
67
|
+
const handle = (e) => {
|
|
68
|
+
if (!triggerRef.current?.contains(e.target) && !contentRef.current?.contains(e.target)) {
|
|
69
|
+
setOpen(false);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
document.addEventListener('mousedown', handle);
|
|
73
|
+
return () => document.removeEventListener('mousedown', handle);
|
|
74
|
+
}, [open]);
|
|
75
|
+
const helperId = helperText ? `${selectId}-helper` : undefined;
|
|
76
|
+
const groups = [...new Set(options.map((o) => o.group))];
|
|
77
|
+
const hasGroups = groups.some(Boolean);
|
|
78
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, cn_js_1.cn)('tokis-field', className), children: [label && ((0, jsx_runtime_1.jsx)("label", { htmlFor: selectId, className: (0, cn_js_1.cn)('tokis-label', required && 'tokis-label--required'), children: label })), (0, jsx_runtime_1.jsxs)("button", { ref: triggerRef, id: selectId, type: "button", role: "combobox", "aria-expanded": open, "aria-haspopup": "listbox", "aria-describedby": helperId, "aria-invalid": error || undefined, "aria-required": required, "aria-disabled": disabled, className: (0, cn_js_1.cn)('tokis-select-trigger', size !== 'md' && `tokis-select-trigger--${size}`), "data-open": open || undefined, "data-disabled": disabled || undefined, disabled: disabled, onKeyDown: handleKeyDown, onClick: () => { if (!disabled) {
|
|
79
|
+
updatePosition();
|
|
80
|
+
setOpen((v) => !v);
|
|
81
|
+
} }, children: [(0, jsx_runtime_1.jsx)("span", { className: (0, cn_js_1.cn)(!selectedOption && 'tokis-select-trigger__placeholder'), children: selectedOption ? selectedOption.label : placeholder }), (0, jsx_runtime_1.jsx)("svg", { className: "tokis-select-trigger__icon", width: "16", height: "16", viewBox: "0 0 16 16", fill: "none", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("path", { d: "M4 6l4 4 4-4", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })] }), open && ((0, jsx_runtime_1.jsx)(index_js_1.Portal, { children: (0, jsx_runtime_1.jsx)("div", { ref: contentRef, role: "listbox", "aria-label": label, className: "tokis-select-content", style: { position: 'absolute', top: position.top, left: position.left, width: position.width }, children: hasGroups
|
|
82
|
+
? groups.map((group) => ((0, jsx_runtime_1.jsxs)("div", { children: [group && (0, jsx_runtime_1.jsx)("div", { className: "tokis-select-group-label", children: group }), options.filter((o) => o.group === group).map((opt) => ((0, jsx_runtime_1.jsx)(SelectItem, { opt: opt, currentValue: currentValue, onSelect: handleSelect }, opt.value)))] }, group ?? '__default__')))
|
|
83
|
+
: options.map((opt) => ((0, jsx_runtime_1.jsx)(SelectItem, { opt: opt, currentValue: currentValue, onSelect: handleSelect }, opt.value))) }) })), helperText && ((0, jsx_runtime_1.jsx)("span", { id: helperId, className: (0, cn_js_1.cn)('tokis-helper-text', error && 'tokis-helper-text--error'), children: helperText }))] }));
|
|
84
|
+
}
|
|
85
|
+
function SelectItem({ opt, currentValue, onSelect }) {
|
|
86
|
+
return ((0, jsx_runtime_1.jsxs)("div", { role: "option", "aria-selected": opt.value === currentValue, "aria-disabled": opt.disabled, className: "tokis-select-item", "data-selected": opt.value === currentValue ? 'true' : undefined, "data-disabled": opt.disabled ? 'true' : undefined, onClick: () => { if (!opt.disabled)
|
|
87
|
+
onSelect(opt.value); }, children: [opt.value === currentValue && ((0, jsx_runtime_1.jsx)("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: (0, jsx_runtime_1.jsx)("path", { d: "M2 7l3.5 3.5L12 3.5", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })), opt.label] }));
|
|
88
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Skeleton = void 0;
|
|
4
|
+
// Re-export Skeleton from progress
|
|
5
|
+
var index_js_1 = require("../progress/index");
|
|
6
|
+
Object.defineProperty(exports, "Skeleton", { enumerable: true, get: function () { return index_js_1.Skeleton; } });
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Slider = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const cn_js_1 = require("../../utils/cn");
|
|
7
|
+
exports.Slider = (0, react_1.forwardRef)(({ value, defaultValue = 0, min = 0, max = 100, step = 1, onChange, disabled = false, label, showValue = false, marks, className, ...props }, ref) => {
|
|
8
|
+
const [internal, setInternal] = (0, react_1.useState)(defaultValue);
|
|
9
|
+
const current = value ?? internal;
|
|
10
|
+
const trackRef = (0, react_1.useRef)(null);
|
|
11
|
+
const clamp = (v) => Math.min(max, Math.max(min, Math.round(v / step) * step));
|
|
12
|
+
const pct = ((current - min) / (max - min)) * 100;
|
|
13
|
+
const handleChange = (0, react_1.useCallback)((newVal) => {
|
|
14
|
+
const clamped = clamp(newVal);
|
|
15
|
+
if (value === undefined)
|
|
16
|
+
setInternal(clamped);
|
|
17
|
+
onChange?.(clamped);
|
|
18
|
+
}, [min, max, step, value, onChange]);
|
|
19
|
+
const handleKeyDown = (e) => {
|
|
20
|
+
if (disabled)
|
|
21
|
+
return;
|
|
22
|
+
if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {
|
|
23
|
+
e.preventDefault();
|
|
24
|
+
handleChange(current + step);
|
|
25
|
+
}
|
|
26
|
+
if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {
|
|
27
|
+
e.preventDefault();
|
|
28
|
+
handleChange(current - step);
|
|
29
|
+
}
|
|
30
|
+
if (e.key === 'Home') {
|
|
31
|
+
e.preventDefault();
|
|
32
|
+
handleChange(min);
|
|
33
|
+
}
|
|
34
|
+
if (e.key === 'End') {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
handleChange(max);
|
|
37
|
+
}
|
|
38
|
+
if (e.key === 'PageUp') {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
handleChange(current + step * 10);
|
|
41
|
+
}
|
|
42
|
+
if (e.key === 'PageDown') {
|
|
43
|
+
e.preventDefault();
|
|
44
|
+
handleChange(current - step * 10);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const handleTrackClick = (e) => {
|
|
48
|
+
if (disabled || !trackRef.current)
|
|
49
|
+
return;
|
|
50
|
+
const rect = trackRef.current.getBoundingClientRect();
|
|
51
|
+
const ratio = (e.clientX - rect.left) / rect.width;
|
|
52
|
+
handleChange(min + ratio * (max - min));
|
|
53
|
+
};
|
|
54
|
+
const markList = Array.isArray(marks)
|
|
55
|
+
? marks
|
|
56
|
+
: marks
|
|
57
|
+
? [{ value: min }, { value: max }]
|
|
58
|
+
: [];
|
|
59
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, cn_js_1.cn)('tokis-slider-root', className), "data-disabled": disabled || undefined, ...props, ref: ref, children: [label && ((0, jsx_runtime_1.jsxs)("div", { style: { display: 'flex', justifyContent: 'space-between', marginBottom: '8px' }, children: [(0, jsx_runtime_1.jsx)("span", { className: "tokis-label", children: label }), showValue && (0, jsx_runtime_1.jsx)("span", { className: "tokis-text--secondary", style: { fontSize: 'var(--tokis-font-size-sm)' }, children: current })] })), (0, jsx_runtime_1.jsxs)("div", { className: "tokis-slider-track-wrapper", children: [(0, jsx_runtime_1.jsx)("div", { ref: trackRef, className: "tokis-slider-track", onClick: handleTrackClick, children: (0, jsx_runtime_1.jsx)("div", { className: "tokis-slider-range", style: { width: `${pct}%` } }) }), (0, jsx_runtime_1.jsx)("div", { role: "slider", tabIndex: disabled ? -1 : 0, "aria-valuemin": min, "aria-valuemax": max, "aria-valuenow": current, "aria-label": label, "aria-disabled": disabled, className: "tokis-slider-thumb", style: { left: `${pct}%` }, onKeyDown: handleKeyDown, onMouseDown: (e) => {
|
|
60
|
+
if (disabled)
|
|
61
|
+
return;
|
|
62
|
+
e.preventDefault();
|
|
63
|
+
const move = (me) => {
|
|
64
|
+
if (!trackRef.current)
|
|
65
|
+
return;
|
|
66
|
+
const rect = trackRef.current.getBoundingClientRect();
|
|
67
|
+
handleChange(min + ((me.clientX - rect.left) / rect.width) * (max - min));
|
|
68
|
+
};
|
|
69
|
+
document.addEventListener('mousemove', move);
|
|
70
|
+
document.addEventListener('mouseup', () => document.removeEventListener('mousemove', move), { once: true });
|
|
71
|
+
} })] }), markList.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "tokis-slider-marks", children: markList.map((m) => ((0, jsx_runtime_1.jsx)("span", { className: "tokis-slider-mark-label", children: m.label ?? m.value }, m.value))) }))] }));
|
|
72
|
+
});
|
|
73
|
+
exports.Slider.displayName = 'Slider';
|