playbook_ui 16.7.0 → 16.8.0.pre.rc.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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_date/docs/_playground.json +13 -17
  3. data/app/pb_kits/playbook/pb_date/docs/_playground.overrides.json +13 -16
  4. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +22 -3
  5. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +10 -7
  6. data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +14 -1
  7. data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +57 -0
  8. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.html.erb +0 -2
  9. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_inline.jsx +0 -2
  10. data/app/pb_kits/playbook/pb_date_picker/docs/_playground.json +136 -42
  11. data/app/pb_kits/playbook/pb_date_picker/docs/_playground.overrides.json +113 -45
  12. data/app/pb_kits/playbook/pb_date_range_inline/docs/_playground.json +48 -6
  13. data/app/pb_kits/playbook/pb_date_range_inline/docs/_playground.overrides.json +57 -0
  14. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_playground.json +28 -5
  15. data/app/pb_kits/playbook/pb_date_range_stacked/docs/_playground.overrides.json +38 -0
  16. data/app/pb_kits/playbook/pb_date_stacked/docs/_playground.json +1 -1
  17. data/app/pb_kits/playbook/pb_date_stacked/docs/_playground.overrides.json +1 -1
  18. data/app/pb_kits/playbook/pb_date_time/docs/_playground.json +16 -3
  19. data/app/pb_kits/playbook/pb_date_time/docs/_playground.overrides.json +16 -3
  20. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_playground.json +11 -15
  21. data/app/pb_kits/playbook/pb_date_time_stacked/docs/_playground.overrides.json +11 -15
  22. data/app/pb_kits/playbook/pb_date_year_stacked/docs/_playground.json +4 -4
  23. data/app/pb_kits/playbook/pb_date_year_stacked/docs/_playground.overrides.json +4 -4
  24. data/app/pb_kits/playbook/pb_detail/docs/_playground.json +12 -18
  25. data/app/pb_kits/playbook/pb_detail/docs/_playground.overrides.json +13 -12
  26. data/app/pb_kits/playbook/pb_dialog/docs/_playground.json +108 -42
  27. data/app/pb_kits/playbook/pb_dialog/docs/_playground.overrides.json +88 -40
  28. data/app/pb_kits/playbook/pb_distribution_bar/docs/_playground.json +65 -7
  29. data/app/pb_kits/playbook/pb_distribution_bar/docs/_playground.overrides.json +45 -0
  30. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +58 -0
  31. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.json +318 -21
  32. data/app/pb_kits/playbook/pb_dropdown/docs/_playground.overrides.json +192 -19
  33. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -0
  34. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +7 -1
  35. data/app/pb_kits/playbook/pb_empty_state/docs/_playground.json +77 -12
  36. data/app/pb_kits/playbook/pb_empty_state/docs/_playground.overrides.json +79 -0
  37. data/app/pb_kits/playbook/pb_file_upload/docs/_playground.json +98 -13
  38. data/app/pb_kits/playbook/pb_file_upload/docs/_playground.overrides.json +99 -0
  39. data/app/pb_kits/playbook/pb_link/docs/_playground.json +81 -40
  40. data/app/pb_kits/playbook/pb_link/docs/_playground.overrides.json +88 -30
  41. data/app/pb_kits/playbook/pb_phone_number_input/docs/_playground.json +4 -2
  42. data/app/pb_kits/playbook/pb_select/select.rb +9 -0
  43. data/app/pb_kits/playbook/pb_text_input/text_input.rb +9 -0
  44. data/app/pb_kits/playbook/pb_title/docs/_playground.json +72 -23
  45. data/app/pb_kits/playbook/pb_title/docs/_playground.overrides.json +80 -16
  46. data/dist/chunks/{_pb_line_graph-CIWJe3Gr.js → _pb_line_graph-D7f-RfJJ.js} +1 -1
  47. data/dist/chunks/_typeahead-Cl5cZ7Hz.js +1 -0
  48. data/dist/chunks/{globalProps-CqO4Tko1.js → globalProps-BwwZkfTI.js} +1 -1
  49. data/dist/chunks/{lib-czQnE40X.js → lib-Ch18RlJa.js} +2 -2
  50. data/dist/chunks/vendor.js +4 -4
  51. data/dist/playbook-rails-react-bindings.js +1 -1
  52. data/dist/playbook-rails.js +1 -1
  53. data/lib/playbook/version.rb +2 -2
  54. metadata +11 -6
  55. data/dist/chunks/_typeahead-B_Ac4z84.js +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6e2aff174ff5639403b1af402319a9bae7900aa80c6e1f11f23e330309d5d5a
4
- data.tar.gz: 524f88effff9cd94eb4624f5c13e828e764511e61ed784646537ff7e238a28cf
3
+ metadata.gz: bf26b3a5bc84db3c0723985d97147839159d420ec7ea3041a24ce948eb307702
4
+ data.tar.gz: 6aabd8a4a3b3d75c8fd5bdf423caefbfbee870867a44efd283cd5e5300a13ad0
5
5
  SHA512:
6
- metadata.gz: 76e16078f40f3142228a9eae24d47f272c84bfd8ccf231eba35ef3861490405524757078d83cb3d44fd0c73d1c40be6aa10c8ff513f6069af5187ce1c18d50b1
7
- data.tar.gz: ee5c545edfcfaee49b9fd319bff32a53c681c961a3292ef1bfc20ffab4d036621938c5f6c06115f7156bd63e993af9e02eb4ba9bddf4850fd69f91bc81b14b7e
6
+ metadata.gz: 183ca9c2fc15ecde3a04ccb900578161d4a6941c096fb7ccac1fd122f4bb9873058d510a56be5fa775504b0da702b3a65ea7f9c8f3f84b37ab5e9d0242f2a563
7
+ data.tar.gz: 5d44fe619ba3ab8ac29b60e45d0d365a13314c4928bf9de29128179cf6fc18ed747b1e91864c27bcb6223fd9d21d87a6a35f31345a202d98de5ff579da747ff0
@@ -1,5 +1,5 @@
1
1
  {
2
- "template": "<Date{{props}} />",
2
+ "template": "<FormattedDate{{props}} />",
3
3
  "propTargets": {},
4
4
  "defaults": {
5
5
  "alignment": "left",
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "groups": [
13
13
  {
14
- "name": "Content",
14
+ "name": "Date Config",
15
15
  "props": [
16
16
  "value",
17
17
  "showDayOfWeek",
@@ -32,21 +32,20 @@
32
32
  {
33
33
  "name": "Default",
34
34
  "props": {
35
- "value": "2026-04-09T15:30:00.000Z"
35
+ "value": "2026-04-09"
36
36
  }
37
37
  },
38
38
  {
39
- "name": "Large & centered",
39
+ "name": "centered",
40
40
  "props": {
41
- "value": "2026-04-09T15:30:00.000Z",
42
- "size": "lg",
41
+ "value": "2026-04-09",
43
42
  "alignment": "center"
44
43
  }
45
44
  },
46
45
  {
47
46
  "name": "Small with weekday",
48
47
  "props": {
49
- "value": "2026-06-18T10:00:00.000Z",
48
+ "value": "2026-06-18",
50
49
  "size": "sm",
51
50
  "showDayOfWeek": true
52
51
  }
@@ -54,20 +53,17 @@
54
53
  {
55
54
  "name": "With icon & year",
56
55
  "props": {
57
- "value": "2024-11-02T09:00:00.000Z",
56
+ "value": "2024-11-02",
58
57
  "showIcon": true,
59
58
  "showCurrentYear": true
60
59
  }
61
- },
62
- {
63
- "name": "Unstyled",
64
- "props": {
65
- "value": "2026-04-09T15:30:00.000Z",
66
- "unstyled": true,
67
- "showDayOfWeek": true
68
- }
69
60
  }
70
61
  ],
71
62
  "conditionals": {},
72
- "hints": {}
63
+ "hints": {
64
+ "default": {
65
+ "message": "Use as FormattedDate to avoid naming collisions with global Date object",
66
+ "type": "info"
67
+ }
68
+ }
73
69
  }
@@ -1,7 +1,8 @@
1
1
  {
2
+ "template": "<FormattedDate{{props}} />",
2
3
  "groups": [
3
4
  {
4
- "name": "Content",
5
+ "name": "Date Config",
5
6
  "props": ["value", "showDayOfWeek", "showCurrentYear", "showIcon"]
6
7
  },
7
8
  {
@@ -13,21 +14,20 @@
13
14
  {
14
15
  "name": "Default",
15
16
  "props": {
16
- "value": "2026-04-09T15:30:00.000Z"
17
+ "value": "2026-04-09"
17
18
  }
18
19
  },
19
20
  {
20
- "name": "Large & centered",
21
+ "name": "centered",
21
22
  "props": {
22
- "value": "2026-04-09T15:30:00.000Z",
23
- "size": "lg",
23
+ "value": "2026-04-09",
24
24
  "alignment": "center"
25
25
  }
26
26
  },
27
27
  {
28
28
  "name": "Small with weekday",
29
29
  "props": {
30
- "value": "2026-06-18T10:00:00.000Z",
30
+ "value": "2026-06-18",
31
31
  "size": "sm",
32
32
  "showDayOfWeek": true
33
33
  }
@@ -35,20 +35,17 @@
35
35
  {
36
36
  "name": "With icon & year",
37
37
  "props": {
38
- "value": "2024-11-02T09:00:00.000Z",
38
+ "value": "2024-11-02",
39
39
  "showIcon": true,
40
40
  "showCurrentYear": true
41
41
  }
42
- },
43
- {
44
- "name": "Unstyled",
45
- "props": {
46
- "value": "2026-04-09T15:30:00.000Z",
47
- "unstyled": true,
48
- "showDayOfWeek": true
49
- }
50
42
  }
51
43
  ],
52
44
  "conditionals": {},
53
- "hints": {}
45
+ "hints": {
46
+ "default": {
47
+ "message": "Use as FormattedDate to avoid naming collisions with global Date object",
48
+ "type": "info"
49
+ }
50
+ }
54
51
  }
@@ -12,6 +12,20 @@ import Caption from '../pb_caption/_caption'
12
12
  import Body from '../pb_body/_body'
13
13
  import colors from "../tokens/exports/_colors.module.scss"
14
14
 
15
+ function serializeDefaultDateForFilterReset(defaultDate: unknown): string | undefined {
16
+ if (defaultDate === '' || defaultDate == null) return undefined
17
+ if (Array.isArray(defaultDate)) {
18
+ const parts = defaultDate.map((d) => {
19
+ if (d == null || d === '') return ''
20
+ if (d instanceof Date) return d.toISOString()
21
+ return String(d)
22
+ }).filter(Boolean)
23
+ return parts.length ? parts.join(',') : undefined
24
+ }
25
+ if (defaultDate instanceof Date) return defaultDate.toISOString()
26
+ return String(defaultDate)
27
+ }
28
+
15
29
  type DatePickerProps = {
16
30
  allowInput?: boolean,
17
31
  aria?: { [key: string]: string },
@@ -113,7 +127,11 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
113
127
  } = props
114
128
 
115
129
  const ariaProps = buildAriaProps(aria)
116
- const dataProps = buildDataProps(data)
130
+ const filterResetDefaultSerialized = serializeDefaultDateForFilterReset(defaultDate)
131
+ const dataProps = buildDataProps({
132
+ ...data,
133
+ ...(filterResetDefaultSerialized ? { 'default-value': filterResetDefaultSerialized } : {}),
134
+ })
117
135
  const htmlProps = buildHtmlProps(htmlOptions)
118
136
  const inputAriaProps = buildAriaProps(inputAria)
119
137
  const inputDataProps = buildDataProps(inputData)
@@ -180,6 +198,7 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
180
198
  //@ts-ignore
181
199
  globalProps(filteredProps),
182
200
  error ? 'error' : null,
201
+ inLine && 'inline-date-picker',
183
202
  className
184
203
  )
185
204
 
@@ -262,7 +281,7 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
262
281
  }
263
282
  </div>
264
283
 
265
- {!hideIcon &&
284
+ {!hideIcon && !inLine &&
266
285
  <div
267
286
  className={iconWrapperClass()}
268
287
  id={`cal-icon-${pickerId}`}
@@ -274,7 +293,7 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
274
293
  </div>
275
294
  }
276
295
 
277
- {hideIcon && inLine ?
296
+ {inLine ?
278
297
  <div>
279
298
  <div
280
299
  className={`${iconWrapperClass()} date-picker-inline-icon-plus`}
@@ -1,8 +1,11 @@
1
- <%= pb_content_tag(:div,
2
- class: object.classname + object.error_class,
3
- 'data-pb-date-picker' => true,
4
- 'data-validation-message' => object.validation_message,
5
- ) do %>
1
+ <% date_picker_root_attrs = {
2
+ class: object.classname + object.error_class,
3
+ 'data-pb-date-picker' => true,
4
+ 'data-validation-message' => object.validation_message,
5
+ }
6
+ date_picker_root_attrs['data-default-value'] = object.serialized_default_date_for_dom if object.serialized_default_date_for_dom.present?
7
+ %>
8
+ <%= pb_content_tag(:div, date_picker_root_attrs) do %>
6
9
  <div class="input_wrapper">
7
10
  <% if !object.hide_label && object.label %>
8
11
  <label for="<%= object.picker_id %>">
@@ -39,7 +42,7 @@
39
42
  <input type="hidden" id="<%= "#{object.end_date_id}" %>" name="<%= "#{object.end_date_name}" %>">
40
43
  <% end %>
41
44
 
42
- <% if !object.hide_icon %>
45
+ <% if !object.hide_icon && !object.inline %>
43
46
  <div
44
47
  class="<%= object.icon_wrapper_class %>"
45
48
  id="cal-icon-<%= object.picker_id %>"
@@ -52,7 +55,7 @@
52
55
  <% end %>
53
56
 
54
57
  <!-- Inline -->
55
- <% if object.hide_icon && object.inline %>
58
+ <% if object.inline %>
56
59
  <!-- Plus Icon -->
57
60
  <div
58
61
  class="<%= object.icon_wrapper_class %> date-picker-inline-icon-plus"
@@ -92,7 +92,8 @@ module Playbook
92
92
 
93
93
  def classname
94
94
  default_margin_bottom = margin_bottom.present? ? "" : " mb_sm"
95
- generate_classname("pb_date_picker_kit") + default_margin_bottom
95
+ inline_class = inline ? " inline-date-picker" : ""
96
+ generate_classname("pb_date_picker_kit") + default_margin_bottom + inline_class
96
97
  end
97
98
 
98
99
  def date_picker_config
@@ -144,6 +145,18 @@ module Playbook
144
145
  def angle_down_path
145
146
  "app/pb_kits/playbook/utilities/icons/angle-down.svg"
146
147
  end
148
+
149
+ # Serialized business default for opt-in smart filter reset (Nitro / data-default-value).
150
+ def serialized_default_date_for_dom
151
+ case default_date
152
+ when nil, ""
153
+ nil
154
+ when Array
155
+ default_date.compact_blank.map(&:to_s).join(",")
156
+ else
157
+ default_date.to_s.presence
158
+ end
159
+ end
147
160
  end
148
161
  end
149
162
  end
@@ -40,6 +40,63 @@ describe('DatePicker Kit', () => {
40
40
  expect(kit).toHaveClass('pb_date_picker_kit mb_sm')
41
41
  })
42
42
 
43
+ test('exposes data-default-value on kit root when defaultDate is set', () => {
44
+ const testId = 'datepicker-def-attr'
45
+ render(
46
+ <DatePicker
47
+ data={{ testid: testId }}
48
+ defaultDate={DEFAULT_DATE}
49
+ pickerId="date-picker-def-attr"
50
+ />
51
+ )
52
+ const kit = screen.getByTestId(testId)
53
+ expect(kit).toHaveAttribute('data-default-value', DEFAULT_DATE.toISOString())
54
+ })
55
+
56
+ test('omits data-default-value when defaultDate is empty', () => {
57
+ const testId = 'datepicker-no-def-attr'
58
+ render(
59
+ <DatePicker
60
+ data={{ testid: testId }}
61
+ defaultDate=""
62
+ pickerId="date-picker-no-def-attr"
63
+ />
64
+ )
65
+ const kit = screen.getByTestId(testId)
66
+ expect(kit).not.toHaveAttribute('data-default-value')
67
+ })
68
+
69
+ test('inLine alone adds inline-date-picker class and inline control icons, not the calendar icon', () => {
70
+ const testId = 'datepicker-inline-only'
71
+ render(
72
+ <DatePicker
73
+ data={{ testid: testId }}
74
+ inLine
75
+ pickerId="date-picker-inline-only"
76
+ />
77
+ )
78
+
79
+ const kit = screen.getByTestId(testId)
80
+ expect(kit).toHaveClass('inline-date-picker')
81
+ expect(kit.querySelector('#cal-icon-date-picker-inline-only')).not.toBeInTheDocument()
82
+ expect(kit.querySelector('#date-picker-inline-only-icon-plus')).toBeInTheDocument()
83
+ expect(kit.querySelector('#date-picker-inline-only-angle-down')).toBeInTheDocument()
84
+ })
85
+
86
+ test('hideIcon without inLine does not render inline control icons', () => {
87
+ const testId = 'datepicker-hide-icon-only'
88
+ render(
89
+ <DatePicker
90
+ data={{ testid: testId }}
91
+ hideIcon
92
+ pickerId="date-picker-hide-icon-only"
93
+ />
94
+ )
95
+
96
+ const kit = screen.getByTestId(testId)
97
+ expect(kit.querySelector('#date-picker-hide-icon-only-icon-plus')).not.toBeInTheDocument()
98
+ })
99
+
43
100
  test('shows DatePicker date format m/d/Y', async () => {
44
101
  const testId = 'datepicker-date'
45
102
  render(
@@ -1,6 +1,4 @@
1
1
  <%= pb_rails("date_picker", props: {
2
- classname: "inline-date-picker",
3
- hide_icon: true,
4
2
  inline: true,
5
3
  picker_id: "date-picker-inline"
6
4
  }) %>
@@ -6,8 +6,6 @@ const DatePickerInline = (props) => {
6
6
  return (
7
7
  <div>
8
8
  <DatePicker
9
- className="inline-date-picker"
10
- hideIcon
11
9
  inLine
12
10
  pickerId="date-picker-inline"
13
11
  {...props}
@@ -1,5 +1,5 @@
1
1
  {
2
- "template": "<DatePicker{{props}} />",
2
+ "template": "<DatePicker {{props}} />",
3
3
  "propTargets": {},
4
4
  "defaults": {
5
5
  "allowInput": false,
@@ -19,11 +19,23 @@
19
19
  "controlsStartId": "",
20
20
  "controlsEndId": "",
21
21
  "syncStartWith": "",
22
- "syncEndWith": ""
22
+ "syncEndWith": "",
23
+ "customQuickPickDates": {
24
+ "override": false,
25
+ "dates": []
26
+ },
27
+ "pickerId": "playground-date-picker",
28
+ "disableDate": [],
29
+ "disableRange": [],
30
+ "disableWeekdays": [],
31
+ "yearRange": [
32
+ 1900,
33
+ 2100
34
+ ]
23
35
  },
24
36
  "groups": [
25
37
  {
26
- "name": "Content",
38
+ "name": "Date Picker Config",
27
39
  "props": [
28
40
  "label",
29
41
  "placeholder",
@@ -36,11 +48,18 @@
36
48
  {
37
49
  "name": "Appearance",
38
50
  "props": [
51
+ "dark",
39
52
  "hideIcon",
40
53
  "hideLabel",
41
- "inLine",
42
- "staticPosition",
43
- "selectionType"
54
+ "inLine"
55
+ ]
56
+ },
57
+ {
58
+ "name": "Quick pick",
59
+ "props": [
60
+ "selectionType",
61
+ "customQuickPickDates",
62
+ "thisRangesEndToday"
44
63
  ]
45
64
  },
46
65
  {
@@ -69,20 +88,12 @@
69
88
  {
70
89
  "name": "Advanced",
71
90
  "props": [
72
- "customQuickPickDates",
73
- "positionElement",
74
- "scrollContainer",
75
91
  "inputValue",
76
92
  "inputOnChange",
77
93
  "inputAria",
78
94
  "inputData",
79
95
  "type",
80
- "timeFormat",
81
- "thisRangesEndToday",
82
- "controlsStartId",
83
- "controlsEndId",
84
- "syncStartWith",
85
- "syncEndWith"
96
+ "timeFormat"
86
97
  ]
87
98
  }
88
99
  ],
@@ -93,20 +104,57 @@
93
104
  "name": "event_date",
94
105
  "pickerId": "playground-date-picker",
95
106
  "label": "Event date",
96
- "placeholder": "Select date",
97
- "defaultDate": "04/09/2026",
98
- "format": "m/d/Y"
107
+ "placeholder": "Select date"
99
108
  }
100
109
  },
101
110
  {
102
- "name": "Inline calendar",
111
+ "name": "Inline",
103
112
  "props": {
104
113
  "name": "inline_date",
105
114
  "pickerId": "playground-date-inline",
106
115
  "label": "Inline",
107
- "defaultDate": "04/09/2026",
108
- "inLine": true,
109
- "staticPosition": true
116
+ "inLine": true
117
+ }
118
+ },
119
+ {
120
+ "name": "Quick pick",
121
+ "props": {
122
+ "name": "quickpick_range",
123
+ "pickerId": "playground-quickpick",
124
+ "label": "Date range",
125
+ "placeholder": "mm/dd/yyyy to mm/dd/yyyy",
126
+ "allowInput": true,
127
+ "selectionType": "quickpick"
128
+ }
129
+ },
130
+ {
131
+ "name": "Quick pick with Custom Dates",
132
+ "props": {
133
+ "name": "quickpick_range",
134
+ "pickerId": "playground-quickpick",
135
+ "label": "Date range",
136
+ "placeholder": "mm/dd/yyyy to mm/dd/yyyy",
137
+ "allowInput": true,
138
+ "selectionType": "quickpick",
139
+ "customQuickPickDates": {
140
+ "override": false,
141
+ "dates": [
142
+ {
143
+ "label": "Last 15 months",
144
+ "value": {
145
+ "timePeriod": "months",
146
+ "amount": 15
147
+ }
148
+ },
149
+ {
150
+ "label": "First week of June 2022",
151
+ "value": [
152
+ "06/01/2022",
153
+ "06/07/2022"
154
+ ]
155
+ }
156
+ ]
157
+ }
110
158
  }
111
159
  },
112
160
  {
@@ -115,7 +163,6 @@
115
163
  "name": "starts_at",
116
164
  "pickerId": "playground-datetime",
117
165
  "label": "Starts at",
118
- "defaultDate": "04/09/2026",
119
166
  "enableTime": true,
120
167
  "format": "m/d/Y H:i"
121
168
  }
@@ -126,8 +173,7 @@
126
173
  "name": "typed_date",
127
174
  "pickerId": "playground-allow-input",
128
175
  "label": "Start date",
129
- "allowInput": true,
130
- "defaultDate": "04/09/2026"
176
+ "allowInput": true
131
177
  }
132
178
  },
133
179
  {
@@ -136,8 +182,25 @@
136
182
  "name": "month_only",
137
183
  "pickerId": "playground-month",
138
184
  "label": "Month",
139
- "selectionType": "month",
140
- "defaultDate": "04/01/2026"
185
+ "selectionType": "month"
186
+ }
187
+ },
188
+ {
189
+ "name": "Week picker",
190
+ "props": {
191
+ "name": "week_only",
192
+ "pickerId": "playground-week",
193
+ "label": "Week",
194
+ "selectionType": "week"
195
+ }
196
+ },
197
+ {
198
+ "name": "Dark",
199
+ "props": {
200
+ "name": "dark_picker",
201
+ "pickerId": "playground-dark",
202
+ "label": "Event date",
203
+ "dark": true
141
204
  }
142
205
  },
143
206
  {
@@ -146,7 +209,6 @@
146
209
  "name": "bounded",
147
210
  "pickerId": "playground-bounded",
148
211
  "label": "Within range",
149
- "defaultDate": "04/09/2026",
150
212
  "minDate": "01/01/2026",
151
213
  "maxDate": "12/31/2026"
152
214
  }
@@ -157,22 +219,54 @@
157
219
  "name": "invalid_date",
158
220
  "pickerId": "playground-error",
159
221
  "label": "Due date",
160
- "error": "Please choose a valid date",
161
- "defaultDate": ""
222
+ "error": "Please choose a valid date"
223
+ }
224
+ }
225
+ ],
226
+ "conditionals": {
227
+ "customQuickPickDates": {
228
+ "requires": {
229
+ "selectionType": "quickpick"
162
230
  }
163
231
  },
164
- {
165
- "name": "Minimal chrome",
166
- "props": {
167
- "name": "compact_date",
168
- "pickerId": "playground-minimal",
169
- "label": "",
170
- "hideLabel": true,
171
- "hideIcon": true,
172
- "defaultDate": "04/09/2026"
232
+ "thisRangesEndToday": {
233
+ "requires": {
234
+ "selectionType": "quickpick"
173
235
  }
174
236
  }
175
- ],
176
- "conditionals": {},
177
- "hints": {}
237
+ },
238
+ "hints": {
239
+ "pickerId": {
240
+ "message": "The pickerId is used to identify the date picker in the DOM. It is required and must be unique.",
241
+ "type": "info"
242
+ },
243
+ "defaultDate": {
244
+ "when": {
245
+ "defaultDate": "04/09/2026"
246
+ },
247
+ "message": "The default date is the date that will be selected when the date picker is first rendered. It is required and must be a valid date.",
248
+ "type": "info"
249
+ },
250
+ "quickPick": {
251
+ "when": {
252
+ "selectionType": "quickpick"
253
+ },
254
+ "message": "Quick pick shows preset ranges (relative periods or explicit date pairs). Use thisRangesEndToday when the plugin should treat ranges as ending today.",
255
+ "type": "info"
256
+ },
257
+ "customQuickPickDates": {
258
+ "presetName": "Quick pick with Custom Dates",
259
+ "message": "Custom quick pick dates are used to override the default quick pick dates. It must be an object with a dates array.",
260
+ "type": "info"
261
+ }
262
+ },
263
+ "hiddenProps": [
264
+ "staticPosition",
265
+ "scrollContainer",
266
+ "controlsStartId",
267
+ "controlsEndId",
268
+ "syncStartWith",
269
+ "syncEndWith",
270
+ "positionElement"
271
+ ]
178
272
  }