@_tc/template-core 0.2.1-bate.1 → 0.2.2

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.
Files changed (167) hide show
  1. package/README.md +34 -0
  2. package/fe/_virtual/_rolldown/runtime.js +13 -0
  3. package/fe/packages/react/ui/components/Date/Calendar.js +1 -5
  4. package/fe/packages/react/ui/components/Date/DateTestPage.js +15 -331
  5. package/fe/packages/react/ui/components/Date/LocaleContext.d.ts +1 -0
  6. package/fe/packages/react/ui/components/Date/index.js +2 -2
  7. package/fe/packages/react/ui/components/Date/locales.d.ts +5 -0
  8. package/fe/packages/react/ui/components/Date/locales.js +16 -1
  9. package/fe/packages/react/ui/components/testPage/DemoSection.d.ts +10 -0
  10. package/fe/packages/react/ui/components/testPage/DemoSection.js +73 -0
  11. package/fe/packages/react/ui/components/testPage/MenuTestPage.js +16 -389
  12. package/fe/packages/react/ui/components/testPage/demoRegistry.d.ts +4 -0
  13. package/fe/packages/react/ui/components/testPage/demoRegistry.js +214 -0
  14. package/fe/packages/react/ui/components/testPage/demos/core/BreadcrumbDemo.d.ts +6 -0
  15. package/fe/packages/react/ui/components/testPage/demos/core/BreadcrumbDemo.js +44 -0
  16. package/fe/packages/react/ui/components/testPage/demos/core/BreadcrumbDemo2.js +4 -0
  17. package/fe/packages/react/ui/components/testPage/demos/core/ButtonDemo.d.ts +6 -0
  18. package/fe/packages/react/ui/components/testPage/demos/core/ButtonDemo.js +85 -0
  19. package/fe/packages/react/ui/components/testPage/demos/core/ButtonDemo2.js +4 -0
  20. package/fe/packages/react/ui/components/testPage/demos/core/CardDemo.d.ts +6 -0
  21. package/fe/packages/react/ui/components/testPage/demos/core/CardDemo.js +52 -0
  22. package/fe/packages/react/ui/components/testPage/demos/core/CardDemo2.js +4 -0
  23. package/fe/packages/react/ui/components/testPage/demos/core/CheckboxDemo.d.ts +6 -0
  24. package/fe/packages/react/ui/components/testPage/demos/core/CheckboxDemo.js +41 -0
  25. package/fe/packages/react/ui/components/testPage/demos/core/CheckboxDemo2.js +4 -0
  26. package/fe/packages/react/ui/components/testPage/demos/core/ConfirmDialogDemo.d.ts +6 -0
  27. package/fe/packages/react/ui/components/testPage/demos/core/ConfirmDialogDemo.js +35 -0
  28. package/fe/packages/react/ui/components/testPage/demos/core/ConfirmDialogDemo2.js +4 -0
  29. package/fe/packages/react/ui/components/testPage/demos/core/DataTableDemo.d.ts +6 -0
  30. package/fe/packages/react/ui/components/testPage/demos/core/DataTableDemo.js +243 -0
  31. package/fe/packages/react/ui/components/testPage/demos/core/DataTableDemo2.js +4 -0
  32. package/fe/packages/react/ui/components/testPage/demos/core/DrawerDemo.d.ts +6 -0
  33. package/fe/packages/react/ui/components/testPage/demos/core/DrawerDemo.js +105 -0
  34. package/fe/packages/react/ui/components/testPage/demos/core/DrawerDemo2.js +4 -0
  35. package/fe/packages/react/ui/components/testPage/demos/core/DropdownDemo.d.ts +6 -0
  36. package/fe/packages/react/ui/components/testPage/demos/core/DropdownDemo.js +48 -0
  37. package/fe/packages/react/ui/components/testPage/demos/core/DropdownDemo2.js +4 -0
  38. package/fe/packages/react/ui/components/testPage/demos/core/FormDemo.d.ts +6 -0
  39. package/fe/packages/react/ui/components/testPage/demos/core/FormDemo.js +56 -0
  40. package/fe/packages/react/ui/components/testPage/demos/core/FormDemo2.js +4 -0
  41. package/fe/packages/react/ui/components/testPage/demos/core/ImageUploadDemo.d.ts +6 -0
  42. package/fe/packages/react/ui/components/testPage/demos/core/ImageUploadDemo.js +26 -0
  43. package/fe/packages/react/ui/components/testPage/demos/core/ImageUploadDemo2.js +4 -0
  44. package/fe/packages/react/ui/components/testPage/demos/core/InputDemo.d.ts +6 -0
  45. package/fe/packages/react/ui/components/testPage/demos/core/InputDemo.js +55 -0
  46. package/fe/packages/react/ui/components/testPage/demos/core/InputDemo2.js +4 -0
  47. package/fe/packages/react/ui/components/testPage/demos/core/InputNumberDemo.d.ts +6 -0
  48. package/fe/packages/react/ui/components/testPage/demos/core/InputNumberDemo.js +65 -0
  49. package/fe/packages/react/ui/components/testPage/demos/core/InputNumberDemo2.js +4 -0
  50. package/fe/packages/react/ui/components/testPage/demos/core/LabelDemo.d.ts +6 -0
  51. package/fe/packages/react/ui/components/testPage/demos/core/LabelDemo.js +33 -0
  52. package/fe/packages/react/ui/components/testPage/demos/core/LabelDemo2.js +4 -0
  53. package/fe/packages/react/ui/components/testPage/demos/core/LayoutDemo.d.ts +6 -0
  54. package/fe/packages/react/ui/components/testPage/demos/core/LayoutDemo.js +64 -0
  55. package/fe/packages/react/ui/components/testPage/demos/core/LayoutDemo2.js +4 -0
  56. package/fe/packages/react/ui/components/testPage/demos/core/LoadingDemo.d.ts +6 -0
  57. package/fe/packages/react/ui/components/testPage/demos/core/LoadingDemo.js +32 -0
  58. package/fe/packages/react/ui/components/testPage/demos/core/LoadingDemo2.js +4 -0
  59. package/fe/packages/react/ui/components/testPage/demos/core/MessageDemo.d.ts +6 -0
  60. package/fe/packages/react/ui/components/testPage/demos/core/MessageDemo.js +44 -0
  61. package/fe/packages/react/ui/components/testPage/demos/core/MessageDemo2.js +4 -0
  62. package/fe/packages/react/ui/components/testPage/demos/core/ModalDemo.d.ts +6 -0
  63. package/fe/packages/react/ui/components/testPage/demos/core/ModalDemo.js +61 -0
  64. package/fe/packages/react/ui/components/testPage/demos/core/ModalDemo2.js +4 -0
  65. package/fe/packages/react/ui/components/testPage/demos/core/NotificationDemo.d.ts +6 -0
  66. package/fe/packages/react/ui/components/testPage/demos/core/NotificationDemo.js +50 -0
  67. package/fe/packages/react/ui/components/testPage/demos/core/NotificationDemo2.js +4 -0
  68. package/fe/packages/react/ui/components/testPage/demos/core/PaginationDemo.d.ts +6 -0
  69. package/fe/packages/react/ui/components/testPage/demos/core/PaginationDemo.js +39 -0
  70. package/fe/packages/react/ui/components/testPage/demos/core/PaginationDemo2.js +4 -0
  71. package/fe/packages/react/ui/components/testPage/demos/core/PreviewImageDemo.d.ts +6 -0
  72. package/fe/packages/react/ui/components/testPage/demos/core/PreviewImageDemo.js +22 -0
  73. package/fe/packages/react/ui/components/testPage/demos/core/PreviewImageDemo2.js +4 -0
  74. package/fe/packages/react/ui/components/testPage/demos/core/RadioDemo.d.ts +6 -0
  75. package/fe/packages/react/ui/components/testPage/demos/core/RadioDemo.js +129 -0
  76. package/fe/packages/react/ui/components/testPage/demos/core/RadioDemo2.js +4 -0
  77. package/fe/packages/react/ui/components/testPage/demos/core/SchemaFormDemo.d.ts +6 -0
  78. package/fe/packages/react/ui/components/testPage/demos/core/SchemaFormDemo.js +52 -0
  79. package/fe/packages/react/ui/components/testPage/demos/core/SchemaFormDemo2.js +4 -0
  80. package/fe/packages/react/ui/components/testPage/demos/core/SearchDemo.d.ts +6 -0
  81. package/fe/packages/react/ui/components/testPage/demos/core/SearchDemo.js +52 -0
  82. package/fe/packages/react/ui/components/testPage/demos/core/SearchDemo2.js +4 -0
  83. package/fe/packages/react/ui/components/testPage/demos/core/SelectDemo.d.ts +6 -0
  84. package/fe/packages/react/ui/components/testPage/demos/core/SelectDemo.js +73 -0
  85. package/fe/packages/react/ui/components/testPage/demos/core/SelectDemo2.js +4 -0
  86. package/fe/packages/react/ui/components/testPage/demos/core/SkeletonDemo.d.ts +6 -0
  87. package/fe/packages/react/ui/components/testPage/demos/core/SkeletonDemo.js +46 -0
  88. package/fe/packages/react/ui/components/testPage/demos/core/SkeletonDemo2.js +4 -0
  89. package/fe/packages/react/ui/components/testPage/demos/core/SwitchDemo.d.ts +6 -0
  90. package/fe/packages/react/ui/components/testPage/demos/core/SwitchDemo.js +36 -0
  91. package/fe/packages/react/ui/components/testPage/demos/core/SwitchDemo2.js +4 -0
  92. package/fe/packages/react/ui/components/testPage/demos/core/TableDemo.d.ts +6 -0
  93. package/fe/packages/react/ui/components/testPage/demos/core/TableDemo.js +64 -0
  94. package/fe/packages/react/ui/components/testPage/demos/core/TableDemo2.js +4 -0
  95. package/fe/packages/react/ui/components/testPage/demos/core/TableSearchDemo.d.ts +6 -0
  96. package/fe/packages/react/ui/components/testPage/demos/core/TableSearchDemo.js +74 -0
  97. package/fe/packages/react/ui/components/testPage/demos/core/TableSearchDemo2.js +4 -0
  98. package/fe/packages/react/ui/components/testPage/demos/core/TabsDemo.d.ts +6 -0
  99. package/fe/packages/react/ui/components/testPage/demos/core/TabsDemo.js +56 -0
  100. package/fe/packages/react/ui/components/testPage/demos/core/TabsDemo2.js +4 -0
  101. package/fe/packages/react/ui/components/testPage/demos/core/TextareaDemo.d.ts +6 -0
  102. package/fe/packages/react/ui/components/testPage/demos/core/TextareaDemo.js +30 -0
  103. package/fe/packages/react/ui/components/testPage/demos/core/TextareaDemo2.js +4 -0
  104. package/fe/packages/react/ui/components/testPage/demos/core/ThemeSwitcher.d.ts +6 -0
  105. package/fe/packages/react/ui/components/testPage/demos/core/ThemeSwitcher.js +96 -0
  106. package/fe/packages/react/ui/components/testPage/demos/core/ThemeSwitcher2.js +4 -0
  107. package/fe/packages/react/ui/components/testPage/demos/core/TooltipDemo.d.ts +6 -0
  108. package/fe/packages/react/ui/components/testPage/demos/core/TooltipDemo.js +29 -0
  109. package/fe/packages/react/ui/components/testPage/demos/core/TooltipDemo2.js +4 -0
  110. package/fe/packages/react/ui/components/testPage/demos/core/TreeSelectDemo.d.ts +6 -0
  111. package/fe/packages/react/ui/components/testPage/demos/core/TreeSelectDemo.js +66 -0
  112. package/fe/packages/react/ui/components/testPage/demos/core/TreeSelectDemo2.js +4 -0
  113. package/fe/packages/react/ui/components/testPage/demos/date/DateBasicDemo.d.ts +6 -0
  114. package/fe/packages/react/ui/components/testPage/demos/date/DateBasicDemo.js +31 -0
  115. package/fe/packages/react/ui/components/testPage/demos/date/DateBasicDemo2.js +4 -0
  116. package/fe/packages/react/ui/components/testPage/demos/date/DateControlledDemo.d.ts +6 -0
  117. package/fe/packages/react/ui/components/testPage/demos/date/DateControlledDemo.js +67 -0
  118. package/fe/packages/react/ui/components/testPage/demos/date/DateControlledDemo2.js +4 -0
  119. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDateDemo.d.ts +6 -0
  120. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDateDemo.js +36 -0
  121. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDateDemo2.js +4 -0
  122. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDemo.d.ts +6 -0
  123. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDemo.js +35 -0
  124. package/fe/packages/react/ui/components/testPage/demos/date/DateDisabledDemo2.js +4 -0
  125. package/fe/packages/react/ui/components/testPage/demos/date/DateFormatDemo.d.ts +6 -0
  126. package/fe/packages/react/ui/components/testPage/demos/date/DateFormatDemo.js +35 -0
  127. package/fe/packages/react/ui/components/testPage/demos/date/DateFormatDemo2.js +4 -0
  128. package/fe/packages/react/ui/components/testPage/demos/date/DateRangeDemo.d.ts +6 -0
  129. package/fe/packages/react/ui/components/testPage/demos/date/DateRangeDemo.js +76 -0
  130. package/fe/packages/react/ui/components/testPage/demos/date/DateRangeDemo2.js +4 -0
  131. package/fe/packages/react/ui/components/testPage/demos/date/DateTimeDemo.d.ts +7 -0
  132. package/fe/packages/react/ui/components/testPage/demos/date/DateTimeDemo.js +60 -0
  133. package/fe/packages/react/ui/components/testPage/demos/date/DateTimeDemo2.js +4 -0
  134. package/fe/packages/react/ui/components/testPage/demos/menu/MenuAccordionDemo.d.ts +7 -0
  135. package/fe/packages/react/ui/components/testPage/demos/menu/MenuAccordionDemo.js +78 -0
  136. package/fe/packages/react/ui/components/testPage/demos/menu/MenuAccordionDemo2.js +4 -0
  137. package/fe/packages/react/ui/components/testPage/demos/menu/MenuClickTriggerDemo.d.ts +7 -0
  138. package/fe/packages/react/ui/components/testPage/demos/menu/MenuClickTriggerDemo.js +79 -0
  139. package/fe/packages/react/ui/components/testPage/demos/menu/MenuClickTriggerDemo2.js +4 -0
  140. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedDemo.d.ts +7 -0
  141. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedDemo.js +82 -0
  142. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedDemo2.js +4 -0
  143. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedNoIconDemo.d.ts +7 -0
  144. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedNoIconDemo.js +44 -0
  145. package/fe/packages/react/ui/components/testPage/demos/menu/MenuCollapsedNoIconDemo2.js +4 -0
  146. package/fe/packages/react/ui/components/testPage/demos/menu/MenuJsxDemo.d.ts +7 -0
  147. package/fe/packages/react/ui/components/testPage/demos/menu/MenuJsxDemo.js +64 -0
  148. package/fe/packages/react/ui/components/testPage/demos/menu/MenuJsxDemo2.js +4 -0
  149. package/fe/packages/react/ui/components/testPage/demos/menu/MenuLeftMultipleDemo.d.ts +7 -0
  150. package/fe/packages/react/ui/components/testPage/demos/menu/MenuLeftMultipleDemo.js +81 -0
  151. package/fe/packages/react/ui/components/testPage/demos/menu/MenuLeftMultipleDemo2.js +4 -0
  152. package/fe/packages/react/ui/components/testPage/demos/menu/MenuPopupDemo.d.ts +7 -0
  153. package/fe/packages/react/ui/components/testPage/demos/menu/MenuPopupDemo.js +56 -0
  154. package/fe/packages/react/ui/components/testPage/demos/menu/MenuPopupDemo2.js +4 -0
  155. package/fe/packages/react/ui/components/testPage/demos/menu/MenuStateDemo.d.ts +7 -0
  156. package/fe/packages/react/ui/components/testPage/demos/menu/MenuStateDemo.js +67 -0
  157. package/fe/packages/react/ui/components/testPage/demos/menu/MenuStateDemo2.js +4 -0
  158. package/fe/packages/react/ui/components/testPage/demos/menu/MenuTopDemo.d.ts +7 -0
  159. package/fe/packages/react/ui/components/testPage/demos/menu/MenuTopDemo.js +55 -0
  160. package/fe/packages/react/ui/components/testPage/demos/menu/MenuTopDemo2.js +4 -0
  161. package/fe/packages/react/ui/components/testPage/index.js +30 -1623
  162. package/fe/packages/react/ui/components/testPage/types.d.ts +17 -0
  163. package/fe/packages/react/ui/components/testPage/types.js +0 -0
  164. package/fe/packages/react/ui/i18n/I18nProvider.js +2 -1
  165. package/model/packages/react/ui/components/Date/LocaleContext.d.ts +1 -0
  166. package/model/packages/react/ui/components/Date/locales.d.ts +5 -0
  167. package/package.json +1 -1
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  TemplateCore 是一个基于 TypeScript、Koa、React 的后台框架包。它把后端约定式加载、前端 Dashboard、Schema CRUD 页面、model 类型和类型扩展放到同一个 npm 包里,项目只需要按目录补充自己的 `app/`、`model/`、`frontend/`。
4
4
 
5
+ 组件预览地址:https://t-c-s-p.allomg.qzz.io/ui-components
6
+
5
7
  ## 安装
6
8
 
7
9
  ```bash
@@ -465,6 +467,38 @@ setLanguage('ja-JP')
465
467
 
466
468
  `addLanguageResources()` 用于追加或新增某个语种的文案,默认会深合并同语种资源;传 `{ merge: false }` 可以替换该语种资源。`setResources(resources, { merge: true })` 可批量合并多语种资源。`LanguageSwitch` 默认会把已注册语种加入选项;需要自定义展示文案时仍可传入 `options`。
467
469
 
470
+ **覆盖组件内置文案**:
471
+
472
+ UI 组件库内置文案也在同一份资源里,统一放在 `components` 命名空间下。项目侧可以覆盖已有文案,也可以给新增语种补齐组件文案:
473
+
474
+ ```ts
475
+ import { addLanguageResources } from '@_tc/template-core/fe'
476
+
477
+ addLanguageResources('zh-CN', {
478
+ components: {
479
+ date: {
480
+ placeholder: '选择日期',
481
+ placeholderRange: '选择日期区间',
482
+ weekDays: ['日', '一', '二', '三', '四', '五', '六'],
483
+ monthFormat: 'yyyy年 M月',
484
+ },
485
+ tableSearch: {
486
+ search: '筛选',
487
+ reset: '清空',
488
+ },
489
+ },
490
+ })
491
+ ```
492
+
493
+ Date 组件除了文案,还依赖 `date-fns` locale 做月份格式化和周起止计算。新增非内置语种时同步注册:
494
+
495
+ ```ts
496
+ import { registerDateFnsLocale } from '@_tc/template-core/fe/rc/components/Date'
497
+ import { ja } from 'date-fns/locale'
498
+
499
+ registerDateFnsLocale('ja-JP', ja)
500
+ ```
501
+
468
502
  React 组件 render 中使用 `useText()` 读取文案。它会订阅语言和资源变化,调用 `setLanguage()` 后组件会自动重渲染。
469
503
 
470
504
  `useText()` / `getText()` 遇到 `$i18n::` 前缀会先去掉前缀再查语言资源;没有前缀时会直接把传入字符串作为 key 查询,查不到才原样返回:
@@ -0,0 +1,13 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __exportAll = (all, no_symbols) => {
4
+ let target = {};
5
+ for (var name in all) __defProp(target, name, {
6
+ get: all[name],
7
+ enumerable: true
8
+ });
9
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
10
+ return target;
11
+ };
12
+ //#endregion
13
+ export { __exportAll };
@@ -1,5 +1,3 @@
1
- import { useI18nStore } from "../../i18n/useI18n.js";
2
- import "../../i18n/index.js";
3
1
  import { cn } from "../../lib/utils.js";
4
2
  import { Button } from "../Button/Button.js";
5
3
  import "../Button/index.js";
@@ -10,16 +8,14 @@ import { useMemo, useState } from "react";
10
8
  import { jsx, jsxs } from "react/jsx-runtime";
11
9
  import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight } from "lucide-react";
12
10
  import { addMonths, addYears, eachDayOfInterval, endOfDay, endOfMonth, endOfWeek, format, isAfter, isBefore, isSameDay, isSameMonth, startOfDay, startOfMonth, startOfWeek, subDays, subMonths, subYears } from "date-fns";
13
- import { enUS, zhCN } from "date-fns/locale";
14
11
  //#region packages/react/ui/components/Date/Calendar.tsx
15
12
  function Calendar({ mode = ModeType.Single, value, onChange, disabledDate, showTime, className, locale: customLocale, quickRanges }) {
16
- const language = useI18nStore((state) => state.language);
17
13
  const contextLocale = useDateLocale();
18
14
  const locale = useMemo(() => ({
19
15
  ...contextLocale,
20
16
  ...customLocale
21
17
  }), [contextLocale, customLocale]);
22
- const dateFnsLocale = language === "zh-CN" ? zhCN : enUS;
18
+ const dateFnsLocale = locale.dateFnsLocale;
23
19
  const [pendingValue, setPendingValue] = useState(value ?? null);
24
20
  const [currentMonth, setCurrentMonth] = useState(() => {
25
21
  if (value instanceof Date) return value;
@@ -1,339 +1,23 @@
1
- import { DatePicker } from "./Date.js";
2
- import { useState } from "react";
1
+ import { DemoSection } from "../testPage/DemoSection.js";
2
+ import { dateDemos } from "../testPage/demoRegistry.js";
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
- import { startOfDay } from "date-fns";
5
4
  //#region packages/react/ui/components/Date/DateTestPage.tsx
6
5
  function DateTestPage() {
7
- const [date1, setDate1] = useState();
8
- const [dateTime1, setDateTime1] = useState();
9
- const [range, setRange] = useState();
10
- const [rangeWithTime, setRangeWithTime] = useState();
11
- const [emptyRange, setEmptyRange] = useState();
12
6
  return /* @__PURE__ */ jsxs("div", {
13
7
  className: "p-8 max-w-6xl mx-auto space-y-8",
14
- children: [
15
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", {
16
- className: "text-3xl font-bold mb-2",
17
- children: "Date 组件使用示例"
18
- }), /* @__PURE__ */ jsx("p", {
19
- className: "text-muted-foreground",
20
- children: "展示 DatePicker 组件的各种使用场景"
21
- })] }),
22
- /* @__PURE__ */ jsxs("section", {
23
- className: "space-y-4",
24
- children: [/* @__PURE__ */ jsx("h2", {
25
- className: "text-xl font-semibold",
26
- children: "1. 基本用法"
27
- }), /* @__PURE__ */ jsxs("div", {
28
- className: "grid grid-cols-2 gap-4",
29
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
30
- className: "text-sm text-muted-foreground mb-2",
31
- children: "单日期选择"
32
- }), /* @__PURE__ */ jsx(DatePicker, { placeholder: "请选择日期" })] }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
33
- className: "text-sm text-muted-foreground mb-2",
34
- children: "禁用清除按钮"
35
- }), /* @__PURE__ */ jsx(DatePicker, {
36
- placeholder: "请选择日期",
37
- allowClear: false
38
- })] })]
39
- })]
40
- }),
41
- /* @__PURE__ */ jsxs("section", {
42
- className: "space-y-4",
43
- children: [
44
- /* @__PURE__ */ jsx("h2", {
45
- className: "text-xl font-semibold",
46
- children: "2. 日期时间选择器 (showTime)"
47
- }),
48
- /* @__PURE__ */ jsx("p", {
49
- className: "text-sm text-muted-foreground",
50
- children: "时间选择器显示在日历右侧,提供更好的用户体验"
51
- }),
52
- /* @__PURE__ */ jsxs("div", {
53
- className: "grid grid-cols-2 gap-8",
54
- children: [/* @__PURE__ */ jsxs("div", { children: [
55
- /* @__PURE__ */ jsx("h3", {
56
- className: "text-sm font-medium mb-2",
57
- children: "基本用法 - 单日期时间"
58
- }),
59
- /* @__PURE__ */ jsx(DatePicker, {
60
- showTime: true,
61
- placeholder: "请选择日期时间"
62
- }),
63
- /* @__PURE__ */ jsx("p", {
64
- className: "text-xs text-muted-foreground mt-2",
65
- children: "点击输入框打开选择器,时间选择器在右侧显示"
66
- })
67
- ] }), /* @__PURE__ */ jsxs("div", { children: [
68
- /* @__PURE__ */ jsx("h3", {
69
- className: "text-sm font-medium mb-2",
70
- children: "受控模式"
71
- }),
72
- /* @__PURE__ */ jsx(DatePicker, {
73
- showTime: true,
74
- value: dateTime1,
75
- onChange: (val, date) => {
76
- setDateTime1(val);
77
- console.log("选中日期时间:", val);
78
- console.log("Date 对象:", date);
79
- },
80
- placeholder: "受控日期时间选择器"
81
- }),
82
- /* @__PURE__ */ jsxs("p", {
83
- className: "text-sm text-muted-foreground mt-2",
84
- children: ["选中的值: ", /* @__PURE__ */ jsx("code", {
85
- className: "text-xs bg-muted px-1 py-0.5 rounded",
86
- children: String(dateTime1 || "未选择")
87
- })]
88
- })
89
- ] })]
90
- })
91
- ]
92
- }),
93
- /* @__PURE__ */ jsxs("section", {
94
- className: "space-y-4",
95
- children: [/* @__PURE__ */ jsx("h2", {
96
- className: "text-xl font-semibold",
97
- children: "3. 范围选择 (Range Picker)"
98
- }), /* @__PURE__ */ jsxs("div", {
99
- className: "grid grid-cols-2 gap-8",
100
- children: [/* @__PURE__ */ jsxs("div", { children: [
101
- /* @__PURE__ */ jsx("h3", {
102
- className: "text-sm font-medium mb-2",
103
- children: "基本范围选择"
104
- }),
105
- /* @__PURE__ */ jsx(DatePicker, {
106
- mode: "range",
107
- value: emptyRange,
108
- onChange: (val) => {
109
- setEmptyRange(val);
110
- console.log("范围选择:", val);
111
- },
112
- placeholder: "选择日期范围"
113
- }),
114
- /* @__PURE__ */ jsxs("p", {
115
- className: "text-sm text-muted-foreground mt-2",
116
- children: ["值: ", /* @__PURE__ */ jsx("code", {
117
- className: "text-xs bg-muted px-1 py-0.5 rounded",
118
- children: JSON.stringify(emptyRange || "未选择")
119
- })]
120
- })
121
- ] }), /* @__PURE__ */ jsxs("div", { children: [
122
- /* @__PURE__ */ jsx("h3", {
123
- className: "text-sm font-medium mb-2",
124
- children: "范围选择 + 时间选择"
125
- }),
126
- /* @__PURE__ */ jsx(DatePicker, {
127
- mode: "range",
128
- value: rangeWithTime,
129
- showTime: true,
130
- onChange: (val) => {
131
- setRangeWithTime(val);
132
- console.log("范围时间选择:", val);
133
- },
134
- placeholder: "选择日期时间范围"
135
- }),
136
- /* @__PURE__ */ jsxs("p", {
137
- className: "text-sm text-muted-foreground mt-2",
138
- children: [
139
- "值:",
140
- " ",
141
- /* @__PURE__ */ jsx("code", {
142
- className: "text-xs bg-muted px-1 py-0.5 rounded",
143
- children: JSON.stringify(rangeWithTime || "未选择")
144
- })
145
- ]
146
- }),
147
- /* @__PURE__ */ jsx("p", {
148
- className: "text-xs text-muted-foreground mt-1",
149
- children: "选择开始日期后,右侧会显示开始时间选择器;选择结束日期后,会显示结束时间选择器"
150
- })
151
- ] })]
152
- })]
153
- }),
154
- /* @__PURE__ */ jsxs("section", {
155
- className: "space-y-4",
156
- children: [/* @__PURE__ */ jsx("h2", {
157
- className: "text-xl font-semibold",
158
- children: "4. 受控模式"
159
- }), /* @__PURE__ */ jsxs("div", {
160
- className: "grid grid-cols-2 gap-4",
161
- children: [/* @__PURE__ */ jsxs("div", { children: [
162
- /* @__PURE__ */ jsx("p", {
163
- className: "text-sm text-muted-foreground mb-2",
164
- children: "单日期受控"
165
- }),
166
- /* @__PURE__ */ jsx(DatePicker, {
167
- value: date1,
168
- onChange: (date, dateString) => {
169
- setDate1(date);
170
- console.log("选中日期:", date);
171
- console.log("日期字符串:", dateString);
172
- },
173
- placeholder: "受控日期选择器"
174
- }),
175
- /* @__PURE__ */ jsxs("p", {
176
- className: "text-sm text-muted-foreground mt-2",
177
- children: ["选中的日期: ", /* @__PURE__ */ jsx("code", {
178
- className: "text-xs bg-muted px-1 py-0.5 rounded",
179
- children: String(date1 || "未选择")
180
- })]
181
- })
182
- ] }), /* @__PURE__ */ jsxs("div", { children: [
183
- /* @__PURE__ */ jsx("p", {
184
- className: "text-sm text-muted-foreground mb-2",
185
- children: "范围受控"
186
- }),
187
- /* @__PURE__ */ jsx(DatePicker, {
188
- mode: "range",
189
- value: range,
190
- onChange: (val) => {
191
- setRange(val);
192
- console.log("范围变化:", val);
193
- },
194
- placeholder: "受控范围选择器"
195
- }),
196
- /* @__PURE__ */ jsxs("p", {
197
- className: "text-sm text-muted-foreground mt-2",
198
- children: ["值: ", /* @__PURE__ */ jsx("code", {
199
- className: "text-xs bg-muted px-1 py-0.5 rounded",
200
- children: JSON.stringify(range || "未选择")
201
- })]
202
- })
203
- ] })]
204
- })]
205
- }),
206
- /* @__PURE__ */ jsxs("section", {
207
- className: "space-y-4",
208
- children: [/* @__PURE__ */ jsx("h2", {
209
- className: "text-xl font-semibold",
210
- children: "5. 禁用日期"
211
- }), /* @__PURE__ */ jsxs("div", {
212
- className: "grid grid-cols-2 gap-4",
213
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
214
- className: "text-sm text-muted-foreground mb-2",
215
- children: "只能选择今天及以后"
216
- }), /* @__PURE__ */ jsx(DatePicker, {
217
- disabledDate: (current) => current < startOfDay(/* @__PURE__ */ new Date()),
218
- placeholder: "选择未来日期"
219
- })] }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
220
- className: "text-sm text-muted-foreground mb-2",
221
- children: "范围选择(禁用过去)"
222
- }), /* @__PURE__ */ jsx(DatePicker, {
223
- mode: "range",
224
- disabledDate: (current) => current < startOfDay(/* @__PURE__ */ new Date()),
225
- placeholder: "选择未来范围"
226
- })] })]
227
- })]
228
- }),
229
- /* @__PURE__ */ jsxs("section", {
230
- className: "space-y-4",
231
- children: [/* @__PURE__ */ jsx("h2", {
232
- className: "text-xl font-semibold",
233
- children: "6. 禁用状态"
234
- }), /* @__PURE__ */ jsxs("div", {
235
- className: "grid grid-cols-2 gap-4",
236
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
237
- className: "text-sm text-muted-foreground mb-2",
238
- children: "禁用状态"
239
- }), /* @__PURE__ */ jsx(DatePicker, {
240
- disabled: true,
241
- placeholder: "禁用状态"
242
- })] }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
243
- className: "text-sm text-muted-foreground mb-2",
244
- children: "禁用状态 + 有值"
245
- }), /* @__PURE__ */ jsx(DatePicker, {
246
- disabled: true,
247
- value: "2024-01-15",
248
- placeholder: "禁用状态"
249
- })] })]
250
- })]
251
- }),
252
- /* @__PURE__ */ jsxs("section", {
253
- className: "space-y-4",
254
- children: [/* @__PURE__ */ jsx("h2", {
255
- className: "text-xl font-semibold",
256
- children: "7. 自定义格式"
257
- }), /* @__PURE__ */ jsxs("div", {
258
- className: "grid grid-cols-2 gap-4",
259
- children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
260
- className: "text-sm text-muted-foreground mb-2",
261
- children: "自定义日期格式"
262
- }), /* @__PURE__ */ jsx(DatePicker, {
263
- format: "yyyy/MM/dd",
264
- placeholder: "选择日期 (yyyy/MM/dd)"
265
- })] }), /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("p", {
266
- className: "text-sm text-muted-foreground mb-2",
267
- children: "自定义日期时间格式"
268
- }), /* @__PURE__ */ jsx(DatePicker, {
269
- showTime: true,
270
- format: "yyyy-MM-dd HH:mm:ss",
271
- placeholder: "选择日期时间 (yyyy-MM-dd HH:mm:ss)"
272
- })] })]
273
- })]
274
- }),
275
- /* @__PURE__ */ jsxs("section", {
276
- className: "space-y-4 border-t pt-6",
277
- children: [/* @__PURE__ */ jsx("h2", {
278
- className: "text-xl font-semibold",
279
- children: "API 说明"
280
- }), /* @__PURE__ */ jsxs("div", {
281
- className: "bg-muted/50 p-4 rounded-lg space-y-2 text-sm",
282
- children: [
283
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
284
- className: "font-semibold",
285
- children: "showTime"
286
- }), /* @__PURE__ */ jsx("span", {
287
- className: "text-muted-foreground ml-2",
288
- children: ": boolean - 是否显示时间选择器,时间选择器会显示在日历右侧"
289
- })] }),
290
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
291
- className: "font-semibold",
292
- children: "mode"
293
- }), /* @__PURE__ */ jsx("span", {
294
- className: "text-muted-foreground ml-2",
295
- children: ": 'single' | 'range' - 选择模式,single 为单日期,range 为日期范围"
296
- })] }),
297
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
298
- className: "font-semibold",
299
- children: "value"
300
- }), /* @__PURE__ */ jsx("span", {
301
- className: "text-muted-foreground ml-2",
302
- children: ": string | [string, string] - 受控模式的值"
303
- })] }),
304
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
305
- className: "font-semibold",
306
- children: "onChange"
307
- }), /* @__PURE__ */ jsxs("span", {
308
- className: "text-muted-foreground ml-2",
309
- children: [
310
- ": (value?: DateChangeStrValue, date?: Date | DateRange) =",
311
- ">",
312
- " void - 值变化回调"
313
- ]
314
- })] }),
315
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
316
- className: "font-semibold",
317
- children: "format"
318
- }), /* @__PURE__ */ jsx("span", {
319
- className: "text-muted-foreground ml-2",
320
- children: ": string - 日期格式,默认 'yyyy-MM-dd',showTime 时为 'yyyy-MM-dd HH:mm'"
321
- })] }),
322
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("code", {
323
- className: "font-semibold",
324
- children: "disabledDate"
325
- }), /* @__PURE__ */ jsxs("span", {
326
- className: "text-muted-foreground ml-2",
327
- children: [
328
- ": (current: Date) =",
329
- ">",
330
- " boolean - 禁用日期的判断函数"
331
- ]
332
- })] })
333
- ]
334
- })]
335
- })
336
- ]
8
+ children: [/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h1", {
9
+ className: "text-3xl font-bold mb-2",
10
+ children: "Date 组件使用示例"
11
+ }), /* @__PURE__ */ jsx("p", {
12
+ className: "text-muted-foreground",
13
+ children: "展示 DatePicker 组件的各种使用场景"
14
+ })] }), dateDemos.map(({ id, Component, meta, source }) => /* @__PURE__ */ jsx(DemoSection, {
15
+ title: meta.title,
16
+ description: meta.description,
17
+ source,
18
+ contentClassName: meta.contentClassName,
19
+ children: /* @__PURE__ */ jsx(Component, {})
20
+ }, id))]
337
21
  });
338
22
  }
339
23
  //#endregion
@@ -1,6 +1,7 @@
1
1
  import { type DateLocaleConfig } from "./locales";
2
2
  export declare const DateLocaleContext: import("react").Context<Partial<DateLocaleConfig> | undefined>;
3
3
  export declare const useDateLocale: () => {
4
+ dateFnsLocale?: import("date-fns").Locale;
4
5
  placeholder: string;
5
6
  placeholderDateTime: string;
6
7
  placeholderRange: string;
@@ -1,6 +1,6 @@
1
- import { defaultLocale, enUSLocale, getDateLocale, zhCNLocale } from "./locales.js";
1
+ import { defaultLocale, enUSLocale, getDateFnsLocale, getDateLocale, registerDateFnsLocale, registerDateFnsLocales, zhCNLocale } from "./locales.js";
2
2
  import { useDateLocaleStore } from "./dateLocaleStore.js";
3
3
  import { useDateLocale } from "./LocaleContext.js";
4
4
  import { DatePicker } from "./Date.js";
5
5
  import { DateLocaleProvider } from "./LocaleProvider.js";
6
- export { DateLocaleProvider, DatePicker, defaultLocale, enUSLocale, getDateLocale, useDateLocale, useDateLocaleStore, zhCNLocale };
6
+ export { DateLocaleProvider, DatePicker, defaultLocale, enUSLocale, getDateFnsLocale, getDateLocale, registerDateFnsLocale, registerDateFnsLocales, useDateLocale, useDateLocaleStore, zhCNLocale };
@@ -1,5 +1,7 @@
1
1
  import type { I18nTranslateState } from "../../../../common/i18n/index";
2
+ import type { Locale as DateFnsLocale } from "date-fns";
2
3
  export interface DateLocaleConfig {
4
+ dateFnsLocale?: DateFnsLocale;
3
5
  placeholder: string;
4
6
  placeholderDateTime: string;
5
7
  placeholderRange: string;
@@ -19,6 +21,9 @@ export interface DateLocaleConfig {
19
21
  quickRangeLastYear: string;
20
22
  clear: string;
21
23
  }
24
+ export declare const registerDateFnsLocale: (language: string, locale: DateFnsLocale) => void;
25
+ export declare const registerDateFnsLocales: (locales: Record<string, DateFnsLocale>) => void;
26
+ export declare const getDateFnsLocale: (language: string, fallbackLanguage?: string) => DateFnsLocale;
22
27
  export declare const getDateLocale: (state: I18nTranslateState) => DateLocaleConfig;
23
28
  export declare const zhCNLocale: DateLocaleConfig;
24
29
  export declare const enUSLocale: DateLocaleConfig;
@@ -1,6 +1,21 @@
1
1
  import { i18nStore, translate } from "../../../../common/i18n/index.js";
2
+ import { enUS, zhCN } from "date-fns/locale";
2
3
  //#region packages/react/ui/components/Date/locales.ts
4
+ var dateFnsLocaleMap = {
5
+ "zh-CN": zhCN,
6
+ "en-US": enUS
7
+ };
8
+ var registerDateFnsLocale = (language, locale) => {
9
+ dateFnsLocaleMap[language] = locale;
10
+ };
11
+ var registerDateFnsLocales = (locales) => {
12
+ Object.assign(dateFnsLocaleMap, locales);
13
+ };
14
+ var getDateFnsLocale = (language, fallbackLanguage) => {
15
+ return dateFnsLocaleMap[language] ?? (fallbackLanguage ? dateFnsLocaleMap[fallbackLanguage] : void 0) ?? zhCN;
16
+ };
3
17
  var getDateLocale = (state) => ({
18
+ dateFnsLocale: getDateFnsLocale(state.language, state.fallbackLanguage),
4
19
  placeholder: translate(state, "components.date.placeholder"),
5
20
  placeholderDateTime: translate(state, "components.date.placeholderDateTime"),
6
21
  placeholderRange: translate(state, "components.date.placeholderRange"),
@@ -38,4 +53,4 @@ var enUSLocale = { ...getDateLocaleByLanguage("en-US") };
38
53
  */
39
54
  var defaultLocale = zhCNLocale;
40
55
  //#endregion
41
- export { defaultLocale, enUSLocale, getDateLocale, zhCNLocale };
56
+ export { defaultLocale, enUSLocale, getDateFnsLocale, getDateLocale, registerDateFnsLocale, registerDateFnsLocales, zhCNLocale };
@@ -0,0 +1,10 @@
1
+ import { type ReactNode } from "react";
2
+ type DemoSectionProps = {
3
+ title: string;
4
+ description?: string;
5
+ source?: string;
6
+ children: ReactNode;
7
+ contentClassName?: string;
8
+ };
9
+ export declare function DemoSection({ title, description, source, children, contentClassName }: DemoSectionProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
@@ -0,0 +1,73 @@
1
+ import { Button } from "../Button/Button.js";
2
+ import "../Button/index.js";
3
+ import { useRef, useState } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Check, Code2, Copy, Eye } from "lucide-react";
6
+ //#region packages/react/ui/components/testPage/DemoSection.tsx
7
+ function DemoSection({ title, description, source, children, contentClassName }) {
8
+ const [showSource, setShowSource] = useState(false);
9
+ const [copyStatus, setCopyStatus] = useState("idle");
10
+ const timerRef = useRef(void 0);
11
+ const sourceText = source?.trim();
12
+ const resetCopyStatus = (nextStatus) => {
13
+ setCopyStatus(nextStatus);
14
+ if (timerRef.current) clearTimeout(timerRef.current);
15
+ timerRef.current = setTimeout(() => setCopyStatus("idle"), 1400);
16
+ };
17
+ const handleCopy = async () => {
18
+ if (!sourceText) return;
19
+ try {
20
+ await navigator.clipboard.writeText(sourceText);
21
+ resetCopyStatus("copied");
22
+ } catch {
23
+ resetCopyStatus("failed");
24
+ }
25
+ };
26
+ return /* @__PURE__ */ jsxs("section", {
27
+ className: "mb-8",
28
+ children: [
29
+ /* @__PURE__ */ jsx("div", {
30
+ className: "mb-3 border-b pb-2",
31
+ children: /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h2", {
32
+ className: "text-lg font-semibold leading-7",
33
+ children: title
34
+ }), description && /* @__PURE__ */ jsx("p", {
35
+ className: "mt-1 text-sm text-muted-foreground",
36
+ children: description
37
+ })] })
38
+ }),
39
+ /* @__PURE__ */ jsx("div", {
40
+ className: contentClassName,
41
+ children
42
+ }),
43
+ sourceText && /* @__PURE__ */ jsxs("div", {
44
+ className: "mt-4 flex flex-wrap items-center gap-2 border-t border-border/70 pt-3",
45
+ children: [/* @__PURE__ */ jsx(Button, {
46
+ size: "sm",
47
+ variant: showSource ? "primary" : "default",
48
+ leftIcon: showSource ? /* @__PURE__ */ jsx(Eye, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Code2, { className: "h-4 w-4" }),
49
+ onClick: () => setShowSource((visible) => !visible),
50
+ children: showSource ? "收起源码" : "查看源码"
51
+ }), showSource && /* @__PURE__ */ jsx(Button, {
52
+ size: "sm",
53
+ variant: "text",
54
+ leftIcon: copyStatus === "copied" ? /* @__PURE__ */ jsx(Check, { className: "h-4 w-4" }) : /* @__PURE__ */ jsx(Copy, { className: "h-4 w-4" }),
55
+ onClick: handleCopy,
56
+ children: copyStatus === "copied" ? "已复制" : copyStatus === "failed" ? "复制失败" : "复制"
57
+ })]
58
+ }),
59
+ showSource && sourceText && /* @__PURE__ */ jsx("div", {
60
+ className: "mt-4 overflow-hidden rounded-lg border border-border bg-muted/40",
61
+ children: /* @__PURE__ */ jsx("pre", {
62
+ className: "max-h-[520px] overflow-x-auto overflow-y-auto p-4 text-xs leading-6 text-foreground",
63
+ children: /* @__PURE__ */ jsx("code", {
64
+ className: "block min-w-max whitespace-pre font-mono",
65
+ children: sourceText
66
+ })
67
+ })
68
+ })
69
+ ]
70
+ });
71
+ }
72
+ //#endregion
73
+ export { DemoSection };