@reliability-design/web 1.4.6 → 1.4.8

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 (148) hide show
  1. package/CHANGELOG.md +246 -49
  2. package/dist/components/rel-accordion/README.md +133 -132
  3. package/dist/components/rel-alert/README.md +145 -141
  4. package/dist/components/rel-autocomplete/README.md +172 -61
  5. package/dist/components/rel-avatar/README.md +118 -130
  6. package/dist/components/rel-badge/README.md +97 -93
  7. package/dist/components/rel-breadcrumb/README.md +96 -102
  8. package/dist/components/rel-button/README.md +190 -130
  9. package/dist/components/rel-calendar/README.md +109 -109
  10. package/dist/components/rel-card/README.md +75 -94
  11. package/dist/components/rel-cardmedia/README.md +100 -127
  12. package/dist/components/rel-carousel/README.md +186 -166
  13. package/dist/components/rel-checkbox/README.md +96 -75
  14. package/dist/components/rel-chip/README.md +138 -121
  15. package/dist/components/rel-container/README.md +107 -99
  16. package/dist/components/rel-date-picker/README.md +200 -289
  17. package/dist/components/rel-divider/README.md +88 -100
  18. package/dist/components/rel-drawer/README.md +187 -200
  19. package/dist/components/rel-kbd/README.md +141 -151
  20. package/dist/components/rel-layout/README.md +34 -0
  21. package/dist/components/rel-menu/README.md +180 -151
  22. package/dist/components/rel-menubar/README.md +218 -329
  23. package/dist/components/rel-otp/README.md +171 -440
  24. package/dist/components/rel-pagination/README.md +100 -424
  25. package/dist/components/rel-popover/README.md +203 -568
  26. package/dist/components/rel-progress/README.md +88 -110
  27. package/dist/components/rel-radio/README.md +131 -138
  28. package/dist/components/rel-range-picker/README.md +165 -0
  29. package/dist/components/rel-resizable/README.md +199 -140
  30. package/dist/components/rel-segmented-button/README.md +156 -141
  31. package/dist/components/rel-select/README.md +156 -93
  32. package/dist/components/rel-sheet/README.md +168 -224
  33. package/dist/components/rel-skeleton/README.md +104 -0
  34. package/dist/components/rel-slider/README.md +131 -135
  35. package/dist/components/rel-snackbar/README.md +168 -134
  36. package/dist/components/rel-stepper/README.md +162 -160
  37. package/dist/components/rel-switch/README.md +117 -102
  38. package/dist/components/rel-tab/README.md +173 -163
  39. package/dist/components/rel-textfield/README.md +176 -69
  40. package/dist/components/rel-time-picker/README.md +122 -157
  41. package/dist/components/rel-toast/README.md +165 -148
  42. package/dist/components/rel-tooltip/README.md +119 -111
  43. package/dist/components/rel-upload/README.md +220 -0
  44. package/dist/index.d.mts +1726 -447
  45. package/dist/index.d.ts +1726 -447
  46. package/dist/index.js +13715 -10870
  47. package/dist/index.js.map +1 -1
  48. package/dist/index.mjs +14018 -11163
  49. package/dist/index.mjs.map +1 -1
  50. package/dist/styles/focus-ring.ts +84 -0
  51. package/dist/styles/vars.css +892 -866
  52. package/dist/{vars-XNMTSRVN.css → vars-DXX6QOAG.css} +892 -866
  53. package/package.json +3 -2
  54. package/dist/components/rel-accordion/rel-accordion.ts +0 -336
  55. package/dist/components/rel-alert/rel-alert.ts +0 -305
  56. package/dist/components/rel-autocomplete/rel-autocomplete.ts +0 -720
  57. package/dist/components/rel-avatar/rel-avatar.ts +0 -142
  58. package/dist/components/rel-badge/rel-badge.ts +0 -175
  59. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +0 -106
  60. package/dist/components/rel-button/rel-button.ts +0 -560
  61. package/dist/components/rel-calendar/index.ts +0 -1
  62. package/dist/components/rel-calendar/rel-calendar.ts +0 -565
  63. package/dist/components/rel-card/rel-card.ts +0 -88
  64. package/dist/components/rel-cardmedia/rel-cardmedia.ts +0 -88
  65. package/dist/components/rel-carousel/index.ts +0 -1
  66. package/dist/components/rel-carousel/rel-carousel.ts +0 -723
  67. package/dist/components/rel-chart/README.md +0 -286
  68. package/dist/components/rel-chart/index.ts +0 -1
  69. package/dist/components/rel-chart/rel-chart.ts +0 -754
  70. package/dist/components/rel-checkbox/rel-checkbox.ts +0 -382
  71. package/dist/components/rel-chip/rel-chip.ts +0 -483
  72. package/dist/components/rel-container/rel-container.ts +0 -95
  73. package/dist/components/rel-date-picker/date-format.test.ts +0 -43
  74. package/dist/components/rel-date-picker/date-format.ts +0 -47
  75. package/dist/components/rel-date-picker/date-parse.test.ts +0 -116
  76. package/dist/components/rel-date-picker/date-parse.ts +0 -178
  77. package/dist/components/rel-date-picker/index.ts +0 -1
  78. package/dist/components/rel-date-picker/rel-date-picker.ts +0 -1676
  79. package/dist/components/rel-divider/rel-divider.ts +0 -54
  80. package/dist/components/rel-drawer/index.ts +0 -1
  81. package/dist/components/rel-drawer/rel-drawer-footer.ts +0 -27
  82. package/dist/components/rel-drawer/rel-drawer.ts +0 -607
  83. package/dist/components/rel-kbd/rel-kbd.ts +0 -188
  84. package/dist/components/rel-layout/rel-layout.ts +0 -49
  85. package/dist/components/rel-menu/rel-menu.ts +0 -541
  86. package/dist/components/rel-menubar/index.ts +0 -2
  87. package/dist/components/rel-menubar/rel-menubar-menu.css +0 -3
  88. package/dist/components/rel-menubar/rel-menubar-menu.ts +0 -17
  89. package/dist/components/rel-menubar/rel-menubar.ts +0 -777
  90. package/dist/components/rel-nav-menu/README.md +0 -289
  91. package/dist/components/rel-nav-menu/index.ts +0 -3
  92. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +0 -243
  93. package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +0 -72
  94. package/dist/components/rel-nav-menu/rel-nav-menu.ts +0 -270
  95. package/dist/components/rel-navbar/README.md +0 -126
  96. package/dist/components/rel-navbar/rel-navbar.ts +0 -105
  97. package/dist/components/rel-otp/index.ts +0 -1
  98. package/dist/components/rel-otp/rel-otp.ts +0 -527
  99. package/dist/components/rel-pagination/index.ts +0 -1
  100. package/dist/components/rel-pagination/rel-pagination.ts +0 -522
  101. package/dist/components/rel-popover/index.ts +0 -2
  102. package/dist/components/rel-popover/rel-popover-content.ts +0 -81
  103. package/dist/components/rel-popover/rel-popover.ts +0 -475
  104. package/dist/components/rel-progress/rel-progress.ts +0 -234
  105. package/dist/components/rel-radio/rel-radio.ts +0 -481
  106. package/dist/components/rel-range-picker/rel-range-picker.ts +0 -1688
  107. package/dist/components/rel-resizable/index.ts +0 -3
  108. package/dist/components/rel-resizable/rel-resizable-group.ts +0 -405
  109. package/dist/components/rel-resizable/rel-resizable-handle.ts +0 -150
  110. package/dist/components/rel-resizable/rel-resizable-panel.ts +0 -58
  111. package/dist/components/rel-segmented-button/rel-segmented-button.ts +0 -217
  112. package/dist/components/rel-select/rel-select.ts +0 -1416
  113. package/dist/components/rel-sheet/rel-sheet.ts +0 -610
  114. package/dist/components/rel-sidebar/README.md +0 -209
  115. package/dist/components/rel-sidebar/rel-sidebar.ts +0 -1191
  116. package/dist/components/rel-skeleton/rel-skeleton.ts +0 -143
  117. package/dist/components/rel-slider/rel-slider.ts +0 -673
  118. package/dist/components/rel-snackbar/rel-snackbar.ts +0 -329
  119. package/dist/components/rel-stepper/rel-stepper.ts +0 -567
  120. package/dist/components/rel-switch/rel-switch.ts +0 -199
  121. package/dist/components/rel-tab/rel-tab.ts +0 -264
  122. package/dist/components/rel-table/README.md +0 -178
  123. package/dist/components/rel-table/rel-table-body.ts +0 -22
  124. package/dist/components/rel-table/rel-table-caption.ts +0 -30
  125. package/dist/components/rel-table/rel-table-cell.ts +0 -43
  126. package/dist/components/rel-table/rel-table-footer.ts +0 -24
  127. package/dist/components/rel-table/rel-table-head.ts +0 -47
  128. package/dist/components/rel-table/rel-table-header.ts +0 -22
  129. package/dist/components/rel-table/rel-table-row.ts +0 -37
  130. package/dist/components/rel-table/rel-table.ts +0 -62
  131. package/dist/components/rel-textfield/rel-textfield.ts +0 -1054
  132. package/dist/components/rel-time-picker/rel-time-picker.ts +0 -1482
  133. package/dist/components/rel-time-picker/time-parse.test.ts +0 -67
  134. package/dist/components/rel-time-picker/time-parse.ts +0 -85
  135. package/dist/components/rel-toast/rel-toast.ts +0 -206
  136. package/dist/components/rel-tooltip/rel-tooltip.ts +0 -193
  137. package/dist/components/rel-topbar/rel-topbar-actions.ts +0 -27
  138. package/dist/components/rel-topbar/rel-topbar-brand.ts +0 -54
  139. package/dist/components/rel-topbar/rel-topbar-dropdown-item.ts +0 -69
  140. package/dist/components/rel-topbar/rel-topbar-dropdown.ts +0 -31
  141. package/dist/components/rel-topbar/rel-topbar-item.ts +0 -324
  142. package/dist/components/rel-topbar/rel-topbar-mobile-panel.ts +0 -27
  143. package/dist/components/rel-topbar/rel-topbar-profile.ts +0 -243
  144. package/dist/components/rel-topbar/rel-topbar-utilities.ts +0 -27
  145. package/dist/components/rel-topbar/rel-topbar.ts +0 -446
  146. package/dist/components/rel-upload/UPLOAD-DESIGN-CHANGES.md +0 -134
  147. package/dist/components/rel-upload/rel-upload-actions.ts +0 -163
  148. package/dist/components/rel-upload/rel-upload.ts +0 -968
@@ -1,199 +1,164 @@
1
1
  # rel-time-picker
2
2
 
3
- A fully accessible time picker component built with Lit for the Reliability Design System. Features a trigger button with an hour/minute (and AM/PM) column popover. Selections are held in draft state until Apply is clicked, mirroring the rel-range-picker interaction model.
4
-
5
- ## Features
6
-
7
- - Trigger button with time-column popover (Hour / Min / AM-PM)
8
- - 12-hour and 24-hour display formats
9
- - Configurable minute intervals (1, 5, 10, 15, 30, …)
10
- - Draft state with Now / Cancel / Apply footer
11
- - Min/max time constraints
12
- - Optional clear button
13
- - Label, placeholder, helper text and error states
14
- - Standardized input API (mirrors rel-textfield / rel-date-picker)
15
- - Keyboard navigation and full ARIA support
16
- - Token-driven styling with `::part` hooks
17
-
18
- ## Value format
19
-
20
- The committed `value` is **always 24-hour `"HH:mm"`** (e.g. `"09:30"`, `"17:05"`) regardless of the display `format`, so consumers get a consistent machine-readable string.
3
+ Time selection field implementing the Figma "Time Picker" component (Reliability DS V1.0, node 8301:3771): an editable text field with a clock icon that opens a panel of Hour / Minute (/ Second / AM-PM) columns and a Now / Cancel / OK footer. Column picks are held as a draft until OK; the field also accepts free-form typed times ("930", "9:30 pm", "n" for now). The committed `value` is always 24-hour `"HH:mm"` (or `"HH:mm:ss"` with `seconds`) regardless of the display `format`. Use it for a single time of day; use `rel-date-picker` for dates and `rel-range-picker` for date ranges.
21
4
 
22
5
  ## Usage
23
6
 
24
- ### Basic
25
-
26
7
  ```html
8
+ <!-- Basic (12-hour display, 5-minute steps) -->
27
9
  <rel-time-picker></rel-time-picker>
28
- ```
29
-
30
- ### With Value
31
10
 
32
- ```html
33
- <rel-time-picker value="09:30"></rel-time-picker>
34
- ```
35
-
36
- ### With Label
37
-
38
- ```html
39
- <rel-time-picker label="Start time" placeholder="Select time"></rel-time-picker>
40
- ```
11
+ <!-- Value is always 24-hour HH:mm; the field shows it per `format` -->
12
+ <rel-time-picker value="09:30" label="Start time"></rel-time-picker>
13
+ <rel-time-picker value="17:05" format="24h"></rel-time-picker>
41
14
 
42
- ### 24-hour format
15
+ <!-- Seconds column; value becomes HH:mm:ss -->
16
+ <rel-time-picker seconds value="17:05:30" format="24h"></rel-time-picker>
43
17
 
44
- ```html
45
- <rel-time-picker format="24h" value="17:05"></rel-time-picker>
46
- ```
47
-
48
- ### Minute intervals
49
-
50
- ```html
18
+ <!-- Minute granularity of the column (typed entry still accepts any minute) -->
51
19
  <rel-time-picker minute-step="15"></rel-time-picker>
52
- <rel-time-picker minute-step="30"></rel-time-picker>
53
- ```
20
+ <rel-time-picker minute-step="1"></rel-time-picker>
54
21
 
55
- ### With Min/Max
22
+ <!-- Constrain to business hours (inclusive, HH:mm) -->
23
+ <rel-time-picker min-time="09:00" max-time="17:30" placeholder="Business hours only"></rel-time-picker>
56
24
 
57
- ```html
58
- <rel-time-picker
59
- min-time="09:00"
60
- max-time="17:30"
61
- placeholder="Business hours only"
62
- ></rel-time-picker>
63
- ```
64
-
65
- ### Clearable
66
-
67
- ```html
25
+ <!-- Clear button, helper / error text, required -->
68
26
  <rel-time-picker value="09:30" clearable></rel-time-picker>
69
- ```
70
-
71
- ### States
27
+ <rel-time-picker label="Start time" helper-text="Local timezone"></rel-time-picker>
28
+ <rel-time-picker label="Start time" error error-message="Select a valid time"></rel-time-picker>
29
+ <rel-time-picker label="Start time" required></rel-time-picker>
72
30
 
73
- ```html
31
+ <!-- States -->
74
32
  <rel-time-picker value="09:30" disabled></rel-time-picker>
75
33
  <rel-time-picker value="09:30" readonly></rel-time-picker>
76
- <rel-time-picker error error-message="Select a valid time"></rel-time-picker>
77
- <rel-time-picker helper-text="Local timezone"></rel-time-picker>
78
- <rel-time-picker label="Start time" required></rel-time-picker>
79
- ```
80
-
81
- ### Sizes / layout
82
34
 
83
- ```html
35
+ <!-- Sizes (field 32 / 40 / 48px, panel 220 / 250 / 280px) and layout -->
84
36
  <rel-time-picker size="small"></rel-time-picker>
37
+ <rel-time-picker size="medium"></rel-time-picker>
85
38
  <rel-time-picker size="large"></rel-time-picker>
86
- <rel-time-picker fullWidth></rel-time-picker>
87
- ```
88
-
89
- ### Form usage
39
+ <rel-time-picker fullwidth label="Full width"></rel-time-picker>
90
40
 
91
- ```html
41
+ <!-- Form integration: `name` renders a hidden input carrying the value -->
92
42
  <form>
93
43
  <rel-time-picker name="startTime" label="Start time" required></rel-time-picker>
94
44
  </form>
95
- ```
96
-
97
- The value is mirrored onto a hidden `<input name="...">` so native form submission works.
98
-
99
- ### Programmatic Control (JavaScript)
100
45
 
101
- ```javascript
102
- const picker = document.querySelector('rel-time-picker');
103
-
104
- // Set value (always 24h HH:mm)
105
- picker.value = '14:30';
106
-
107
- // Open programmatically
108
- picker.open = true;
109
-
110
- // Listen to changes (fired on Apply, and on clear with value: null)
111
- picker.addEventListener('rel-change', (e) => {
112
- console.log('Selected time:', e.detail.value); // "14:30" | null
113
- });
114
-
115
- picker.addEventListener('rel-open-change', (e) => {
116
- console.log('Open:', e.detail.open);
117
- });
46
+ <!-- Programmatic control -->
47
+ <rel-time-picker id="tp" clearable></rel-time-picker>
48
+ <script>
49
+ const picker = document.getElementById('tp');
50
+ picker.value = '14:30'; // always 24h
51
+ picker.open = true; // opens the panel and focuses the selected hour
52
+
53
+ picker.addEventListener('rel-change', (e) => {
54
+ console.log('time:', e.detail.value); // "14:30" | "14:30:00" | null (cleared)
55
+ });
56
+ picker.addEventListener('rel-open-change', (e) => {
57
+ console.log('open:', e.detail.open);
58
+ });
59
+ </script>
118
60
  ```
119
61
 
120
- ## Interaction model
62
+ ### Typed entry
121
63
 
122
- - Clicking a column entry updates the **draft** shown in the readout row; nothing is committed yet.
123
- - **Apply** commits the draft, emits `rel-change` and closes.
124
- - **Cancel**, `Escape` or an outside click discards the draft (same as rel-range-picker).
125
- - **Now** sets the draft to the current time, snapped to `minute-step` and clamped into `min-time`/`max-time`.
126
- - Picking an hour with no minute selected defaults the minute to `00`.
64
+ Typing into the field and pressing `Enter` (or leaving the field) commits the text. Accepted forms are case- and whitespace-insensitive: `9` → 09:00, `930` / `0930` / `9:30` / `9.30` / `9 30` → 09:30, `093015` / `9:30:15` → 09:30:15, `9 pm` / `9:30p` → 21:00 / 21:30, `12am` → 00:00, `12 pm` → 12:00, and `n` / `now` → the current time. Unparseable text shows "Invalid time", a time outside `min-time` / `max-time` shows "Time out of range"; in both cases the text stays in the field for correction and the committed `value` is untouched.
127
65
 
128
- ## Keyboard
66
+ <!-- readme-gen:start -->
129
67
 
130
- | Key | Context | Action |
131
- | --- | --- | --- |
132
- | `Enter` / `Space` / `ArrowDown` | Trigger | Open the popover |
133
- | `ArrowUp` / `ArrowDown` | Column | Move and select the previous/next entry |
134
- | `ArrowLeft` / `ArrowRight` | Column | Jump between Hour / Min / AM-PM columns |
135
- | `Home` / `End` | Column | First / last entry |
136
- | `Enter` | Column | Select the entry and Apply |
137
- | `Escape` | Anywhere | Discard draft and close |
68
+ <!-- Generated from rel-time-picker.ts — do not edit; run readme-generate.mjs -->
69
+
70
+ ## API
138
71
 
139
- ## Properties
72
+ ### Attributes / Properties
140
73
 
141
74
  | Property | Attribute | Type | Default | Description |
142
75
  | --- | --- | --- | --- | --- |
143
- | `value` | `value` | `string \| null` | `null` | Committed time, 24h `"HH:mm"` |
144
- | `placeholder` | `placeholder` | `string` | `"Select time"` | Trigger text when empty |
145
- | `label` | `label` | `string \| null` | `null` | Field label |
146
- | `format` | `format` | `"12h" \| "24h"` | `"12h"` | Display format (value stays `HH:mm`) |
147
- | `minuteStep` | `minute-step` | `number` | `1` | Minute column granularity |
148
- | `minTime` | `min-time` | `string \| null` | `null` | Earliest selectable time (inclusive) |
149
- | `maxTime` | `max-time` | `string \| null` | `null` | Latest selectable time (inclusive) |
150
- | `disabled` | `disabled` | `boolean` | `false` | Disables all interaction |
151
- | `readonly` | `readonly` | `boolean` | `false` | Value shown, popover cannot open |
152
- | `required` | `required` | `boolean` | `false` | Renders `*` and sets `aria-required` |
153
- | `clearable` | `clearable` | `boolean` | `false` | Clear button when a value is set |
154
- | `open` | `open` | `boolean` | `false` | Controls / reflects popover state |
155
- | `error` | `error` | `boolean` | `false` | Error styling |
156
- | `invalid` | `invalid` | `boolean` | `false` | Alias for `error` |
157
- | `errorMessage` | `error-message` | `string` | — | Shown below when error/invalid |
158
- | `helperText` | `helper-text` | `string` | — | Assistive text below the field |
159
- | `name` | `name` | `string` | — | Form field name (hidden input) |
160
- | `size` | `size` | `"small" \| "medium" \| "large"` | `"medium"` | Trigger size |
161
- | `fullWidth` | `fullWidth` | `boolean` | `false` | Fill the parent width |
162
- | `variant` | `variant` | `"outlined"` | `"outlined"` | Visual style |
76
+ | `value` | `value` | `string \| null` | `null` | Committed time, 24-hour "HH:mm" or "HH:mm:ss" (e.g. "09:30", "17:05:30"). Reflected. |
77
+ | `placeholder` | `placeholder` | `string` | `"Select time"` | Placeholder shown in the field while no value is committed and nothing is typed. |
78
+ | `label` | `label` | `string \| null` | `null` | Field label rendered above the trigger; also the input's accessible name (unset → "Select time"). |
79
+ | `disabled` | `disabled` | `boolean` | `false` | Disables the field (0.6 opacity, no pointer events); the panel cannot open. Reflected. |
80
+ | `required` | `required` | `boolean` | `false` | Renders the `*` mark after the label and sets `aria-required`; not enforced by the component. |
81
+ | `readonly` | `readonly` | `boolean` | `false` | Shows the value but blocks typing and opening the panel. Reflected. |
82
+ | `format` | `format` | `"12h" \| "24h"` | `"12h"` | Display format of the trigger text and hour column. Value stays 24-hour. |
83
+ | `seconds` | `seconds` | `boolean` | `false` | Shows the seconds column; committed value becomes "HH:mm:ss". Reflected. |
84
+ | `minuteStep` | `minute-step` | `number` | `5` | Minute granularity of the minutes column (1, 5, 10, 15, 30, …). |
85
+ | `minTime` | `min-time` | `string \| null` | `null` | Earliest selectable time, "HH:mm" (inclusive). |
86
+ | `maxTime` | `max-time` | `string \| null` | `null` | Latest selectable time, "HH:mm" (inclusive). |
87
+ | `open` | `open` | `boolean` | `false` | Whether the panel is open. Settable from outside; opening resets the draft from `value` (programmatic changes do not fire `rel-open-change`). Reflected. |
88
+ | `clearable` | `clearable` | `boolean` | `false` | Shows a clear (×) button inside the field while a value is set; clearing commits `null`. |
89
+ | `error` | `error` | `boolean` | `false` | Error styling (danger border, `aria-invalid`) and shows `errorMessage` below the field. |
90
+ | `invalid` | `invalid` | `boolean` | `false` | Alias for `error` (requested-API compat); either flag applies error styling. |
91
+ | `errorMessage` | `error-message` | `string` | `undefined` | Text shown below the field while `error` / `invalid` is set (falls back to the typed-entry parse error, then `helperText`). |
92
+ | `helperText` | `helper-text` | `string` | `undefined` | Assistive text shown below the field when not in error. |
93
+ | `name` | `name` | `string` | `undefined` | When set, renders a hidden `<input name="…">` carrying `value` for native form submission. |
94
+ | `size` | `size` | `"small" \| "medium" \| "large"` | `"medium"` | Trigger height on the shared field scale — small 32 / medium 40 / large 48px border-box; also sets the panel width (220 / 250 / 280px) and option row height (32 / 36 / 40px). Small lowers the trigger min-width from 160 to 128px. |
95
+ | `variant` | `variant` | `"outlined"` | `"outlined"` | Visual style; only `"outlined"` exists today. Reflected. |
96
+ | `fullWidth` | `fullwidth` | `boolean` | `false` | Fills the parent width (the host is inline-block with intrinsic width otherwise). The attribute is lowercase `fullwidth`. Reflected. |
163
97
 
164
98
  ## Events
165
99
 
166
- | Event | Detail | Description |
167
- | --- | --- | --- |
168
- | `rel-change` | `{ value: string \| null }` | Fired on Apply and on clear |
169
- | `rel-open-change` | `{ open: boolean }` | Popover opened/closed |
170
- | `rel-focus` | — | Trigger received focus |
171
- | `rel-blur` | — | Trigger lost focus |
100
+ | Event | Detail | Bubbles / composed | Description |
101
+ | --- | --- | --- | --- |
102
+ | `rel-blur` | — | bubbles / composed | Fired when the text input loses focus (before any typed text is committed). No detail. |
103
+ | `rel-change` | `{ value: newValue } / { value: null }` | bubbles / composed | Fired when a time is committed (OK, Enter / blur on typed text, the Now shortcut) or cleared. Detail: `{ value: string \| null }` — 24-hour "HH:mm" / "HH:mm:ss", or `null` after a clear. |
104
+ | `rel-focus` | — | bubbles / composed | Fired when the text input receives focus. No detail. |
105
+ | `rel-open-change` | `{ open: this.open } / { open: false }` | bubbles / composed | Fired whenever the panel opens or closes through user interaction. Detail: `{ open: boolean }`. |
172
106
 
173
- ## CSS Parts
107
+ ## Slots
174
108
 
175
- | Part | Element |
109
+ | Slot | Description |
176
110
  | --- | --- |
177
- | `base` | Outer wrapper |
178
- | `label` | Field label |
179
- | `trigger` | Trigger button |
180
- | `value` | Trigger value/placeholder text |
181
- | `icon` | Trailing clock icon |
182
- | `panel` | Popover panel |
183
- | `option` | Hour/minute/period entries |
184
- | `footer` | Now / Cancel / Apply row |
185
- | `helper` | Helper / error text |
186
-
187
- ```css
188
- /* Example: widen the popover and restyle options */
189
- rel-time-picker::part(panel) {
190
- box-shadow: var(--rel-shadows-shadow-400);
191
- }
192
- rel-time-picker::part(option) {
193
- border-radius: var(--rel-border-radius-xs);
194
- }
195
- ```
111
+ | — | This element has no slots. |
196
112
 
197
- ## Design tokens
113
+ ## CSS Parts
198
114
 
199
- Styling is fully token-driven: surfaces (`--rel-bg-surface`, `--rel-bg-surface-elevated`), borders (`--rel-border-default`, `--rel-border-strong`, `--rel-border-focus`, `--rel-border-danger`, `--rel-border-subtle`), text (`--rel-text-default`, `--rel-text-label`, `--rel-text-placeholder`, `--rel-text-danger`, `--rel-text-disabled`), selection (`--rel-action-brand-fill`, `--rel-action-brand-label-icons-primary`), spacing, radius, shadows and the `--rel-body-*` typography roles.
115
+ | Part | Description |
116
+ | --- | --- |
117
+ | `base` | Outer wrapper; carries the size / error / readonly classes |
118
+ | `label` | The field label above the trigger |
119
+ | `trigger` | The field box that anchors the panel (wraps the text input and the icons) |
120
+ | `value` | The editable text input showing the formatted time |
121
+ | `icon` | The trailing clock icon |
122
+ | `panel` | The popover panel (`role="dialog"`) |
123
+ | `shortcuts` | The typed-shortcut chip row at the top of the panel (N → Now) |
124
+ | `option` | Each hour / minute / second / AM-PM entry button |
125
+ | `footer` | The Now / Cancel / OK row |
126
+ | `helper` | The helper / error text live region under the field |
127
+
128
+ <!-- readme-gen:end -->
129
+
130
+ ## Accessibility
131
+
132
+ - The editable field is an `<input type="text" role="combobox">` with `aria-haspopup="dialog"`, `aria-expanded`, `aria-controls` pointing at the panel, `aria-required` (from `required`), `aria-invalid` (from `error` / `invalid` / a typed-entry error) and `aria-describedby` pointing at the helper / error text. Its accessible name is the `label` (via `aria-labelledby`), falling back to `aria-label="Select time"`.
133
+ - The clock icon is a button labelled "Open time panel" with its own `aria-expanded`; the optional clear button is labelled "Clear time". The required mark `*` is `aria-hidden`.
134
+ - The panel is `role="dialog"` `aria-label="Choose time"`, promoted to the browser top layer (`popover="manual"`) so a modal / drawer ancestor cannot clip it. Each column is a `role="listbox"` named "Hours", "Minutes", "Seconds" or "AM or PM"; entries are `role="option"` buttons with `aria-selected`, and out-of-range entries are native `disabled`. Each column uses a roving `tabindex` (the selected entry, else the first).
135
+ - The helper / error text (part `helper`) is a persistent `aria-live="polite"` region, so error messages and typed-entry errors are announced as they appear.
136
+ - Focus: opening with the clock icon, `ArrowDown`, `Enter` or by setting `open` moves focus to the selected (or first enabled) hour without scrolling the page; opening by clicking into the field keeps focus in the input so typing continues to work. Cancel, `Escape` and OK return focus to the field; an outside click closes without refocusing.
137
+ - Screen-reader announcement (shared `announce()` utility): "{formatted time} selected" when OK commits the draft.
138
+
139
+ | Key | Where | Action |
140
+ | --- | --- | --- |
141
+ | Typing | Field | Edits the free-form text (see Typed entry); clears any previous parse error |
142
+ | `Enter` | Field | Commit the typed text; if nothing was typed, open the panel (closed) or apply the draft (open) |
143
+ | `ArrowDown` | Field | Open the panel, or move focus into the columns when already open |
144
+ | `Escape` | Field | Revert uncommitted typed text; also closes the panel discarding the draft |
145
+ | Blur | Field | Commit the typed text when focus leaves the component (moving into the panel does not commit) |
146
+ | `ArrowUp` / `ArrowDown` | Column | Move to and select the previous / next enabled entry |
147
+ | `ArrowLeft` / `ArrowRight` | Column | Jump to the previous / next column (Hour → Minute → Second → AM/PM) |
148
+ | `Home` / `End` | Column | Select the first / last enabled entry |
149
+ | `Enter` | Column | Select the entry and apply (OK) |
150
+ | `N` | Panel | Commit the current time immediately (same as the "N → Now" chip) and close |
151
+ | `Escape` | Anywhere | Discard the draft and close |
152
+
153
+ ## Notes / Edge Cases
154
+
155
+ - `value` is always 24-hour `"HH:mm"`, or `"HH:mm:ss"` when `seconds` is set; the `format` prop only changes the field text and the hour column (`12h` shows 01–12 plus an AM/PM column, `24h` shows 00–23). An unparseable `value` renders as empty.
156
+ - `min-time` / `max-time` are `"HH:mm"` (inclusive) and are compared at minute precision even with `seconds`. Hours with no in-range step minute and AM/PM periods with no enabled hour are disabled; picking an hour snaps the draft minute to the nearest in-range step.
157
+ - Draft model: column clicks only update the draft; **OK** commits and fires `rel-change`; **Cancel**, `Escape` or an outside click discard it (and fire `rel-open-change` with `open: false`). The OK button is disabled until an hour is chosen; picking an hour with no minute defaults the minute to `00`; picking a minute or second first defaults the hour to the first enabled one.
158
+ - Two "now" behaviours: the footer **Now** link sets the draft to the current time snapped to `minute-step` (and to the nearest enabled hour) — you still press OK; the `N` shortcut / typed `n` / the "N → Now" chip commit the current time immediately, clamped into `min-time` / `max-time`.
159
+ - Typed entry is not limited to `minute-step`: `9:07` commits `09:07` even with `minute-step="15"`. Typing an empty string and committing behaves like the clear button (`rel-change` with `value: null`).
160
+ - `minute-step` outside 1–60 falls back to 1; the seconds column is always step 1.
161
+ - `invalid` is a non-deprecated alias of `error`; either flag applies error styling. The text below the field is `error-message`, else the typed-entry error, else `helper-text`.
162
+ - Panel widths are fixed per `size` (220 / 250 / 280px, border-box) and capped to the viewport; it flips above the field when there is no room below and shrinks (columns scroll) rather than covering the field. Footer buttons are always small per the Figma spec; OK is narrowed to 60px min-width.
163
+ - Setting `open` programmatically opens the panel and resets the draft from `value`; it does not fire `rel-open-change` (only user interaction does).
164
+ - `fullWidth` reflects as the lowercase `fullwidth` attribute; the host is `inline-block` with intrinsic width otherwise.