@ticatec/uniface-element 0.2.4 → 0.3.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.
Files changed (176) hide show
  1. package/dist/accordion/README.md +169 -0
  2. package/dist/accordion/README_CN.md +176 -0
  3. package/dist/action-bar/README.md +275 -0
  4. package/dist/action-bar/README_CN.md +285 -0
  5. package/dist/app-layout/README.md +374 -0
  6. package/dist/app-layout/README_CN.md +381 -0
  7. package/dist/app-top-bar/README.md +357 -0
  8. package/dist/app-top-bar/README_CN.md +365 -0
  9. package/dist/attachment-files/AttachmentFilesField.svelte +67 -1
  10. package/dist/attachment-files/AttachmentFilesField.svelte.d.ts +8 -1
  11. package/dist/base-calendar/CalendarBase.svelte +0 -3
  12. package/dist/box/README.md +385 -0
  13. package/dist/box/README_CN.md +393 -0
  14. package/dist/breadcrumbs/README.md +442 -0
  15. package/dist/breadcrumbs/README_CN.md +442 -0
  16. package/dist/button/Button.svelte +27 -7
  17. package/dist/button/Button.svelte.d.ts +3 -1
  18. package/dist/button/IconButton.svelte +26 -6
  19. package/dist/button/IconButton.svelte.d.ts +3 -1
  20. package/dist/button/IconButton_README.md +513 -0
  21. package/dist/button/IconButton_README_CN.md +513 -0
  22. package/dist/button/README.md +428 -0
  23. package/dist/button/README_CN.md +428 -0
  24. package/dist/button/TextButton.svelte +26 -6
  25. package/dist/button/TextButton.svelte.d.ts +3 -1
  26. package/dist/button/TextButton_README.md +571 -0
  27. package/dist/button/TextButton_README_CN.md +571 -0
  28. package/dist/card/README.md +666 -0
  29. package/dist/card/README_CN.md +666 -0
  30. package/dist/cascade-options-select/CascadeOptionSelect.svelte +43 -7
  31. package/dist/cascade-options-select/CascadeOptionSelect.svelte.d.ts +3 -4
  32. package/dist/cascade-options-select/README.md +663 -2
  33. package/dist/cascade-options-select/README_CN.md +664 -0
  34. package/dist/checkbox/CheckBox.svelte +20 -6
  35. package/dist/checkbox/CheckBox.svelte.d.ts +4 -2
  36. package/dist/checkbox/README.md +562 -0
  37. package/dist/checkbox/README_CN.md +727 -0
  38. package/dist/common-editor/NumberInput.svelte +39 -26
  39. package/dist/common-editor/NumberInput.svelte.d.ts +5 -1
  40. package/dist/concise-data-table/ConciseListTable.svelte +133 -36
  41. package/dist/concise-data-table/ConciseListTable.svelte.d.ts +8 -1
  42. package/dist/concise-data-table/DataCell.svelte +5 -6
  43. package/dist/concise-data-table/DataRow.svelte +22 -2
  44. package/dist/concise-data-table/DataRow.svelte.d.ts +1 -0
  45. package/dist/concise-data-table/README.md +606 -0
  46. package/dist/concise-data-table/README_CN.md +611 -0
  47. package/dist/context-menu/ContextMenu.svelte +138 -21
  48. package/dist/context-menu/ContextMenu.svelte.d.ts +5 -0
  49. package/dist/context-menu/ContextMenuItem.d.ts +20 -4
  50. package/dist/context-menu/README.md +551 -0
  51. package/dist/context-menu/README_CN.md +551 -0
  52. package/dist/criteria-field/CriteriaField.svelte +3 -5
  53. package/dist/criteria-field/README.md +532 -0
  54. package/dist/criteria-field/README_CN.md +532 -0
  55. package/dist/data-table/README.md +712 -0
  56. package/dist/data-table/README_CN.md +712 -0
  57. package/dist/date-picker/DatePicker.svelte +44 -7
  58. package/dist/date-picker/DatePicker.svelte.d.ts +3 -4
  59. package/dist/date-picker/DateTimePicker.svelte +32 -8
  60. package/dist/date-picker/DateTimePicker.svelte.d.ts +3 -4
  61. package/dist/date-picker/README.md +326 -0
  62. package/dist/date-picker/README_CN.md +316 -0
  63. package/dist/date-picker/ScrollBar.svelte +18 -8
  64. package/dist/date-picker/ScrollBar.svelte.d.ts +1 -1
  65. package/dist/date-picker/TimePanel.svelte +5 -5
  66. package/dist/date-picker/TimePanel.svelte.d.ts +1 -1
  67. package/dist/date-range/README.md +374 -0
  68. package/dist/date-range/README_CN.md +374 -0
  69. package/dist/dialog/README.md +596 -0
  70. package/dist/dialog/README_CN.md +596 -0
  71. package/dist/drawer/README.md +679 -1
  72. package/dist/drawer/README_CN.md +679 -0
  73. package/dist/group-box/group-check-box/GroupCheckBox.svelte +62 -5
  74. package/dist/group-box/group-check-box/GroupCheckBox.svelte.d.ts +7 -2
  75. package/dist/group-box/group-check-box/README.md +749 -0
  76. package/dist/group-box/group-check-box/README_CN.md +750 -0
  77. package/dist/group-box/group-radio-box/GroupRadioBox.svelte +69 -4
  78. package/dist/group-box/group-radio-box/GroupRadioBox.svelte.d.ts +8 -2
  79. package/dist/group-box/group-radio-box/README.md +920 -0
  80. package/dist/group-box/group-radio-box/README_CN.md +920 -0
  81. package/dist/image-files/README.md +1346 -0
  82. package/dist/image-files/README_CN.md +1346 -0
  83. package/dist/input-options-select/InputOptionsSelect.svelte +161 -65
  84. package/dist/input-options-select/InputOptionsSelect.svelte.d.ts +4 -1
  85. package/dist/lib/forwardAllEvents.d.ts +3 -0
  86. package/dist/lib/forwardAllEvents.js +24 -0
  87. package/dist/list-box/README.md +579 -0
  88. package/dist/list-box/README_CN.md +682 -0
  89. package/dist/lookup-editor/LookupEditor.svelte +15 -3
  90. package/dist/lookup-editor/LookupEditor.svelte.d.ts +3 -4
  91. package/dist/lookup-editor/README.md +684 -0
  92. package/dist/lookup-editor/README_CN.md +684 -0
  93. package/dist/memo-editor/MemoEditor.svelte +77 -27
  94. package/dist/memo-editor/MemoEditor.svelte.d.ts +6 -3
  95. package/dist/memo-editor/README.md +819 -0
  96. package/dist/memo-editor/README_CN.md +819 -0
  97. package/dist/message-box/README.md +398 -0
  98. package/dist/message-box/README_CN.md +398 -0
  99. package/dist/number-editor/NumberEditor.svelte +2 -2
  100. package/dist/number-editor/NumberEditor.svelte.d.ts +1 -1
  101. package/dist/number-editor/README.md +353 -22
  102. package/dist/number-editor/README_CN.md +357 -0
  103. package/dist/number-range/README.md +443 -0
  104. package/dist/number-range/README_CN.md +443 -0
  105. package/dist/options-multi-select/OptionsMultiSelect.svelte +87 -12
  106. package/dist/options-multi-select/OptionsMultiSelect.svelte.d.ts +3 -1
  107. package/dist/options-multi-select/README.md +480 -0
  108. package/dist/options-multi-select/README_CN.md +480 -0
  109. package/dist/options-select/OptionsSelect.svelte +36 -5
  110. package/dist/options-select/OptionsSelect.svelte.d.ts +3 -4
  111. package/dist/options-select/README.md +632 -0
  112. package/dist/options-select/README_CN.md +632 -0
  113. package/dist/page/README.md +605 -0
  114. package/dist/page/README_CN.md +605 -0
  115. package/dist/pagination/README.md +946 -0
  116. package/dist/pagination/README_CN.md +946 -0
  117. package/dist/pagination-panel/README.md +1075 -0
  118. package/dist/pagination-panel/README_CN.md +1075 -0
  119. package/dist/popup-hint/README.md +841 -0
  120. package/dist/popup-hint/README_CN.md +840 -0
  121. package/dist/progress-bar/README.md +242 -0
  122. package/dist/progress-bar/README_CN.md +242 -0
  123. package/dist/progress-step-bar/README.md +316 -0
  124. package/dist/progress-step-bar/README_CN.md +316 -0
  125. package/dist/prompts-text-editor/PromptsTextEditor.svelte +6 -3
  126. package/dist/prompts-text-editor/PromptsTextEditor.svelte.d.ts +3 -1
  127. package/dist/prompts-text-editor/README.md +329 -0
  128. package/dist/prompts-text-editor/README_CN.md +329 -0
  129. package/dist/property-editor/README.md +969 -0
  130. package/dist/property-editor/README_CN.md +969 -0
  131. package/dist/radio-button/README.md +372 -0
  132. package/dist/radio-button/README_CN.md +372 -0
  133. package/dist/radio-button/RadioButton.svelte +32 -3
  134. package/dist/radio-button/RadioButton.svelte.d.ts +12 -1
  135. package/dist/search-box/README.md +425 -0
  136. package/dist/search-box/README_CN.md +424 -0
  137. package/dist/search-box/SearchBox.svelte +22 -6
  138. package/dist/search-box/SearchBox.svelte.d.ts +4 -1
  139. package/dist/tabs/README.md +919 -0
  140. package/dist/tabs/README_CN.md +920 -0
  141. package/dist/tag/README.md +922 -0
  142. package/dist/tag/README_CN.md +922 -0
  143. package/dist/text-editor/PasswordEditor.svelte +17 -2
  144. package/dist/text-editor/PasswordEditor.svelte.d.ts +3 -3
  145. package/dist/text-editor/PasswordEditor_README.md +551 -0
  146. package/dist/text-editor/PasswordEditor_README_CN.md +551 -0
  147. package/dist/text-editor/README.md +466 -0
  148. package/dist/text-editor/README_CN.md +466 -0
  149. package/dist/text-editor/TextEditor.svelte +51 -19
  150. package/dist/text-editor/TextEditor.svelte.d.ts +0 -1
  151. package/dist/time-editor/README.md +498 -24
  152. package/dist/time-editor/README_CN.md +498 -0
  153. package/dist/time-editor/TimeEditor.svelte +7 -3
  154. package/dist/time-editor/TimeEditor.svelte.d.ts +3 -1
  155. package/dist/toast/README.md +667 -0
  156. package/dist/toast/README_CN.md +667 -0
  157. package/dist/transfer/README.md +795 -0
  158. package/dist/transfer/Transfer.svelte +6 -4
  159. package/dist/transfer/Transfer.svelte.d.ts +3 -1
  160. package/dist/tree-view/README.md +761 -0
  161. package/dist/tree-view/README_CN.md +761 -0
  162. package/dist/tree-view/TreeView.svelte +5 -3
  163. package/dist/tree-view/TreeView.svelte.d.ts +3 -1
  164. package/dist/unit-number-editor/README.md +546 -20
  165. package/dist/unit-number-editor/README_CN.md +525 -0
  166. package/dist/unit-number-editor/UnitNumberEditor.svelte +62 -8
  167. package/dist/unit-number-editor/UnitNumberEditor.svelte.d.ts +5 -1
  168. package/docs/form-field/cn/README_CN.md +364 -0
  169. package/docs/form-field/en/README.md +364 -0
  170. package/docs/form-panel/flex-form/cn/README_CN.md +586 -0
  171. package/docs/form-panel/flex-form/en/README.md +586 -0
  172. package/docs/form-panel/flex-row-form/cn/README_CN.md +787 -0
  173. package/docs/form-panel/flex-row-form/en/README.md +787 -0
  174. package/docs/form-panel/grid-form/en/README.md +744 -0
  175. package/package.json +1 -1
  176. package/dist/drawer/README-CN.md +0 -1
@@ -1,6 +1,5 @@
1
1
  <script lang="ts">
2
2
 
3
- import {onMount, tick} from "svelte";
4
3
  import {DisplayMode} from "../common/DisplayMode";
5
4
  import dayjs from "dayjs";
6
5
  import Calendar from "../base-calendar";
@@ -19,7 +18,9 @@
19
18
  export let displayMode: DisplayMode = DisplayMode.Edit;
20
19
  export let min: UniDate = null;
21
20
  export let max: UniDate = null;
22
- export let onChange: OnChangeHandler<Date> = null as unknown as OnChangeHandler<Date>;
21
+ export let onchange: OnChangeHandler<Date> = null as unknown as OnChangeHandler<Date>;
22
+ export let onfocus: (() => void) | null = null;
23
+ export let onblur: (() => void) | null = null;
23
24
  export const setFocus = () => {
24
25
  setTimeout(()=> {
25
26
  editor && editor.focus();
@@ -30,34 +31,45 @@
30
31
  let textValue: string;
31
32
  let editor: any;
32
33
  let oldValue = value;
34
+ let hasFocus: boolean = false;
35
+ let isUserChange: boolean = false;
33
36
 
34
- onMount(() => {
35
- })
36
37
 
37
38
  const generateText = (v: string) => {
38
39
  textValue = value == null ? '' : dayjs(value).format('YYYY-MM-DD');
39
40
  }
40
41
 
41
42
  const openPopup = () => {
42
- editor.focus();
43
43
  showPopup = true;
44
44
  }
45
45
 
46
46
  $: generateText(value);
47
47
 
48
48
  $: if (oldValue != value) {
49
+ if (isUserChange) {
50
+ if (value != null) {
51
+ // 确保传递的是Date对象
52
+ const dateValue = value instanceof Date ? value : (dayjs.isDayjs(value) ? value.toDate() : new Date(value));
53
+ onchange?.(dateValue);
54
+ } else {
55
+ onchange?.(null);
56
+ }
57
+ isUserChange = false;
58
+ }
49
59
  oldValue = value;
50
- onChange?.(value);
51
60
  }
52
61
 
53
62
  const handleCalendarSelect = (d: dayjs.Dayjs) => {
63
+ isUserChange = true;
54
64
  value = d.toDate();
55
65
  showPopup = false;
66
+ editor.focus();
56
67
  }
57
68
 
58
69
  const handleKeyDown = (e: KeyboardEvent) => {
59
70
  if (!disabled) {
60
71
  if (e.key == 'Backspace' || e.key == 'Delete') {
72
+ isUserChange = true;
61
73
  value = null;
62
74
  textValue = '';
63
75
  showPopup = false;
@@ -78,16 +90,41 @@
78
90
  let showPopup: boolean = false;
79
91
 
80
92
  const cleanData = () => {
93
+ isUserChange = true;
81
94
  value = null;
82
95
  }
83
96
 
97
+ const handleFocus = () => {
98
+ if (!hasFocus) {
99
+ hasFocus = true;
100
+ onfocus?.();
101
+ }
102
+ }
103
+
104
+ const handleBlur = (event: FocusEvent) => {
105
+ if (!showPopup) {
106
+ hasFocus = false;
107
+ onblur?.();
108
+ }
109
+ }
110
+
111
+ // 监听popup关闭,如果是点击外部关闭且之前有焦点,触发blur
112
+ $: if (!showPopup && hasFocus) {
113
+ setTimeout(() => {
114
+ if (document.activeElement !== editor) {
115
+ hasFocus = false;
116
+ onblur?.();
117
+ }
118
+ }, 50);
119
+ }
120
+
84
121
  </script>
85
122
 
86
123
  <CommonPicker {displayMode} {variant} {style} className="uniface-date-time-editor" {compact} dropDownIcon="icon_google_event_available"
87
124
  bind:showPopup canClean={!mandatory && value!=null} autoFit={false} clean={cleanData} {textValue} {readonly} {disabled}>
88
125
 
89
126
  <input style="width: 100%" bind:this={editor} on:click={openPopup} {placeholder} on:keydown={handleKeyDown}
90
- class="text-editor" bind:value={textValue} on:blur on:focus/>
127
+ class="text-editor" bind:value={textValue} on:blur={handleBlur} on:focus={handleFocus}/>
91
128
 
92
129
  <div class="date-popover" slot="popup-panel">
93
130
  <Calendar {value} {min} {max} onSelect={handleCalendarSelect}/>
@@ -26,12 +26,11 @@ declare const DatePicker: $$__sveltets_2_IsomorphicComponent<{
26
26
  displayMode?: DisplayMode;
27
27
  min?: UniDate;
28
28
  max?: UniDate;
29
- onChange?: OnChangeHandler<Date>;
29
+ onchange?: OnChangeHandler<Date>;
30
+ onfocus?: (() => void) | null;
31
+ onblur?: (() => void) | null;
30
32
  setFocus?: () => void;
31
33
  }, {
32
- blur: FocusEvent;
33
- focus: FocusEvent;
34
- } & {
35
34
  [evt: string]: CustomEvent<any>;
36
35
  }, {}, {
37
36
  setFocus: () => void;
@@ -1,6 +1,5 @@
1
1
  <script lang="ts">
2
2
 
3
- import {onMount, tick} from "svelte";
4
3
  import dayjs from "dayjs";
5
4
  import {DisplayMode} from "../common/DisplayMode";
6
5
  import dateUtils, {type UniDate} from "../base-calendar/dateUtils";
@@ -23,7 +22,9 @@
23
22
  export let compact: boolean = false;
24
23
  export let variant: '' | 'plain' | 'outlined' | 'filled' = '';
25
24
  export let mandatory: boolean = false;
26
- export let onChange: OnChangeHandler<Date> = null as unknown as OnChangeHandler<Date>;
25
+ export let onchange: OnChangeHandler<Date> = null as unknown as OnChangeHandler<Date>;
26
+ export let onfocus: (() => void) | null = null;
27
+ export let onblur: (() => void) | null = null;
27
28
  export const setFocus = () => {
28
29
  setTimeout(()=> {
29
30
  editor && editor.focus();
@@ -34,6 +35,7 @@
34
35
  let confirmText = i18nRes.calendar.confirmText;
35
36
  let textValue: string;
36
37
  let editor: any;
38
+ let hasFocus: boolean = false;
37
39
 
38
40
  let currentValue: dayjs.Dayjs;
39
41
 
@@ -47,9 +49,6 @@
47
49
 
48
50
  let btnDisabled;
49
51
 
50
- onMount(async () => {
51
-
52
- })
53
52
 
54
53
  const openPopup = () => {
55
54
  displayTime = dateUtils.formatDate(currentValue, format);
@@ -79,9 +78,10 @@
79
78
  const confirm = async () => {
80
79
  if (dateUtils.toDayjs(value)?.toDate() != currentValue.toDate()) {
81
80
  value = currentValue;
82
- onChange?.(currentValue.toDate());
81
+ onchange?.(currentValue.toDate());
83
82
  }
84
83
  showPopup = false;
84
+ editor.focus();
85
85
  }
86
86
 
87
87
  let displayTime: string = '';
@@ -119,19 +119,43 @@
119
119
  value = null;
120
120
  }
121
121
 
122
+ const handleFocus = () => {
123
+ if (!hasFocus) {
124
+ hasFocus = true;
125
+ onfocus?.();
126
+ }
127
+ }
128
+
129
+ const handleBlur = (event: FocusEvent) => {
130
+ if (!showPopup) {
131
+ hasFocus = false;
132
+ onblur?.();
133
+ }
134
+ }
135
+
136
+ // 监听popup关闭,如果是点击外部关闭且之前有焦点,触发blur
137
+ $: if (!showPopup && hasFocus) {
138
+ setTimeout(() => {
139
+ if (document.activeElement !== editor) {
140
+ hasFocus = false;
141
+ onblur?.();
142
+ }
143
+ }, 50);
144
+ }
145
+
122
146
  </script>
123
147
 
124
148
  <CommonPicker {displayMode} {variant} {style} className="uniface-date-time-editor" {compact} dropDownIcon="icon_google_access_time"
125
149
  bind:showPopup canClean={!mandatory && value!=null} autoFit={false} clean={cleanData} {textValue} {readonly} {disabled}>
126
150
 
127
151
  <input style="width: 100%" bind:this={editor} on:click={openPopup} {placeholder} on:keydown={handleKeyDown}
128
- class="text-editor" bind:value={textValue} on:blur on:focus/>
152
+ class="text-editor" bind:value={textValue} on:blur={handleBlur} on:focus={handleFocus}/>
129
153
 
130
154
  <div class="date-popover" slot="popup-panel">
131
155
  <div style="display: flex; flex-direction: row">
132
156
  <Calendar style="border-right: 1px solid var(--uniface-inside-border-color, #f0f0f0)" value={currentValue}
133
157
  onSelect={handleCalendarSelect} {min} {max}/>
134
- <TimePanel style="width: 120px" value={currentValue} {precision} onChange={handleTimeChange}/>
158
+ <TimePanel style="width: 120px" value={currentValue} {precision} onchange={handleTimeChange}/>
135
159
  </div>
136
160
  <div style="border-top: 1px solid var(--uniface-inside-border-color, #f0f0f0); display: flex; flex-direction: row; box-sizing: border-box; padding: 4px 8px; text-align: left; align-items: center">
137
161
  <div style="flex: 1 1 auto">
@@ -27,12 +27,11 @@ declare const DateTimePicker: $$__sveltets_2_IsomorphicComponent<{
27
27
  compact?: boolean;
28
28
  variant?: "" | "plain" | "outlined" | "filled";
29
29
  mandatory?: boolean;
30
- onChange?: OnChangeHandler<Date>;
30
+ onchange?: OnChangeHandler<Date>;
31
+ onfocus?: (() => void) | null;
32
+ onblur?: (() => void) | null;
31
33
  setFocus?: () => void;
32
34
  }, {
33
- blur: FocusEvent;
34
- focus: FocusEvent;
35
- } & {
36
35
  [evt: string]: CustomEvent<any>;
37
36
  }, {}, {
38
37
  setFocus: () => void;
@@ -0,0 +1,326 @@
1
+ # DatePicker & DateTimePicker Components
2
+
3
+ A comprehensive date and time selection component library built with Svelte, providing flexible date and datetime picking functionality with various display modes and configurations.
4
+
5
+ ## Features
6
+
7
+ - **DatePicker**: Simple date selection with calendar popup
8
+ - **DateTimePicker**: Date and time selection with calendar and time panel
9
+ - Multiple visual variants (plain, outlined, filled)
10
+ - Keyboard navigation support
11
+ - Min/max date restrictions
12
+ - Mandatory field support
13
+ - Readonly and disabled states
14
+ - Display-only mode for read-only presentation
15
+ - International date formatting
16
+ - Accessible design with ARIA support
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ npm install @ticatec/uniface-element
22
+ ```
23
+
24
+ ```typescript
25
+ import DatePicker from '@ticatec/uniface-element/DatePicker';
26
+ import DateTimePicker from '@ticatec/uniface-element/DateTimePicker';
27
+ ```
28
+
29
+ Or if using within the same project:
30
+ ```typescript
31
+ import DatePicker from '$lib/date-picker';
32
+ import { DateTimePicker } from '$lib/date-picker';
33
+ ```
34
+
35
+ ## DatePicker
36
+
37
+ ### Basic Usage
38
+
39
+ ```svelte
40
+ <script>
41
+ import DatePicker from '$lib/date-picker';
42
+
43
+ let selectedDate = null;
44
+ </script>
45
+
46
+ <DatePicker bind:value={selectedDate} placeholder="Select date" />
47
+ ```
48
+
49
+ ### Props
50
+
51
+ | Prop | Type | Default | Description |
52
+ |------|------|---------|-------------|
53
+ | `value` | `Date \| null` | `null` | Selected date value |
54
+ | `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | Visual style variant |
55
+ | `disabled` | `boolean` | `false` | Disables the picker |
56
+ | `readonly` | `boolean` | `false` | Makes the picker read-only |
57
+ | `compact` | `boolean` | `false` | Compact display mode |
58
+ | `mandatory` | `boolean` | `false` | Required field (hides clear button) |
59
+ | `style` | `string` | `''` | Custom CSS styles |
60
+ | `placeholder` | `string` | `""` | Input placeholder text |
61
+ | `displayMode` | `DisplayMode` | `DisplayMode.Edit` | Display mode (Edit/View) |
62
+ | `min` | `UniDate` | `null` | Minimum selectable date |
63
+ | `max` | `UniDate` | `null` | Maximum selectable date |
64
+ | `onchange` | `OnChangeHandler<Date>` | `null` | Change event handler |
65
+ | `onfocus` | `() => void` | `null` | Focus event handler |
66
+ | `onblur` | `() => void` | `null` | Blur event handler |
67
+
68
+ ### Methods
69
+
70
+ | Method | Description |
71
+ |--------|-------------|
72
+ | `setFocus()` | Programmatically focus the picker |
73
+
74
+ ### Examples
75
+
76
+ #### Basic Date Picker
77
+ ```svelte
78
+ <DatePicker bind:value={enrolmentDate} placeholder="Select enrolment date" />
79
+ ```
80
+
81
+ #### Outlined Mandatory Date Picker
82
+ ```svelte
83
+ <DatePicker
84
+ variant="outlined"
85
+ mandatory
86
+ bind:value={birthday}
87
+ placeholder="Date of birth (required)"
88
+ />
89
+ ```
90
+
91
+ #### Filled Date Picker
92
+ ```svelte
93
+ <DatePicker
94
+ variant="filled"
95
+ bind:value={admissionDate}
96
+ placeholder="Admission date"
97
+ />
98
+ ```
99
+
100
+ #### Date Picker with Min/Max Restrictions
101
+ ```svelte
102
+ <!-- Only allow dates up to today -->
103
+ <DatePicker
104
+ variant="filled"
105
+ max={new Date()}
106
+ bind:value={completedDate}
107
+ placeholder="Completion date"
108
+ />
109
+
110
+ <!-- Only allow dates from tomorrow onwards -->
111
+ <DatePicker
112
+ variant="filled"
113
+ min={new Date()}
114
+ bind:value={bookFrom}
115
+ placeholder="Booking start date"
116
+ />
117
+ ```
118
+
119
+ #### Disabled and Readonly States
120
+ ```svelte
121
+ <!-- Disabled -->
122
+ <DatePicker variant="filled" disabled bind:value={admissionDate} />
123
+
124
+ <!-- Readonly -->
125
+ <DatePicker variant="filled" readonly bind:value={admissionDate} />
126
+
127
+ <!-- Display only mode -->
128
+ <DatePicker
129
+ displayMode={DisplayMode.View}
130
+ variant="filled"
131
+ readonly
132
+ bind:value={admissionDate}
133
+ />
134
+ ```
135
+
136
+ ## DateTimePicker
137
+
138
+ ### Basic Usage
139
+
140
+ ```svelte
141
+ <script>
142
+ import { DateTimePicker } from '$lib/date-picker';
143
+
144
+ let selectedDateTime = null;
145
+ </script>
146
+
147
+ <DateTimePicker bind:value={selectedDateTime} placeholder="Select date and time" />
148
+ ```
149
+
150
+ ### Props
151
+
152
+ | Prop | Type | Default | Description |
153
+ |------|------|---------|-------------|
154
+ | `value` | `UniDate` | `null` | Selected datetime value |
155
+ | `variant` | `'' \| 'plain' \| 'outlined' \| 'filled'` | `''` | Visual style variant |
156
+ | `disabled` | `boolean` | `false` | Disables the picker |
157
+ | `readonly` | `boolean` | `false` | Makes the picker read-only |
158
+ | `compact` | `boolean` | `false` | Compact display mode |
159
+ | `mandatory` | `boolean` | `false` | Required field (hides clear button) |
160
+ | `style` | `string` | `''` | Custom CSS styles |
161
+ | `placeholder` | `string` | `""` | Input placeholder text |
162
+ | `displayMode` | `DisplayMode` | `DisplayMode.Edit` | Display mode (Edit/View) |
163
+ | `min` | `UniDate` | `null` | Minimum selectable date |
164
+ | `max` | `UniDate` | `null` | Maximum selectable date |
165
+ | `precision` | `"H" \| "M" \| "S"` | `"M"` | Time precision (Hour/Minute/Second) |
166
+ | `onchange` | `OnChangeHandler<Date>` | `null` | Change event handler |
167
+ | `onfocus` | `() => void` | `null` | Focus event handler |
168
+ | `onblur` | `() => void` | `null` | Blur event handler |
169
+
170
+ ### Methods
171
+
172
+ | Method | Description |
173
+ |--------|-------------|
174
+ | `setFocus()` | Programmatically focus the picker |
175
+
176
+ ### Examples
177
+
178
+ #### Basic DateTime Picker
179
+ ```svelte
180
+ <DateTimePicker bind:value={cutoffTime} placeholder="Select cutoff time" />
181
+ ```
182
+
183
+ #### DateTime Picker with Second Precision
184
+ ```svelte
185
+ <DateTimePicker
186
+ variant="outlined"
187
+ precision="S"
188
+ mandatory
189
+ bind:value={releaseDate}
190
+ placeholder="Release datetime (to seconds)"
191
+ />
192
+ ```
193
+
194
+ #### DateTime Picker with Hour Precision
195
+ ```svelte
196
+ <DateTimePicker
197
+ variant="filled"
198
+ precision="H"
199
+ bind:value={appointmentTime}
200
+ placeholder="Appointment time (hour precision)"
201
+ />
202
+ ```
203
+
204
+ ## Time Precision
205
+
206
+ The `precision` prop in DateTimePicker controls the time granularity:
207
+
208
+ - **"H"**: Hour precision (YYYY-MM-DD HH:00)
209
+ - **"M"**: Minute precision (YYYY-MM-DD HH:mm) - Default
210
+ - **"S"**: Second precision (YYYY-MM-DD HH:mm:ss)
211
+
212
+ ## Display Modes
213
+
214
+ Both components support different display modes via the `displayMode` prop:
215
+
216
+ - **`DisplayMode.Edit`**: Full editing capabilities (default)
217
+ - **`DisplayMode.View`**: Read-only display mode
218
+
219
+ ## Variants
220
+
221
+ Both components support multiple visual styles:
222
+
223
+ - **Default** (`''`): Basic styling
224
+ - **`'plain'`**: Minimal styling
225
+ - **`'outlined'`**: Outlined border style
226
+ - **`'filled'`**: Filled background style
227
+
228
+ ## Keyboard Navigation
229
+
230
+ Both components support keyboard navigation:
231
+
232
+ - **Backspace/Delete**: Clear the selected date/time
233
+ - **Escape**: Close the popup
234
+ - **Tab**: Navigate through the interface
235
+ - **Enter**: Confirm selection (in DateTimePicker)
236
+
237
+ ## Accessibility
238
+
239
+ - Full ARIA support for screen readers
240
+ - Keyboard navigation
241
+ - Focus management
242
+ - Proper labeling and descriptions
243
+
244
+ ## Date Formats
245
+
246
+ - **DatePicker**: YYYY-MM-DD
247
+ - **DateTimePicker**:
248
+ - Hour precision: YYYY-MM-DD HH:mm
249
+ - Minute precision: YYYY-MM-DD HH:mm
250
+ - Second precision: YYYY-MM-DD HH:mm:ss
251
+
252
+ ## Event Handling
253
+
254
+ ```svelte
255
+ <script>
256
+ function handleDateChange(date) {
257
+ console.log('Date selected:', date);
258
+ }
259
+
260
+ function handleFocus() {
261
+ console.log('Picker focused');
262
+ }
263
+
264
+ function handleBlur() {
265
+ console.log('Picker blurred');
266
+ }
267
+ </script>
268
+
269
+ <DatePicker
270
+ bind:value={selectedDate}
271
+ onchange={handleDateChange}
272
+ onfocus={handleFocus}
273
+ onblur={handleBlur}
274
+ />
275
+ ```
276
+
277
+ ## Styling
278
+
279
+ Both components inherit styling from the Uniface design system and can be customized with CSS variables:
280
+
281
+ ```css
282
+ .uniface-date-time-editor {
283
+ --uniface-inside-border-color: #f0f0f0;
284
+ /* Add custom styling */
285
+ }
286
+ ```
287
+
288
+ ## Integration with Forms
289
+
290
+ Both components work seamlessly with FormField:
291
+
292
+ ```svelte
293
+ <script>
294
+ import FormField from '$lib/form-field';
295
+ import DatePicker, { DateTimePicker } from '$lib/date-picker';
296
+ </script>
297
+
298
+ <FormField label="Date of Birth">
299
+ <DatePicker variant="outlined" mandatory bind:value={dateOfBirth} />
300
+ </FormField>
301
+
302
+ <FormField label="Appointment Time">
303
+ <DateTimePicker variant="filled" precision="M" bind:value={appointmentTime} />
304
+ </FormField>
305
+ ```
306
+
307
+ ## Type Definitions
308
+
309
+ ```typescript
310
+ type UniDate = Date | dayjs.Dayjs | string | null;
311
+ type OnChangeHandler<T> = (value: T | null) => void;
312
+
313
+ enum DisplayMode {
314
+ Edit = 'edit',
315
+ View = 'view'
316
+ }
317
+ ```
318
+
319
+ ## Notes
320
+
321
+ - The components use Day.js internally for date manipulation
322
+ - Values are always returned as native JavaScript Date objects
323
+ - The calendar popup automatically closes when a date is selected
324
+ - The DateTime picker requires confirmation before applying the selection
325
+ - Min/max date restrictions are enforced in the calendar view
326
+ - The clear button is hidden when `mandatory` is true