@daikin-oss/design-system-web-components 1.0.0 → 1.1.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 (95) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/base/dds-element.cjs +1 -1
  3. package/dist/cjs/components/avatar/daikin-avatar.cjs +160 -0
  4. package/dist/cjs/components/avatar/daikin-avatar.d.cts +64 -0
  5. package/dist/cjs/components/avatar/index.cjs +7 -0
  6. package/dist/cjs/components/avatar/index.d.cts +1 -0
  7. package/dist/cjs/components/checkbox/daikin-checkbox.cjs +1 -0
  8. package/dist/cjs/components/checkbox/daikin-checkbox.d.cts +4 -0
  9. package/dist/cjs/components/dropdown/daikin-dropdown.cjs +145 -69
  10. package/dist/cjs/components/dropdown/daikin-dropdown.d.cts +48 -9
  11. package/dist/cjs/components/dropdown-item/daikin-dropdown-item.cjs +97 -36
  12. package/dist/cjs/components/dropdown-item/daikin-dropdown-item.d.cts +6 -1
  13. package/dist/cjs/components/icon/icons.json.cjs +1 -1
  14. package/dist/cjs/components/icon/icons.json.d.cts +4 -0
  15. package/dist/cjs/components/index.cjs +10 -0
  16. package/dist/cjs/components/index.d.cts +2 -0
  17. package/dist/cjs/components/loading/daikin-loading.cjs +91 -0
  18. package/dist/cjs/components/loading/daikin-loading.d.cts +32 -0
  19. package/dist/cjs/components/loading/index.cjs +7 -0
  20. package/dist/cjs/components/loading/index.d.cts +1 -0
  21. package/dist/cjs/index.cjs +10 -0
  22. package/dist/cjs/tailwind.css.cjs +1 -1
  23. package/dist/cjs/utils/is-similar-to-click.cjs +4 -0
  24. package/dist/cjs/utils/is-similar-to-click.d.cts +1 -0
  25. package/dist/cjs-dev/base/dds-element.cjs +1 -1
  26. package/dist/cjs-dev/components/avatar/daikin-avatar.cjs +160 -0
  27. package/dist/cjs-dev/components/avatar/daikin-avatar.d.cts +64 -0
  28. package/dist/cjs-dev/components/avatar/index.cjs +7 -0
  29. package/dist/cjs-dev/components/avatar/index.d.cts +1 -0
  30. package/dist/cjs-dev/components/checkbox/daikin-checkbox.cjs +1 -0
  31. package/dist/cjs-dev/components/checkbox/daikin-checkbox.d.cts +4 -0
  32. package/dist/cjs-dev/components/dropdown/daikin-dropdown.cjs +145 -69
  33. package/dist/cjs-dev/components/dropdown/daikin-dropdown.d.cts +48 -9
  34. package/dist/cjs-dev/components/dropdown-item/daikin-dropdown-item.cjs +97 -36
  35. package/dist/cjs-dev/components/dropdown-item/daikin-dropdown-item.d.cts +6 -1
  36. package/dist/cjs-dev/components/icon/icons.json.cjs +1 -1
  37. package/dist/cjs-dev/components/icon/icons.json.d.cts +4 -0
  38. package/dist/cjs-dev/components/index.cjs +10 -0
  39. package/dist/cjs-dev/components/index.d.cts +2 -0
  40. package/dist/cjs-dev/components/loading/daikin-loading.cjs +91 -0
  41. package/dist/cjs-dev/components/loading/daikin-loading.d.cts +32 -0
  42. package/dist/cjs-dev/components/loading/index.cjs +7 -0
  43. package/dist/cjs-dev/components/loading/index.d.cts +1 -0
  44. package/dist/cjs-dev/index.cjs +10 -0
  45. package/dist/cjs-dev/tailwind.css.cjs +1 -1
  46. package/dist/cjs-dev/utils/is-similar-to-click.cjs +4 -0
  47. package/dist/cjs-dev/utils/is-similar-to-click.d.cts +1 -0
  48. package/dist/es/base/dds-element.js +1 -1
  49. package/dist/es/components/avatar/daikin-avatar.d.ts +64 -0
  50. package/dist/es/components/avatar/daikin-avatar.js +161 -0
  51. package/dist/es/components/avatar/index.d.ts +1 -0
  52. package/dist/es/components/avatar/index.js +4 -0
  53. package/dist/es/components/checkbox/daikin-checkbox.d.ts +4 -0
  54. package/dist/es/components/checkbox/daikin-checkbox.js +1 -0
  55. package/dist/es/components/dropdown/daikin-dropdown.d.ts +48 -9
  56. package/dist/es/components/dropdown/daikin-dropdown.js +145 -69
  57. package/dist/es/components/dropdown-item/daikin-dropdown-item.d.ts +6 -1
  58. package/dist/es/components/dropdown-item/daikin-dropdown-item.js +97 -36
  59. package/dist/es/components/icon/icons.json.d.ts +4 -0
  60. package/dist/es/components/icon/icons.json.js +1 -1
  61. package/dist/es/components/index.d.ts +2 -0
  62. package/dist/es/components/index.js +4 -0
  63. package/dist/es/components/loading/daikin-loading.d.ts +32 -0
  64. package/dist/es/components/loading/daikin-loading.js +92 -0
  65. package/dist/es/components/loading/index.d.ts +1 -0
  66. package/dist/es/components/loading/index.js +4 -0
  67. package/dist/es/index.js +4 -0
  68. package/dist/es/tailwind.css.js +1 -1
  69. package/dist/es/utils/is-similar-to-click.d.ts +1 -0
  70. package/dist/es/utils/is-similar-to-click.js +4 -0
  71. package/dist/es-dev/base/dds-element.js +1 -1
  72. package/dist/es-dev/components/avatar/daikin-avatar.d.ts +64 -0
  73. package/dist/es-dev/components/avatar/daikin-avatar.js +161 -0
  74. package/dist/es-dev/components/avatar/index.d.ts +1 -0
  75. package/dist/es-dev/components/avatar/index.js +4 -0
  76. package/dist/es-dev/components/checkbox/daikin-checkbox.d.ts +4 -0
  77. package/dist/es-dev/components/checkbox/daikin-checkbox.js +1 -0
  78. package/dist/es-dev/components/dropdown/daikin-dropdown.d.ts +48 -9
  79. package/dist/es-dev/components/dropdown/daikin-dropdown.js +145 -69
  80. package/dist/es-dev/components/dropdown-item/daikin-dropdown-item.d.ts +6 -1
  81. package/dist/es-dev/components/dropdown-item/daikin-dropdown-item.js +97 -36
  82. package/dist/es-dev/components/icon/icons.json.d.ts +4 -0
  83. package/dist/es-dev/components/icon/icons.json.js +1 -1
  84. package/dist/es-dev/components/index.d.ts +2 -0
  85. package/dist/es-dev/components/index.js +4 -0
  86. package/dist/es-dev/components/loading/daikin-loading.d.ts +32 -0
  87. package/dist/es-dev/components/loading/daikin-loading.js +92 -0
  88. package/dist/es-dev/components/loading/index.d.ts +1 -0
  89. package/dist/es-dev/components/loading/index.js +4 -0
  90. package/dist/es-dev/index.js +4 -0
  91. package/dist/es-dev/tailwind.css.js +1 -1
  92. package/dist/es-dev/utils/is-similar-to-click.d.ts +1 -0
  93. package/dist/es-dev/utils/is-similar-to-click.js +4 -0
  94. package/icons/profile.svg +4 -0
  95. package/package.json +1 -1
@@ -119,6 +119,7 @@ exports.DaikinCheckbox = class DaikinCheckbox extends ddsElement.DDSElement {
119
119
  render() {
120
120
  return lit.html`<label
121
121
  class="group flex gap-2 items-center size-full font-daikinSerif"
122
+ part="label"
122
123
  @click=${this._handleClick}
123
124
  >
124
125
  <span class="p-2">
@@ -7,6 +7,10 @@ import { DDSElement } from "../../base/index.cjs";
7
7
  *
8
8
  * @fires change - A cloned event of a [change event](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event) emitted from the inner `<input type="checkbox">` element.
9
9
  *
10
+ * @slot - A slot for the checkbox label content.
11
+ *
12
+ * @csspart label - Change the style of checkbox label.
13
+ *
10
14
  * @example
11
15
  *
12
16
  * ```js
@@ -5,12 +5,14 @@ const classVarianceAuthority = require("class-variance-authority");
5
5
  const lit = require("lit");
6
6
  const decorators_js = require("lit/decorators.js");
7
7
  const ifDefined_js = require("lit/directives/if-defined.js");
8
+ const ref_js = require("lit/directives/ref.js");
8
9
  const ddsElement = require("../../base/dds-element.cjs");
9
10
  const decorators = require("../../base/decorators.cjs");
10
11
  require("../../base/define.cjs");
11
12
  const clickOutside = require("../../controllers/click-outside.cjs");
12
13
  const floatingUiAutoUpdate = require("../../controllers/floating-ui-auto-update.cjs");
13
14
  const tailwind = require("../../tailwind.css.cjs");
15
+ const isSimpleKey = require("../../utils/is-simple-key.cjs");
14
16
  var __defProp = Object.defineProperty;
15
17
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
16
18
  var __decorateClass = (decorators2, target, key, kind) => {
@@ -24,36 +26,34 @@ var __decorateClass = (decorators2, target, key, kind) => {
24
26
  const cvaButton = classVarianceAuthority.cva(
25
27
  [
26
28
  "flex",
29
+ "justify-between",
27
30
  "items-center",
28
31
  "gap-2",
29
32
  "w-full",
30
33
  "h-full",
31
34
  "min-h-12",
32
35
  "bg-ddt-color-common-background-default",
33
- "p-3",
34
- "border",
35
- "border-[--color-base]",
36
+ "py-3",
37
+ "pl-4",
38
+ "pr-3",
36
39
  "rounded",
37
40
  "overflow-hidden",
38
41
  "font-daikinSerif",
39
42
  "text-left",
40
- "leading-5",
43
+ "leading-[130%]",
41
44
  "relative",
42
45
  "outline",
43
- "outline-0",
44
- "-outline-offset-2",
46
+ "outline-1",
47
+ "-outline-offset-1",
45
48
  "focus-visible:outline-2",
46
- "focus-visible:outline-[--color-focus]",
49
+ "focus-visible:-outline-offset-2",
50
+ "enabled:outline-[--color-base]",
47
51
  "disabled:text-ddt-color-common-disabled",
48
- "disabled:border-ddt-color-common-disabled",
52
+ "disabled:outline-ddt-color-common-disabled",
49
53
  "after:i-daikin-dropdown-chevron-down",
50
- "after:w-6",
51
- "after:h-6",
52
- "after:absolute",
53
- "after:m-auto",
54
- "after:top-0",
55
- "after:bottom-0",
56
- "after:right-3",
54
+ "after:size-6",
55
+ "after:flex-none",
56
+ "after:ml-auto",
57
57
  "enabled:after:text-ddt-color-common-text-primary",
58
58
  "disabled:after:text-ddt-color-common-disabled"
59
59
  ],
@@ -64,17 +64,19 @@ const cvaButton = classVarianceAuthority.cva(
64
64
  "enabled:hover:bg-ddt-color-common-surface-hover",
65
65
  "enabled:active:bg-ddt-color-common-surface-press"
66
66
  ],
67
- true: ["enabled:bg-ddt-color-common-surface-press"]
67
+ true: [
68
+ "enabled:bg-ddt-color-common-surface-press",
69
+ "after:scale-y-[-1]"
70
+ ]
68
71
  },
69
72
  error: {
70
73
  false: [
71
74
  "var-color-ddt-color-common-neutral-default/color-base",
72
- "var-color-ddt-color-common-border-focus/color-focus"
75
+ "hover:var-color-ddt-color-common-neutral-hover/color-base",
76
+ "active:var-color-ddt-color-common-neutral-press/color-base",
77
+ "focus-visible:var-color-ddt-color-common-border-focus/color-base"
73
78
  ],
74
- true: [
75
- "var-color-ddt-color-common-danger-default/color-base",
76
- "var-color-ddt-color-common-danger-default/color-focus"
77
- ]
79
+ true: ["var-color-ddt-color-common-danger-default/color-base"]
78
80
  },
79
81
  placeholder: {
80
82
  false: ["text-ddt-color-common-text-primary"],
@@ -108,37 +110,31 @@ exports.DaikinDropdown = class DaikinDropdown extends ddsElement.DDSElement {
108
110
  this.required = false;
109
111
  this.error = false;
110
112
  this.open = false;
113
+ this.multiple = false;
114
+ this.selectedOptions = [];
115
+ this.maxLabels = null;
111
116
  this._label = null;
112
- this._hasSelectedItem = false;
113
- this._selectedItemLabel = "";
117
+ this._initialUpdateCompleted = false;
114
118
  this._autoUpdateController = new floatingUiAutoUpdate.FloatingUIAutoUpdateController(this);
115
119
  this._clickOutsideController = new clickOutside.ClickOutsideController(
116
120
  this,
117
121
  this._onClickOutside
118
122
  );
119
123
  this._lastFocusedItem = null;
124
+ this._dropdownRef = ref_js.createRef();
120
125
  }
121
- _updateFormValue() {
122
- this._internals.setFormValue(this.value);
126
+ get _selectionLabels() {
127
+ const items = this._items;
128
+ return this.selectedOptions.map(
129
+ (value) => {
130
+ var _a;
131
+ return ((_a = items.find((item) => item.value === value)) == null ? void 0 : _a.textContent) ?? "";
132
+ }
133
+ );
123
134
  }
124
135
  _onClickOutside() {
125
136
  this.open = false;
126
137
  }
127
- _reflectItemsAndLabel() {
128
- const items = this._items;
129
- const selectedItem = items.find((item) => item.value === this.value);
130
- for (const item of items) {
131
- item.selected = item === selectedItem;
132
- }
133
- this._hasSelectedItem = !!selectedItem;
134
- this._selectedItemLabel = (selectedItem == null ? void 0 : selectedItem.textContent) ?? "";
135
- }
136
- _handleClick() {
137
- if (this.disabled) {
138
- return;
139
- }
140
- this.open = !this.open;
141
- }
142
138
  _searchItem(prefix) {
143
139
  const items = this._items.filter(
144
140
  (item) => {
@@ -160,13 +156,6 @@ exports.DaikinDropdown = class DaikinDropdown extends ddsElement.DDSElement {
160
156
  this.open = true;
161
157
  }
162
158
  }
163
- _handleKeyDownEscape() {
164
- if (this.open) {
165
- this.open = false;
166
- } else {
167
- this.value = null;
168
- }
169
- }
170
159
  _moveFocus(moveOffset) {
171
160
  if (!this.open) {
172
161
  this.open = true;
@@ -188,7 +177,56 @@ exports.DaikinDropdown = class DaikinDropdown extends ddsElement.DDSElement {
188
177
  break;
189
178
  }
190
179
  }
180
+ _updateFormValue() {
181
+ this._internals.setFormValue(JSON.stringify(this.value));
182
+ }
183
+ _updateItemsSelectable() {
184
+ for (const item of this._items) {
185
+ item.selectable = this.multiple;
186
+ }
187
+ }
188
+ _updateValueBySelectedOptions() {
189
+ this.value = this.selectedOptions.at(-1) ?? null;
190
+ }
191
+ _updateSelectedOptionsByValue() {
192
+ this.selectedOptions = this.value ? [this.value] : [];
193
+ }
194
+ /**
195
+ * Handling for when an option is selected.
196
+ * If multiple selection is enabled, the specified option is added to or removed from the array of selected options.
197
+ * If multiple selection is disabled, the current value is set to the specified option. The selection is not cleared.
198
+ *
199
+ * @param value The value of selected option.
200
+ */
201
+ _handleSelectOption(value) {
202
+ this.value = value;
203
+ this.selectedOptions = this.multiple ? this.selectedOptions.includes(value) ? this.selectedOptions.filter((option) => option != value) : [...this.selectedOptions, value] : [value];
204
+ }
205
+ /**
206
+ * Removes the last selected option.
207
+ *
208
+ * If multiple selection is enabled, remove the last selected option and the array will eventually become empty.
209
+ * If multiple selection is disabled, directly empty the selected options.
210
+ */
211
+ _removeLastSelection() {
212
+ if (this.multiple) {
213
+ this.selectedOptions = this.selectedOptions.slice(0, -1);
214
+ this.value = this.selectedOptions.at(-1) ?? null;
215
+ } else {
216
+ this.selectedOptions = [];
217
+ this.value = null;
218
+ }
219
+ }
220
+ _handleClick() {
221
+ if (this.disabled) {
222
+ return;
223
+ }
224
+ this.open = !this.open;
225
+ }
191
226
  _handleKeyDown(event) {
227
+ if (!isSimpleKey.isSimpleKeyEvent(event)) {
228
+ return;
229
+ }
192
230
  const printableCharacter = event.key.trim().length === 1 ? event.key : null;
193
231
  if (printableCharacter) {
194
232
  event.preventDefault();
@@ -212,19 +250,12 @@ exports.DaikinDropdown = class DaikinDropdown extends ddsElement.DDSElement {
212
250
  break;
213
251
  }
214
252
  }
215
- /**
216
- * Handle `select` event from `daikin-dropdown-item`.
217
- */
218
- _handleSelect(event) {
219
- const target = event.target;
220
- if (!target || !this._items.includes(target)) {
221
- return;
253
+ _handleKeyDownEscape() {
254
+ if (this.open) {
255
+ this.open = false;
256
+ } else {
257
+ this._removeLastSelection();
222
258
  }
223
- this._hasSelectedItem = true;
224
- this._selectedItemLabel = target.textContent ?? "";
225
- this.value = target.value;
226
- this.open = false;
227
- this.dispatchEvent(new Event("change"));
228
259
  }
229
260
  /**
230
261
  * Handle `focusin` event to remember last focused item.
@@ -246,14 +277,28 @@ exports.DaikinDropdown = class DaikinDropdown extends ddsElement.DDSElement {
246
277
  const item = items.find((item2) => item2 === this._lastFocusedItem) ?? items.find((item2) => item2.value === this.value) ?? items.at(0);
247
278
  item == null ? void 0 : item.focus();
248
279
  }
280
+ /**
281
+ * Handle `select` event from `daikin-dropdown-item`.
282
+ */
283
+ _handleSelect(event) {
284
+ this._handleSelectOption(event.target.value);
285
+ if (!this.multiple) {
286
+ this.open = false;
287
+ }
288
+ this.dispatchEvent(new Event("change"));
289
+ }
290
+ _handleSlotChange() {
291
+ this._updateItemsSelectable();
292
+ }
249
293
  render() {
250
294
  return lit.html`<div class="w-full relative" @keydown=${this._handleKeyDown}>
251
295
  <button
296
+ ${ref_js.ref(this._dropdownRef)}
252
297
  type="button"
253
298
  class=${cvaButton({
254
299
  open: this.open,
255
300
  error: this.error,
256
- placeholder: !this._hasSelectedItem
301
+ placeholder: !this.selectedOptions.length
257
302
  })}
258
303
  ?disabled=${this.disabled}
259
304
  role="combobox"
@@ -266,18 +311,19 @@ exports.DaikinDropdown = class DaikinDropdown extends ddsElement.DDSElement {
266
311
  @click=${this._handleClick}
267
312
  ${this._autoUpdateController.refReference()}
268
313
  >
269
- ${this._hasSelectedItem ? this._selectedItemLabel : this.placeholder}
314
+ ${this.selectedOptions.length ? this.multiple && this.selectedOptions.length > (this.maxLabels ?? 0) ? `${this.selectedOptions.length} items selected` : this._selectionLabels.join(", ") : this.placeholder}
270
315
  </button>
271
316
  <div
272
317
  id="dropdown-items"
273
318
  popover
274
- class="floating-unready:hidden absolute left-[--floating-x,0] top-[--floating-y,0] min-w-[--floating-width] max-h-[12.5rem] overflow-y-auto opacity-1 transition-[opacity] rounded shadow-dropdown"
319
+ class="floating-unready:hidden absolute left-[--floating-x,0] top-[--floating-y,0] min-w-[--floating-width] max-h-[12.5rem] border border-ddt-color-divider overflow-y-auto opacity-1 transition-[opacity] rounded"
275
320
  aria-label=${ifDefined_js.ifDefined(this._label ?? void 0)}
276
321
  role="listbox"
277
322
  @floating-ready=${this._handleFloatingReady}
278
323
  ${this._autoUpdateController.refFloating()}
279
324
  >
280
325
  <slot
326
+ @slotchange=${this._handleSlotChange}
281
327
  @select=${this._handleSelect}
282
328
  @focusin=${this._handleFocusIn}
283
329
  ></slot>
@@ -300,11 +346,29 @@ exports.DaikinDropdown = class DaikinDropdown extends ddsElement.DDSElement {
300
346
  var _a;
301
347
  (_a = this._button) == null ? void 0 : _a.focus(options);
302
348
  }
349
+ willUpdate(changedProperties) {
350
+ if (!this._initialUpdateCompleted) {
351
+ if (!!this.selectedOptions.length && (!this.value || !this.selectedOptions.includes(this.value))) {
352
+ this._updateValueBySelectedOptions();
353
+ } else if (!!this.value && !this.selectedOptions.length) {
354
+ this.selectedOptions = [this.value];
355
+ }
356
+ this._initialUpdateCompleted = true;
357
+ return;
358
+ }
359
+ const hasChangedValue = changedProperties.has("value");
360
+ const hasChangedSelectedOptions = changedProperties.has("selectedOptions");
361
+ if (hasChangedValue && !hasChangedSelectedOptions) {
362
+ this._updateSelectedOptionsByValue();
363
+ }
364
+ if (!hasChangedValue && hasChangedSelectedOptions) {
365
+ this._updateValueBySelectedOptions();
366
+ }
367
+ }
303
368
  updated(changedProperties) {
304
369
  var _a;
305
370
  if (changedProperties.has("value")) {
306
371
  this._updateFormValue();
307
- this._reflectItemsAndLabel();
308
372
  }
309
373
  if (changedProperties.has("open") || changedProperties.has("disabled")) {
310
374
  (_a = this._autoUpdateController.floatingElement) == null ? void 0 : _a.togglePopover(
@@ -314,6 +378,15 @@ exports.DaikinDropdown = class DaikinDropdown extends ddsElement.DDSElement {
314
378
  this.focus();
315
379
  }
316
380
  }
381
+ if (changedProperties.has("selectedOptions")) {
382
+ const items = this._items;
383
+ for (const item of items) {
384
+ item.selected = this.selectedOptions.includes(item.value);
385
+ }
386
+ }
387
+ if (changedProperties.has("multiple")) {
388
+ this._updateItemsSelectable();
389
+ }
317
390
  }
318
391
  /**
319
392
  * This method is used by `daikin-input-group` to reflect it's attributes to this component.
@@ -358,6 +431,15 @@ __decorateClass([
358
431
  __decorateClass([
359
432
  decorators_js.property({ type: Boolean, reflect: true })
360
433
  ], exports.DaikinDropdown.prototype, "open", 2);
434
+ __decorateClass([
435
+ decorators_js.property({ type: Boolean, reflect: true })
436
+ ], exports.DaikinDropdown.prototype, "multiple", 2);
437
+ __decorateClass([
438
+ decorators_js.property({ type: Array, attribute: false })
439
+ ], exports.DaikinDropdown.prototype, "selectedOptions", 2);
440
+ __decorateClass([
441
+ decorators_js.property({ type: Number, reflect: true, attribute: "max-labels" })
442
+ ], exports.DaikinDropdown.prototype, "maxLabels", 2);
361
443
  __decorateClass([
362
444
  decorators_js.queryAssignedElements({ selector: "daikin-dropdown-item" })
363
445
  ], exports.DaikinDropdown.prototype, "_items", 2);
@@ -367,12 +449,6 @@ __decorateClass([
367
449
  __decorateClass([
368
450
  decorators_js.state()
369
451
  ], exports.DaikinDropdown.prototype, "_label", 2);
370
- __decorateClass([
371
- decorators_js.state()
372
- ], exports.DaikinDropdown.prototype, "_hasSelectedItem", 2);
373
- __decorateClass([
374
- decorators_js.state()
375
- ], exports.DaikinDropdown.prototype, "_selectedItemLabel", 2);
376
452
  exports.DaikinDropdown = __decorateClass([
377
453
  decorators.ddsElement("daikin-dropdown")
378
454
  ], exports.DaikinDropdown);
@@ -34,6 +34,9 @@ export declare class DaikinDropdown extends DDSElement {
34
34
  /**
35
35
  * Form value of the dropdown.
36
36
  * `null` if not selected.
37
+ *
38
+ * If `multiple` is `true`, please use `selectedOptions` instead.
39
+ * If multiple selection is enabled, the value set to this property will be one of the selected items, and it is not possible to predict which value will be set.
37
40
  */
38
41
  value: string | null;
39
42
  /**
@@ -56,6 +59,22 @@ export declare class DaikinDropdown extends DDSElement {
56
59
  * Whether the dropdown menu is opened.
57
60
  */
58
61
  open: boolean;
62
+ /**
63
+ * Whether the dropdown menu is supports multiple selections.
64
+ */
65
+ multiple: boolean;
66
+ /**
67
+ * An array of `value` s for the currently selected option.
68
+ *
69
+ * This can be used regardless of the value of `multiple`, but if `multiple` is `true`, always use this instead of `value`.
70
+ * If `multiple` is `false`, the second and subsequent items will be deleted.
71
+ */
72
+ selectedOptions: string[];
73
+ /**
74
+ * Specifies the maximum number of items to display without omission in the label when `multiple` is `true`.
75
+ * Specify `null` to display all selected items without omission.
76
+ */
77
+ maxLabels: number | null;
59
78
  private readonly _items;
60
79
  private _button;
61
80
  /**
@@ -63,8 +82,8 @@ export declare class DaikinDropdown extends DDSElement {
63
82
  * Set automatically by `reflectInputGroup` method.
64
83
  */
65
84
  private _label;
66
- private _hasSelectedItem;
67
- private _selectedItemLabel;
85
+ private get _selectionLabels();
86
+ private _initialUpdateCompleted;
68
87
  private _autoUpdateController;
69
88
  private _clickOutsideController;
70
89
  /**
@@ -72,18 +91,32 @@ export declare class DaikinDropdown extends DDSElement {
72
91
  * The next time the dropdown opens, the focus will be moved to this element.
73
92
  */
74
93
  private _lastFocusedItem;
75
- private _updateFormValue;
94
+ private _dropdownRef;
76
95
  private _onClickOutside;
77
- private _reflectItemsAndLabel;
78
- private _handleClick;
79
96
  private _searchItem;
80
- private _handleKeyDownEscape;
81
97
  private _moveFocus;
82
- private _handleKeyDown;
98
+ private _updateFormValue;
99
+ private _updateItemsSelectable;
100
+ private _updateValueBySelectedOptions;
101
+ private _updateSelectedOptionsByValue;
83
102
  /**
84
- * Handle `select` event from `daikin-dropdown-item`.
103
+ * Handling for when an option is selected.
104
+ * If multiple selection is enabled, the specified option is added to or removed from the array of selected options.
105
+ * If multiple selection is disabled, the current value is set to the specified option. The selection is not cleared.
106
+ *
107
+ * @param value The value of selected option.
85
108
  */
86
- private _handleSelect;
109
+ private _handleSelectOption;
110
+ /**
111
+ * Removes the last selected option.
112
+ *
113
+ * If multiple selection is enabled, remove the last selected option and the array will eventually become empty.
114
+ * If multiple selection is disabled, directly empty the selected options.
115
+ */
116
+ private _removeLastSelection;
117
+ private _handleClick;
118
+ private _handleKeyDown;
119
+ private _handleKeyDownEscape;
87
120
  /**
88
121
  * Handle `focusin` event to remember last focused item.
89
122
  */
@@ -94,12 +127,18 @@ export declare class DaikinDropdown extends DDSElement {
94
127
  * Since the focus cannot be moved until the element is displayed on the screen, the focus is moved to the item after receiving the completion of the Floating UI position calculation here.
95
128
  */
96
129
  private _handleFloatingReady;
130
+ /**
131
+ * Handle `select` event from `daikin-dropdown-item`.
132
+ */
133
+ private _handleSelect;
134
+ private _handleSlotChange;
97
135
  render(): import('lit-html').TemplateResult<1>;
98
136
  /**
99
137
  * Focuses on the inner button.
100
138
  * @param options focus options
101
139
  */
102
140
  focus(options?: FocusOptions): void;
141
+ protected willUpdate(changedProperties: PropertyValues): void;
103
142
  protected updated(changedProperties: PropertyValues<this>): void;
104
143
  /**
105
144
  * This method is used by `daikin-input-group` to reflect it's attributes to this component.
@@ -7,6 +7,8 @@ const ddsElement = require("../../base/dds-element.cjs");
7
7
  const decorators = require("../../base/decorators.cjs");
8
8
  require("../../base/define.cjs");
9
9
  const tailwind = require("../../tailwind.css.cjs");
10
+ const isSimilarToClick = require("../../utils/is-similar-to-click.cjs");
11
+ require("../checkbox/daikin-checkbox.cjs");
10
12
  var __defProp = Object.defineProperty;
11
13
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
12
14
  var __decorateClass = (decorators2, target, key, kind) => {
@@ -21,35 +23,49 @@ const cvaOption = classVarianceAuthority.cva(
21
23
  [
22
24
  "flex",
23
25
  "items-center",
24
- "justify-between",
25
- "w-full",
26
+ "gap-1",
27
+ "size-full",
26
28
  "min-h-12",
27
- "text-ddt-color-common-text-primary",
28
- "bg-ddt-color-common-background-default",
29
- "p-3",
30
29
  "font-daikinSerif",
31
- "leading-5",
30
+ "leading-[130%]",
32
31
  "text-left",
32
+ "relative",
33
33
  "focus-visible:outline",
34
34
  "focus-visible:outline-2",
35
35
  "focus-visible:-outline-offset-2",
36
- "focus-visible:outline-ddt-color-common-border-focus",
37
- "disabled:text-ddt-color-common-disabled"
36
+ "focus-visible:outline-ddt-color-common-border-focus"
38
37
  ],
39
38
  {
40
39
  variants: {
41
40
  selected: {
42
41
  false: [
43
- "enabled:hover:bg-ddt-color-common-surface-hover",
44
- "enabled:active:bg-ddt-color-common-surface-press"
42
+ "var-color-ddt-color-common-background-default/color-primary",
43
+ "hover:var-color-ddt-color-common-surface-hover/color-primary",
44
+ "active:var-color-ddt-color-common-surface-press/color-primary"
45
45
  ],
46
46
  true: [
47
- "enabled:bg-ddt-color-common-surface-selected-default",
48
- "enabled:hover:bg-ddt-color-common-surface-selected-hover",
49
- "enabled:active:bg-ddt-color-common-surface-selected-press",
47
+ "var-color-ddt-color-common-surface-selected-default/color-primary",
48
+ "hover:var-color-ddt-color-common-surface-selected-hover/color-primary",
49
+ "active:var-color-ddt-color-common-surface-selected-press/color-primary",
50
50
  "after:i-daikin-dropdown-check",
51
- "after:size-6"
51
+ "after:size-6",
52
+ "after:flex-none"
52
53
  ]
54
+ },
55
+ disabled: {
56
+ false: [
57
+ "text-ddt-color-common-text-primary",
58
+ "bg-[--color-primary]",
59
+ "cursor-pointer"
60
+ ],
61
+ true: [
62
+ "text-ddt-color-common-disabled",
63
+ "bg-ddt-color-common-background-default"
64
+ ]
65
+ },
66
+ multiple: {
67
+ false: ["justify-between", "p-3"],
68
+ true: ["after:hidden"]
53
69
  }
54
70
  }
55
71
  }
@@ -60,30 +76,72 @@ exports.DaikinDropdownItem = class DaikinDropdownItem extends ddsElement.DDSElem
60
76
  this.value = "";
61
77
  this.disabled = false;
62
78
  this.selected = false;
79
+ this.selectable = false;
63
80
  }
64
- _handleClick() {
65
- if (this.disabled) {
81
+ _handleClick(event) {
82
+ if (this.disabled || event.target.tagName === "DAIKIN-CHECKBOX") {
66
83
  return;
67
84
  }
68
- this.dispatchEvent(
69
- new Event("select", {
70
- bubbles: true
71
- })
72
- );
85
+ this._emitSelect();
86
+ event.preventDefault();
87
+ }
88
+ _handleChange(event) {
89
+ this._emitSelect();
90
+ event.preventDefault();
91
+ }
92
+ _handleKeydown(event) {
93
+ if (!isSimilarToClick.isSimilarToClick(event.key) || this.disabled) {
94
+ return;
95
+ }
96
+ this._emitSelect();
97
+ event.preventDefault();
98
+ }
99
+ _handleMousedown(event) {
100
+ if (event.detail === 2) {
101
+ event.preventDefault();
102
+ }
103
+ }
104
+ _emitSelect() {
105
+ this.dispatchEvent(new Event("select", { bubbles: true }));
73
106
  }
74
107
  render() {
75
- return lit.html`<button
76
- type="button"
77
- class=${cvaOption({ selected: this.selected })}
78
- data-value=${this.value}
79
- role="option"
80
- aria-selected=${this.selected}
81
- tabindex="-1"
82
- ?disabled=${this.disabled}
83
- @click=${this._handleClick}
84
- >
85
- <slot></slot>
86
- </button>`;
108
+ const optionClassName = cvaOption({
109
+ selected: this.selected,
110
+ disabled: this.disabled,
111
+ multiple: this.selectable
112
+ });
113
+ return this.selectable ? lit.html`<span
114
+ class=${optionClassName}
115
+ data-value=${this.value}
116
+ role="option"
117
+ aria-selected=${this.selected}
118
+ tabindex="-1"
119
+ aria-disabled=${this.disabled}
120
+ @click=${this._handleClick}
121
+ @keydown=${this._handleKeydown}
122
+ @mousedown=${this._handleMousedown}
123
+ >
124
+ <daikin-checkbox
125
+ class="size-full part-[label]:p-2 part-[label]:cursor-pointer"
126
+ check-state=${this.selected ? "checked" : "unchecked"}
127
+ tabindex="-1"
128
+ ?disabled=${this.disabled}
129
+ @change=${this._handleChange}
130
+ >
131
+ <slot></slot>
132
+ </daikin-checkbox>
133
+ </span>` : lit.html`<button
134
+ type="button"
135
+ class=${optionClassName}
136
+ data-value=${this.value}
137
+ role="option"
138
+ aria-selected=${this.selected}
139
+ tabindex="-1"
140
+ ?disabled=${this.disabled}
141
+ @click=${this._handleClick}
142
+ >
143
+ <slot></slot>
144
+ </button>`;
87
145
  }
88
146
  /**
89
147
  * Focuses on the inner button.
@@ -91,7 +149,7 @@ exports.DaikinDropdownItem = class DaikinDropdownItem extends ddsElement.DDSElem
91
149
  */
92
150
  focus(options) {
93
151
  var _a;
94
- (_a = this._button) == null ? void 0 : _a.focus(options);
152
+ (_a = this._focusableElement) == null ? void 0 : _a.focus(options);
95
153
  }
96
154
  };
97
155
  exports.DaikinDropdownItem.styles = lit.css`
@@ -112,8 +170,11 @@ __decorateClass([
112
170
  decorators_js.property({ type: Boolean, reflect: true })
113
171
  ], exports.DaikinDropdownItem.prototype, "selected", 2);
114
172
  __decorateClass([
115
- decorators_js.query("button")
116
- ], exports.DaikinDropdownItem.prototype, "_button", 2);
173
+ decorators_js.property({ type: Boolean, reflect: true })
174
+ ], exports.DaikinDropdownItem.prototype, "selectable", 2);
175
+ __decorateClass([
176
+ decorators_js.query("button,span[role=option]")
177
+ ], exports.DaikinDropdownItem.prototype, "_focusableElement", 2);
117
178
  exports.DaikinDropdownItem = __decorateClass([
118
179
  decorators.ddsElement("daikin-dropdown-item")
119
180
  ], exports.DaikinDropdownItem);
@@ -34,8 +34,13 @@ export declare class DaikinDropdownItem extends DDSElement {
34
34
  * Set automatically by `daikin-dropdown` component.
35
35
  */
36
36
  selected: boolean;
37
- private _button;
37
+ selectable: boolean;
38
+ private _focusableElement;
38
39
  private _handleClick;
40
+ private _handleChange;
41
+ private _handleKeydown;
42
+ private _handleMousedown;
43
+ private _emitSelect;
39
44
  render(): import('lit-html').TemplateResult<1>;
40
45
  /**
41
46
  * Focuses on the inner button.