@fangxinyan/lumina 0.6.14 → 0.6.16

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 (41) hide show
  1. package/dist/{Calendar-RUTPKREW.css → Calendar-I6NHCXIB.css} +65 -0
  2. package/dist/Calendar.cjs +2 -2
  3. package/dist/Calendar.d.cts +2 -0
  4. package/dist/Calendar.d.ts +2 -0
  5. package/dist/Calendar.js +1 -1
  6. package/dist/DatePicker-VDVSIARF.css +60 -0
  7. package/dist/DatePicker.cjs +16 -0
  8. package/dist/DatePicker.d.cts +49 -0
  9. package/dist/DatePicker.d.ts +49 -0
  10. package/dist/DatePicker.js +7 -0
  11. package/dist/DateTimePicker-DRX7XA74.css +224 -0
  12. package/dist/DateTimePicker.cjs +16 -0
  13. package/dist/DateTimePicker.d.cts +61 -0
  14. package/dist/DateTimePicker.d.ts +61 -0
  15. package/dist/DateTimePicker.js +7 -0
  16. package/dist/TimePicker-ZBJOXH3U.css +151 -0
  17. package/dist/TimePicker.cjs +15 -0
  18. package/dist/TimePicker.d.cts +63 -0
  19. package/dist/TimePicker.d.ts +63 -0
  20. package/dist/TimePicker.js +6 -0
  21. package/dist/chunk-32FWB5NO.cjs +505 -0
  22. package/dist/chunk-4KDABJSY.cjs +241 -0
  23. package/dist/chunk-DU4VSUBF.js +393 -0
  24. package/dist/chunk-FKP5D5IS.js +271 -0
  25. package/dist/chunk-I7TOBKJO.js +219 -0
  26. package/dist/chunk-KHRYPNUV.cjs +293 -0
  27. package/dist/chunk-SFEWMO45.cjs +415 -0
  28. package/dist/chunk-YPE6CDXQ.js +483 -0
  29. package/dist/index.cjs +66 -51
  30. package/dist/index.d.cts +4 -1
  31. package/dist/index.d.ts +4 -1
  32. package/dist/index.js +15 -12
  33. package/dist/styles.css +439 -0
  34. package/docs/llms/calendar.md +2 -1
  35. package/docs/llms/datepicker.md +69 -0
  36. package/docs/llms/datetimepicker.md +83 -0
  37. package/docs/llms/timepicker.md +81 -0
  38. package/docs/llms.md +5 -2
  39. package/package.json +7 -3
  40. package/dist/chunk-XG5D777V.js +0 -90
  41. package/dist/chunk-ZBTGYTQE.cjs +0 -112
package/dist/index.d.cts CHANGED
@@ -24,7 +24,10 @@ export { Alert, AlertProps, AlertTone } from './Alert.cjs';
24
24
  export { ExpandableConfig, PaginationConfig, RowKey, RowSelectionConfig, Table, TableColumn, TableColumnFilterItem, TableProps, TableScrollConfig, TableVariant } from './Table.cjs';
25
25
  export { TablePro, TableProProps } from './TablePro.cjs';
26
26
  export { Pagination, PaginationProps } from './Pagination.cjs';
27
+ export { DatePicker, DatePickerFormat, DatePickerProps, DatePickerSize } from './DatePicker.cjs';
28
+ export { DateTimePicker, DateTimePickerFormat, DateTimePickerProps, DateTimePickerSize } from './DateTimePicker.cjs';
27
29
  export { Calendar, CalendarProps } from './Calendar.cjs';
30
+ export { TimePicker, TimePickerFormat, TimePickerProps, TimePickerSize, TimePickerValue } from './TimePicker.cjs';
28
31
  export { List, ListItem, ListProps } from './List.cjs';
29
32
  export { AppShell, AppShellProps, Sidebar, SidebarItem, SidebarProps, TitleBar, TitleBarProps, WindowControls, WindowControlsProps } from './AppShell.cjs';
30
33
  export { StatusBar, StatusBarItem, StatusBarItemProps, StatusBarProps } from './StatusBar.cjs';
@@ -49,6 +52,6 @@ import 'react/jsx-runtime';
49
52
  import 'react';
50
53
 
51
54
  /** Package version — bumped by release scripts. */
52
- declare const VERSION = "0.6.14";
55
+ declare const VERSION = "0.6.16";
53
56
 
54
57
  export { VERSION };
package/dist/index.d.ts CHANGED
@@ -24,7 +24,10 @@ export { Alert, AlertProps, AlertTone } from './Alert.js';
24
24
  export { ExpandableConfig, PaginationConfig, RowKey, RowSelectionConfig, Table, TableColumn, TableColumnFilterItem, TableProps, TableScrollConfig, TableVariant } from './Table.js';
25
25
  export { TablePro, TableProProps } from './TablePro.js';
26
26
  export { Pagination, PaginationProps } from './Pagination.js';
27
+ export { DatePicker, DatePickerFormat, DatePickerProps, DatePickerSize } from './DatePicker.js';
28
+ export { DateTimePicker, DateTimePickerFormat, DateTimePickerProps, DateTimePickerSize } from './DateTimePicker.js';
27
29
  export { Calendar, CalendarProps } from './Calendar.js';
30
+ export { TimePicker, TimePickerFormat, TimePickerProps, TimePickerSize, TimePickerValue } from './TimePicker.js';
28
31
  export { List, ListItem, ListProps } from './List.js';
29
32
  export { AppShell, AppShellProps, Sidebar, SidebarItem, SidebarProps, TitleBar, TitleBarProps, WindowControls, WindowControlsProps } from './AppShell.js';
30
33
  export { StatusBar, StatusBarItem, StatusBarItemProps, StatusBarProps } from './StatusBar.js';
@@ -49,6 +52,6 @@ import 'react/jsx-runtime';
49
52
  import 'react';
50
53
 
51
54
  /** Package version — bumped by release scripts. */
52
- declare const VERSION = "0.6.14";
55
+ declare const VERSION = "0.6.16";
53
56
 
54
57
  export { VERSION };
package/dist/index.js CHANGED
@@ -1,8 +1,12 @@
1
- export { Tabs } from './chunk-ZTCRD2FL.js';
2
- export { THEME_PANEL_DEFAULT_PRESET_OPTIONS, THEME_PANEL_DEFAULT_THEME_PRESETS, ThemePanel } from './chunk-3VSHGM54.js';
3
1
  export { Timeline } from './chunk-OTSDPQPV.js';
4
2
  export { Tooltip } from './chunk-MOZ52KN6.js';
5
3
  export { Link, Paragraph, Text, Title, Typography } from './chunk-6HF6UF73.js';
4
+ export { TablePro } from './chunk-QNN3YV2P.js';
5
+ export { Table } from './chunk-4YSGGZDB.js';
6
+ export { Tabs } from './chunk-ZTCRD2FL.js';
7
+ export { THEME_PANEL_DEFAULT_PRESET_OPTIONS, THEME_PANEL_DEFAULT_THEME_PRESETS, ThemePanel } from './chunk-3VSHGM54.js';
8
+ export { TimePicker } from './chunk-DU4VSUBF.js';
9
+ export { Skeleton } from './chunk-R3DTXVP2.js';
6
10
  export { Slider } from './chunk-D7GK6H6V.js';
7
11
  export { Splitter } from './chunk-IZHH6CVY.js';
8
12
  export { StatusBar, StatusBarItem } from './chunk-TYLDISRK.js';
@@ -10,23 +14,22 @@ export { SURFACE_THEME_PRESETS, Surface } from './chunk-JFL2WMJZ.js';
10
14
  import './chunk-6SPMHY54.js';
11
15
  export { ACCENT_PRESETS, ACCENT_PRESETS_DARK, FONT_STACKS, ThemeProvider, applyTheme, normalizeAccentInput, resolveThemeColorScheme, resolveThemeMode, useTheme, useThemeOptional } from './chunk-GNV6W4BN.js';
12
16
  export { Switch } from './chunk-PU7VXDAS.js';
13
- export { TablePro } from './chunk-QNN3YV2P.js';
14
- export { Table } from './chunk-4YSGGZDB.js';
17
+ export { InputNumber } from './chunk-3VXGZ3SJ.js';
18
+ export { List } from './chunk-YAFDVNXT.js';
15
19
  export { MessageContainer, ToastContainer, message, toast } from './chunk-P64NPZBG.js';
16
20
  export { Modal } from './chunk-BVQOJKRX.js';
17
21
  export { Pagination } from './chunk-6LC4QROE.js';
22
+ export { Select } from './chunk-6PHPRZTT.js';
23
+ export { Tag } from './chunk-6K5YI4ZE.js';
18
24
  export { Popover } from './chunk-I777JTTG.js';
19
25
  export { Progress } from './chunk-KMPFESEV.js';
20
26
  export { Radio, RadioGroup } from './chunk-KYV75JPQ.js';
21
- export { Select } from './chunk-6PHPRZTT.js';
22
- export { Tag } from './chunk-6K5YI4ZE.js';
23
- export { Skeleton } from './chunk-R3DTXVP2.js';
27
+ export { DateTimePicker } from './chunk-YPE6CDXQ.js';
28
+ export { Divider } from './chunk-HBO7ZDEQ.js';
24
29
  export { Drawer } from './chunk-WMGMIE2D.js';
25
30
  export { Empty } from './chunk-6MEOLYNQ.js';
26
31
  export { Form, FormItem, useForm } from './chunk-ZR4IMROK.js';
27
32
  export { Image, ImageGrid, LayeredImage, SpriteImage } from './chunk-EQ4FPOQQ.js';
28
- export { InputNumber } from './chunk-3VXGZ3SJ.js';
29
- export { List } from './chunk-YAFDVNXT.js';
30
33
  export { Card } from './chunk-ARUPS7JH.js';
31
34
  export { Spin } from './chunk-FYSXJXNW.js';
32
35
  export { Cascader } from './chunk-4HJBF4GY.js';
@@ -35,7 +38,7 @@ export { Collapse } from './chunk-6LN4VVX7.js';
35
38
  export { ColorPicker } from './chunk-TJECLLN4.js';
36
39
  export { CommandPalette } from './chunk-5MOYKVB7.js';
37
40
  export { ContextMenu } from './chunk-AAPZLBHQ.js';
38
- export { Divider } from './chunk-HBO7ZDEQ.js';
41
+ export { DatePicker } from './chunk-FKP5D5IS.js';
39
42
  export { Alert } from './chunk-A6O25EP2.js';
40
43
  export { AppShell, Sidebar, TitleBar, WindowControls } from './chunk-XCXUGHDF.js';
41
44
  export { AutoComplete } from './chunk-CFZVWY5N.js';
@@ -45,10 +48,10 @@ export { TextArea, Textarea } from './chunk-S7IHWY24.js';
45
48
  export { Avatar } from './chunk-RR2BKV65.js';
46
49
  export { Badge } from './chunk-DSLYWX4O.js';
47
50
  export { Button, IconButton } from './chunk-IPSNC5VZ.js';
48
- export { Calendar } from './chunk-XG5D777V.js';
51
+ export { Calendar } from './chunk-I7TOBKJO.js';
49
52
  export { AimOutlined, AppstoreOutlined, BarChartOutlined, BlockOutlined, BorderOutlined, CameraOutlined, CaretDownOutlined, CaretUpOutlined, CheckCircleFilled, CheckCircleOutlined, CheckOutlined, ClockCircleFilled, CloseCircleOutlined, CloseOutlined, CopyOutlined, DashboardOutlined, DeleteOutlined, DownOutlined, EnvironmentOutlined, ExclamationCircleOutlined, FolderOpenOutlined, ICON_NAMES, Icon, LeftOutlined, LoadingOutlined, MinusCircleOutlined, MinusOutlined, NAMED_ICON_MAP, PictureOutlined, PlusOutlined, QqOutlined, ReloadOutlined, RightOutlined, RobotOutlined, SearchOutlined, SettingOutlined, StarFilled, StarOutlined, SwapOutlined, SwapRightOutlined, SyncOutlined, ThunderboltOutlined, TranslationOutlined, UnorderedListOutlined, UserOutlined, isIconName, renderIconSlot, resolveIconName } from './chunk-FDZG27IG.js';
50
53
 
51
54
  // src/index.ts
52
- var VERSION = "0.6.14";
55
+ var VERSION = "0.6.16";
53
56
 
54
57
  export { VERSION };
package/dist/styles.css CHANGED
@@ -2568,6 +2568,249 @@ input, textarea, select { font-family: inherit; color: inherit; }
2568
2568
  .skeleton-box .skeleton-row {
2569
2569
  display: block;
2570
2570
  }
2571
+ /* ============ DatePicker ============ */
2572
+ .date-picker {
2573
+ position: relative;
2574
+ display: inline-block;
2575
+ width: 100%;
2576
+ min-width: 180px;
2577
+ }
2578
+ .date-picker.disabled {
2579
+ opacity: 0.55;
2580
+ pointer-events: none;
2581
+ }
2582
+ .date-picker.readonly .input-wrap {
2583
+ cursor: default;
2584
+ }
2585
+ .date-picker .input-wrap {
2586
+ width: 100%;
2587
+ }
2588
+ .date-picker.open .input-wrap {
2589
+ box-shadow: var(--neu-shadow-inset);
2590
+ }
2591
+ .date-picker-panel {
2592
+ position: fixed;
2593
+ z-index: 1000;
2594
+ width: 344px;
2595
+ padding: var(--gap-3);
2596
+ border-radius: var(--r-md);
2597
+ background: var(--bg);
2598
+ box-shadow: var(--neu-shadow-float);
2599
+ animation: menuIn var(--dur) var(--ease);
2600
+ }
2601
+ .date-picker-panel .calendar {
2602
+ width: 100%;
2603
+ padding: 0;
2604
+ background: transparent;
2605
+ box-shadow: none;
2606
+ }
2607
+ .date-picker-panel .calendar-head {
2608
+ padding: 0 0 var(--gap-3);
2609
+ }
2610
+ .date-picker-footer {
2611
+ display: flex;
2612
+ align-items: center;
2613
+ gap: var(--gap-2);
2614
+ margin-top: var(--gap-3);
2615
+ padding-top: var(--gap-3);
2616
+ border-top: 1px solid var(--divider);
2617
+ }
2618
+ .date-picker-footer-spacer {
2619
+ flex: 1;
2620
+ min-width: 0;
2621
+ }
2622
+ /* ============ DateTimePicker ============ */
2623
+ .date-time-picker {
2624
+ position: relative;
2625
+ display: inline-block;
2626
+ width: 100%;
2627
+ min-width: 220px;
2628
+ }
2629
+ .date-time-picker.disabled {
2630
+ opacity: 0.55;
2631
+ pointer-events: none;
2632
+ }
2633
+ .date-time-picker.readonly .input-wrap {
2634
+ cursor: default;
2635
+ }
2636
+ .date-time-picker .input-wrap {
2637
+ width: 100%;
2638
+ }
2639
+ .date-time-picker.open .input-wrap {
2640
+ box-shadow: var(--neu-shadow-inset);
2641
+ }
2642
+ .date-time-picker-panel {
2643
+ position: fixed;
2644
+ z-index: 1000;
2645
+ width: 476px;
2646
+ padding: var(--gap-2) var(--gap-3);
2647
+ border-radius: var(--r-md);
2648
+ background: var(--bg);
2649
+ box-shadow:
2650
+ 0 calc(var(--shadow-offset) * 1.1) calc(var(--shadow-blur) * 1.3) color-mix(in oklch, var(--shadow-dark) 72%, transparent),
2651
+ inset 0 0 0 1px var(--divider);
2652
+ animation: menuIn var(--dur) var(--ease);
2653
+ }
2654
+ .date-time-picker-body {
2655
+ display: grid;
2656
+ grid-template-columns: 272px minmax(0, 168px);
2657
+ gap: var(--gap-3);
2658
+ align-items: start;
2659
+ }
2660
+ .date-time-picker-panel .calendar {
2661
+ width: 100%;
2662
+ padding: 0;
2663
+ background: transparent;
2664
+ box-shadow: none;
2665
+ }
2666
+ .date-time-picker-panel .calendar-head {
2667
+ padding: 0 0 var(--gap-1);
2668
+ }
2669
+ .date-time-picker-panel .calendar-title {
2670
+ padding: var(--gap-1) var(--gap-2);
2671
+ font-size: var(--fs-sm);
2672
+ }
2673
+ .date-time-picker-panel .calendar-title-part {
2674
+ padding: var(--gap-1) 6px;
2675
+ font-size: var(--fs-sm);
2676
+ }
2677
+ .date-time-picker-panel .calendar-grid {
2678
+ gap: 1px;
2679
+ min-height: 222px;
2680
+ }
2681
+ .date-time-picker-panel .calendar-dow {
2682
+ padding: var(--gap-1) 0;
2683
+ }
2684
+ .date-time-picker-panel .calendar-cell {
2685
+ aspect-ratio: auto;
2686
+ height: 32px;
2687
+ font-size: var(--fs-xs);
2688
+ border-radius: 7px;
2689
+ }
2690
+ .date-time-picker-panel .calendar-cell.today::after {
2691
+ bottom: 3px;
2692
+ }
2693
+ .date-time-picker-panel .calendar-select-grid {
2694
+ min-height: 222px;
2695
+ gap: var(--gap-1);
2696
+ }
2697
+ .date-time-picker-panel .calendar-select-option {
2698
+ height: 34px;
2699
+ font-size: var(--fs-xs);
2700
+ }
2701
+ .date-time-picker-time {
2702
+ min-width: 0;
2703
+ }
2704
+ .date-time-picker-time-columns {
2705
+ display: grid;
2706
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2707
+ padding: 8px;
2708
+ border-radius: var(--r-sm);
2709
+ background: var(--bg);
2710
+ box-shadow: inset 0 0 0 1px var(--divider);
2711
+ overflow: hidden;
2712
+ }
2713
+ .date-time-picker-panel.without-second .date-time-picker-time-columns {
2714
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2715
+ }
2716
+ .date-time-picker-time-column {
2717
+ min-width: 0;
2718
+ }
2719
+ .date-time-picker-time-column + .date-time-picker-time-column {
2720
+ border-left: 1px solid var(--divider);
2721
+ }
2722
+ .date-time-picker-time-label {
2723
+ height: 20px;
2724
+ display: grid;
2725
+ place-items: center;
2726
+ font-size: var(--fs-xs);
2727
+ font-weight: 700;
2728
+ color: var(--fg-muted);
2729
+ }
2730
+ .date-time-picker-time-list {
2731
+ display: flex;
2732
+ flex-direction: column;
2733
+ gap: 4px;
2734
+ height: 220px;
2735
+ overflow-y: auto;
2736
+ padding: calc((220px - 28px) / 2) 5px;
2737
+ scroll-padding: calc((220px - 28px) / 2) 0;
2738
+ scrollbar-width: none;
2739
+ -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 20px, black calc(100% - 20px), transparent 100%);
2740
+ mask-image: linear-gradient(to bottom, transparent 0, black 20px, black calc(100% - 20px), transparent 100%);
2741
+ }
2742
+ .date-time-picker-time-list::-webkit-scrollbar {
2743
+ width: 0;
2744
+ height: 0;
2745
+ }
2746
+ .date-time-picker-time-option {
2747
+ flex: 0 0 28px;
2748
+ width: 100%;
2749
+ height: 28px;
2750
+ border: none;
2751
+ border-radius: 7px;
2752
+ background: transparent;
2753
+ color: var(--fg);
2754
+ cursor: pointer;
2755
+ font: 600 var(--fs-md) var(--font-mono);
2756
+ transition:
2757
+ color var(--dur-fast) var(--ease),
2758
+ background var(--dur-fast) var(--ease),
2759
+ box-shadow var(--dur-fast) var(--ease);
2760
+ }
2761
+ .date-time-picker-time-option:hover:not(:disabled) {
2762
+ color: var(--accent-ink);
2763
+ background: var(--bg);
2764
+ box-shadow: var(--neu-shadow-subtle);
2765
+ }
2766
+ .date-time-picker-time-option.selected {
2767
+ color: var(--accent-ink);
2768
+ background: var(--bg);
2769
+ box-shadow: var(--neu-shadow-subtle);
2770
+ }
2771
+ .date-time-picker-time-option:disabled {
2772
+ color: var(--fg-subtle);
2773
+ cursor: not-allowed;
2774
+ opacity: 0.45;
2775
+ }
2776
+ .date-time-picker-footer {
2777
+ display: flex;
2778
+ align-items: center;
2779
+ gap: var(--gap-2);
2780
+ margin-top: var(--gap-2);
2781
+ padding-top: var(--gap-2);
2782
+ border-top: 1px solid var(--divider);
2783
+ }
2784
+ .date-time-picker-footer-spacer {
2785
+ flex: 1;
2786
+ min-width: 0;
2787
+ }
2788
+ .date-time-picker-footer .btn {
2789
+ min-width: 54px;
2790
+ }
2791
+ @media (max-width: 640px) {
2792
+ .date-time-picker-panel {
2793
+ width: 332px;
2794
+ }
2795
+
2796
+ .date-time-picker-body {
2797
+ display: block;
2798
+ }
2799
+
2800
+ .date-time-picker-time {
2801
+ margin-top: var(--gap-3);
2802
+ }
2803
+
2804
+ .date-time-picker-time-columns {
2805
+ height: auto;
2806
+ }
2807
+
2808
+ .date-time-picker-time-list {
2809
+ height: 118px;
2810
+ padding: calc((118px - 28px) / 2) 8px;
2811
+ scroll-padding: calc((118px - 28px) / 2) 0;
2812
+ }
2813
+ }
2571
2814
  /* ============ Calendar ============ */
2572
2815
  .calendar {
2573
2816
  background: var(--bg);
@@ -2589,6 +2832,36 @@ input, textarea, select { font-family: inherit; color: inherit; }
2589
2832
  transition: all var(--dur-fast) var(--ease);
2590
2833
  }
2591
2834
  .calendar-title:hover { background: var(--bg); box-shadow: var(--neu-shadow-subtle); }
2835
+ .calendar-title.static {
2836
+ cursor: default;
2837
+ }
2838
+ .calendar-title.static:hover {
2839
+ background: transparent;
2840
+ box-shadow: none;
2841
+ }
2842
+ .calendar-title-group {
2843
+ display: inline-flex;
2844
+ align-items: center;
2845
+ gap: var(--gap-1);
2846
+ }
2847
+ .calendar-title-part {
2848
+ border: none;
2849
+ border-radius: var(--r-sm);
2850
+ padding: 6px 8px;
2851
+ background: transparent;
2852
+ color: var(--fg);
2853
+ cursor: pointer;
2854
+ font: 600 14px var(--font-sans);
2855
+ transition:
2856
+ color var(--dur-fast) var(--ease),
2857
+ background var(--dur-fast) var(--ease),
2858
+ box-shadow var(--dur-fast) var(--ease);
2859
+ }
2860
+ .calendar-title-part:hover {
2861
+ color: var(--accent-ink);
2862
+ background: var(--bg);
2863
+ box-shadow: var(--neu-shadow-subtle);
2864
+ }
2592
2865
  .calendar-grid {
2593
2866
  display: grid;
2594
2867
  grid-template-columns: repeat(7, 1fr);
@@ -2633,6 +2906,172 @@ input, textarea, select { font-family: inherit; color: inherit; }
2633
2906
  }
2634
2907
  .calendar-cell.disabled { color: var(--fg-subtle); opacity: 0.4; cursor: not-allowed; }
2635
2908
  .calendar-cell.disabled:hover { background: transparent; box-shadow: none; }
2909
+ .calendar-select-grid {
2910
+ display: grid;
2911
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2912
+ gap: var(--gap-2);
2913
+ min-height: 244px;
2914
+ align-content: center;
2915
+ }
2916
+ .calendar-select-option {
2917
+ height: 42px;
2918
+ border: none;
2919
+ border-radius: var(--r-sm);
2920
+ background: transparent;
2921
+ color: var(--fg);
2922
+ cursor: pointer;
2923
+ font: 600 var(--fs-md) var(--font-mono);
2924
+ transition:
2925
+ color var(--dur-fast) var(--ease),
2926
+ background var(--dur-fast) var(--ease),
2927
+ box-shadow var(--dur-fast) var(--ease);
2928
+ }
2929
+ .calendar-select-option:hover:not(:disabled) {
2930
+ color: var(--accent-ink);
2931
+ background: var(--bg);
2932
+ box-shadow: var(--neu-shadow-subtle);
2933
+ }
2934
+ .calendar-select-option.selected {
2935
+ color: var(--accent-ink);
2936
+ background: var(--bg);
2937
+ box-shadow: var(--neu-shadow-inset);
2938
+ }
2939
+ .calendar-select-option.disabled {
2940
+ color: var(--fg-subtle);
2941
+ cursor: not-allowed;
2942
+ opacity: 0.4;
2943
+ }
2944
+ /* ============ TimePicker ============ */
2945
+ .time-picker {
2946
+ position: relative;
2947
+ display: inline-block;
2948
+ width: 100%;
2949
+ min-width: 180px;
2950
+ }
2951
+ .time-picker.disabled {
2952
+ opacity: 0.55;
2953
+ pointer-events: none;
2954
+ }
2955
+ .time-picker.readonly .input-wrap {
2956
+ cursor: default;
2957
+ }
2958
+ .time-picker .input-wrap {
2959
+ width: 100%;
2960
+ }
2961
+ .time-picker.open .input-wrap {
2962
+ box-shadow: var(--neu-shadow-inset);
2963
+ }
2964
+ .time-picker-panel {
2965
+ position: fixed;
2966
+ z-index: 1000;
2967
+ width: 300px;
2968
+ padding: 10px;
2969
+ border-radius: var(--r-md);
2970
+ background: var(--bg);
2971
+ box-shadow:
2972
+ 0 calc(var(--shadow-offset) * 1.1) calc(var(--shadow-blur) * 1.3) color-mix(in oklch, var(--shadow-dark) 72%, transparent),
2973
+ inset 0 0 0 1px var(--divider);
2974
+ animation: menuIn var(--dur) var(--ease);
2975
+ }
2976
+ .time-picker-panel.without-second {
2977
+ width: 228px;
2978
+ }
2979
+ .time-picker-columns {
2980
+ position: relative;
2981
+ display: grid;
2982
+ grid-template-columns: repeat(3, minmax(0, 1fr));
2983
+ gap: 0;
2984
+ padding: 8px;
2985
+ border-radius: var(--r-sm);
2986
+ background: var(--bg);
2987
+ box-shadow: inset 0 0 0 1px var(--divider);
2988
+ overflow: hidden;
2989
+ }
2990
+ .time-picker-column + .time-picker-column {
2991
+ border-left: 1px solid var(--divider);
2992
+ }
2993
+ .time-picker-panel.without-second .time-picker-columns {
2994
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2995
+ }
2996
+ .time-picker-column {
2997
+ min-width: 0;
2998
+ }
2999
+ .time-picker-column-label {
3000
+ height: 22px;
3001
+ position: relative;
3002
+ z-index: 1;
3003
+ display: grid;
3004
+ place-items: center;
3005
+ font-size: var(--fs-xs);
3006
+ font-weight: 700;
3007
+ color: var(--fg-muted);
3008
+ }
3009
+ .time-picker-list {
3010
+ display: flex;
3011
+ flex-direction: column;
3012
+ gap: 4px;
3013
+ height: 166px;
3014
+ overflow-y: auto;
3015
+ padding: calc((166px - 30px) / 2) 8px;
3016
+ border-radius: 0;
3017
+ background: transparent;
3018
+ box-shadow: none;
3019
+ scroll-padding: calc((166px - 30px) / 2) 0;
3020
+ scrollbar-width: none;
3021
+ -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 24px, black calc(100% - 24px), transparent 100%);
3022
+ mask-image: linear-gradient(to bottom, transparent 0, black 24px, black calc(100% - 24px), transparent 100%);
3023
+ }
3024
+ .time-picker-list::-webkit-scrollbar {
3025
+ width: 0;
3026
+ height: 0;
3027
+ }
3028
+ .time-picker-option {
3029
+ position: relative;
3030
+ z-index: 1;
3031
+ flex: 0 0 30px;
3032
+ width: 100%;
3033
+ height: 30px;
3034
+ border: none;
3035
+ border-radius: 7px;
3036
+ background: transparent;
3037
+ color: var(--fg);
3038
+ cursor: pointer;
3039
+ font: 600 var(--fs-md) var(--font-mono);
3040
+ transition:
3041
+ color var(--dur-fast) var(--ease),
3042
+ background var(--dur-fast) var(--ease),
3043
+ box-shadow var(--dur-fast) var(--ease);
3044
+ }
3045
+ .time-picker-option:hover:not(:disabled) {
3046
+ color: var(--accent-ink);
3047
+ background: var(--bg);
3048
+ box-shadow: var(--neu-shadow-subtle);
3049
+ }
3050
+ .time-picker-option.selected {
3051
+ background: var(--bg);
3052
+ color: var(--accent-ink);
3053
+ box-shadow: var(--neu-shadow-subtle);
3054
+ }
3055
+ .time-picker-option:disabled {
3056
+ color: var(--fg-subtle);
3057
+ cursor: not-allowed;
3058
+ opacity: 0.45;
3059
+ }
3060
+ .time-picker-footer {
3061
+ display: flex;
3062
+ align-items: center;
3063
+ gap: 6px;
3064
+ margin-top: 8px;
3065
+ padding: 8px 0 0;
3066
+ border-top: 1px solid var(--divider);
3067
+ }
3068
+ .time-picker-footer-spacer {
3069
+ flex: 1;
3070
+ min-width: 0;
3071
+ }
3072
+ .time-picker-footer .btn {
3073
+ min-width: 54px;
3074
+ }
2636
3075
  /* ============ Image ============ */
2637
3076
  .n-image {
2638
3077
  display: inline-block;
@@ -1,6 +1,6 @@
1
1
  # Calendar 日历
2
2
 
3
- > 查看与选择日期。
3
+ > 查看与选择日期,支持快速切换年份和月份。
4
4
 
5
5
  ## 导入
6
6
 
@@ -35,6 +35,7 @@ import { Calendar } from "@fangxinyan/lumina";
35
35
  | Prop | 类型 | 默认 | 说明 |
36
36
  | --- | --- | --- | --- |
37
37
  | value / defaultValue | `Date` | — | 受控/初始日期 |
38
+ | viewDate | `Date` | — | 外部日期变化时同步可视月份 |
38
39
  | onChange | `(date: Date) => void` | — | 选择回调 |
39
40
  | min / max | `Date` | — | 可选范围 |
40
41
  | disabledDate | `(date: Date) => boolean` | — | 自定义禁用判断,返回 true 的日期不可选 |
@@ -0,0 +1,69 @@
1
+ # DatePicker 日期选择
2
+
3
+ > 输入框触发的日期选择器,复用 Calendar 并支持范围、禁用日期和格式化。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { DatePicker } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础用法
14
+
15
+ ```tsx
16
+ <DatePicker defaultValue={new Date(2026, 4, 25)} />
17
+ ```
18
+
19
+ ### 受控
20
+
21
+ value 使用 Date | null,onChange 同时返回 Date 和格式化字符串。
22
+
23
+ ```tsx
24
+ const [date, setDate] = useState<Date | null>(new Date());
25
+ <DatePicker value={date} onChange={setDate} allowClear />
26
+ ```
27
+
28
+ ### 限制范围
29
+
30
+ min / max 与 disabledDate 会同步作用于 Calendar 单元格和手动输入。
31
+
32
+ ```tsx
33
+ <DatePicker
34
+ value={workday}
35
+ onChange={setWorkday}
36
+ min={new Date(2026, 4, 1)}
37
+ max={new Date(2026, 4, 31)}
38
+ disabledDate={(date) => date.getDay() === 0 || date.getDay() === 6}
39
+ />
40
+ ```
41
+
42
+ ### 格式与尺寸
43
+
44
+ ```tsx
45
+ <DatePicker size="sm" format="YYYY/MM/DD" />
46
+ <DatePicker format="YYYY年MM月DD日" />
47
+ <DatePicker size="lg" disabled />
48
+ ```
49
+
50
+ ## API
51
+
52
+ **DatePicker**
53
+
54
+ | Prop | 类型 | 默认 | 说明 |
55
+ | --- | --- | --- | --- |
56
+ | value / defaultValue | `Date | null` | — | 受控/初始日期 |
57
+ | onChange | `(date: Date | null, dateString: string) => void` | — | 选择或清空时触发 |
58
+ | format | `"YYYY-MM-DD" | "YYYY/MM/DD" | "YYYY年MM月DD日" | ((date) => string)` | `"YYYY-MM-DD"` | 显示格式或自定义格式化函数 |
59
+ | min / max | `Date` | — | 可选日期范围 |
60
+ | disabledDate | `(date: Date) => boolean` | — | 自定义禁用日期 |
61
+ | size | `"sm" | "md" | "lg"` | `"md"` | 输入框尺寸 |
62
+ | allowClear | `boolean` | `false` | 允许清空 |
63
+ | open / defaultOpen / onOpenChange | `—` | — | 受控浮层显隐 |
64
+ | popupClassName / dropdownClassName | `string` | — | 浮层 className |
65
+ | disabled / readOnly / invalid / placeholder | `—` | — | 常规输入状态 |
66
+
67
+
68
+ ---
69
+ [← 回到索引](../llms.md)