colibri-ui 0.8.76 → 0.8.78

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 (128) hide show
  1. package/Autocomplete/Autocomplete.d.ts +6 -0
  2. package/Autocomplete/Autocomplete.js +298 -0
  3. package/Autocomplete/Autocomplete.module.css +147 -0
  4. package/Autocomplete/index.d.ts +2 -0
  5. package/Autocomplete/index.js +7 -0
  6. package/Autocomplete/index.props.d.ts +39 -0
  7. package/Autocomplete/package.json +9 -0
  8. package/Button/tokens.d.ts +78 -0
  9. package/Button/tokens.js +84 -0
  10. package/Calendar/Calendar.js +3 -1
  11. package/Input/index.d.ts +1 -1
  12. package/Input/index.js +20 -14
  13. package/Input/index.props.d.ts +4 -1
  14. package/List/List.d.ts +5 -0
  15. package/List/List.js +161 -0
  16. package/List/List.module.css +185 -0
  17. package/List/index.d.ts +2 -0
  18. package/List/index.js +9 -0
  19. package/List/index.props.d.ts +43 -0
  20. package/List/package.json +9 -0
  21. package/Modal/Modal.module.css +14 -7
  22. package/Modal/components/Body/Body.module.css +12 -0
  23. package/Modal/components/Body/index.d.ts +3 -0
  24. package/Modal/components/Body/index.js +27 -0
  25. package/Modal/components/Body/index.props.d.ts +1 -0
  26. package/Modal/components/Close/index.js +5 -2
  27. package/Modal/components/Close/index.props.d.ts +1 -0
  28. package/Modal/components/Footer/Footer.module.css +10 -0
  29. package/Modal/components/Footer/index.d.ts +3 -0
  30. package/Modal/components/Footer/index.js +23 -0
  31. package/Modal/components/Footer/index.props.d.ts +1 -0
  32. package/Modal/components/Header/Header.module.css +32 -0
  33. package/Modal/components/Header/index.d.ts +3 -0
  34. package/Modal/components/Header/index.js +37 -0
  35. package/Modal/components/Header/index.props.d.ts +1 -0
  36. package/Modal/components/Title/index.js +20 -7
  37. package/Modal/components/Title/index.props.d.ts +1 -2
  38. package/Modal/context.d.ts +9 -0
  39. package/Modal/context.js +15 -0
  40. package/Modal/index.d.ts +12 -2
  41. package/Modal/index.js +103 -31
  42. package/Modal/index.props.d.ts +25 -0
  43. package/Modal/useModalStack.d.ts +2 -0
  44. package/Modal/useModalStack.js +20 -0
  45. package/README.md +59 -0
  46. package/Theme/breakpoints.d.ts +20 -16
  47. package/Theme/breakpoints.js +21 -32
  48. package/Theme/colors/index.d.ts +4 -0
  49. package/Theme/colors/theme_buenos_aires.d.ts +4 -0
  50. package/Theme/colors/theme_buenos_aires.js +2 -0
  51. package/Theme/colors/theme_jaipur.d.ts +4 -0
  52. package/Theme/colors/theme_jaipur.js +2 -0
  53. package/Theme/index.d.ts +300 -152
  54. package/Theme/index.js +6 -2
  55. package/Theme/themes/buenos_aires.d.ts +73 -76
  56. package/Theme/themes/buenos_aires.js +73 -76
  57. package/Theme/themes/jaipur.d.ts +73 -76
  58. package/Theme/themes/jaipur.js +73 -76
  59. package/esm/Autocomplete/Autocomplete.d.ts +6 -0
  60. package/esm/Autocomplete/Autocomplete.js +288 -0
  61. package/esm/Autocomplete/Autocomplete.module.css +147 -0
  62. package/esm/Autocomplete/index.d.ts +2 -0
  63. package/esm/Autocomplete/index.props.d.ts +39 -0
  64. package/esm/Button/tokens.d.ts +78 -0
  65. package/esm/Button/tokens.js +82 -0
  66. package/esm/Calendar/Calendar.js +3 -1
  67. package/esm/Input/index.d.ts +1 -1
  68. package/esm/Input/index.js +16 -10
  69. package/esm/Input/index.props.d.ts +4 -1
  70. package/esm/List/List.d.ts +5 -0
  71. package/esm/List/List.js +150 -0
  72. package/esm/List/List.module.css +185 -0
  73. package/esm/List/index.d.ts +2 -0
  74. package/esm/List/index.props.d.ts +43 -0
  75. package/esm/Modal/Modal.module.css +14 -7
  76. package/esm/Modal/components/Body/Body.module.css +12 -0
  77. package/esm/Modal/components/Body/index.d.ts +3 -0
  78. package/esm/Modal/components/Body/index.js +18 -0
  79. package/esm/Modal/components/Body/index.props.d.ts +1 -0
  80. package/esm/Modal/components/Close/index.js +4 -2
  81. package/esm/Modal/components/Close/index.props.d.ts +1 -0
  82. package/esm/Modal/components/Footer/Footer.module.css +10 -0
  83. package/esm/Modal/components/Footer/index.d.ts +3 -0
  84. package/esm/Modal/components/Footer/index.js +15 -0
  85. package/esm/Modal/components/Footer/index.props.d.ts +1 -0
  86. package/esm/Modal/components/Header/Header.module.css +32 -0
  87. package/esm/Modal/components/Header/index.d.ts +3 -0
  88. package/esm/Modal/components/Header/index.js +28 -0
  89. package/esm/Modal/components/Header/index.props.d.ts +1 -0
  90. package/esm/Modal/components/Title/index.js +20 -8
  91. package/esm/Modal/components/Title/index.props.d.ts +1 -2
  92. package/esm/Modal/context.d.ts +9 -0
  93. package/esm/Modal/context.js +12 -0
  94. package/esm/Modal/index.d.ts +12 -2
  95. package/esm/Modal/index.js +92 -25
  96. package/esm/Modal/index.props.d.ts +25 -0
  97. package/esm/Modal/useModalStack.d.ts +2 -0
  98. package/esm/Modal/useModalStack.js +18 -0
  99. package/esm/Theme/breakpoints.d.ts +20 -16
  100. package/esm/Theme/breakpoints.js +20 -26
  101. package/esm/Theme/colors/index.d.ts +4 -0
  102. package/esm/Theme/colors/theme_buenos_aires.d.ts +4 -0
  103. package/esm/Theme/colors/theme_buenos_aires.js +2 -0
  104. package/esm/Theme/colors/theme_jaipur.d.ts +4 -0
  105. package/esm/Theme/colors/theme_jaipur.js +2 -0
  106. package/esm/Theme/index.d.ts +300 -152
  107. package/esm/Theme/index.js +3 -2
  108. package/esm/Theme/themes/buenos_aires.d.ts +73 -76
  109. package/esm/Theme/themes/buenos_aires.js +73 -76
  110. package/esm/Theme/themes/jaipur.d.ts +73 -76
  111. package/esm/Theme/themes/jaipur.js +73 -76
  112. package/esm/hooks/useMediaSizes/index.d.ts +2 -2
  113. package/esm/hooks/useMediaSizes/index.js +2 -2
  114. package/esm/hooks/useTrapFocus/index.d.ts +1 -1
  115. package/esm/hooks/useTrapFocus/index.js +3 -2
  116. package/esm/index.d.ts +8 -3
  117. package/esm/index.js +7 -0
  118. package/esm/theme_ba_variables.css +149 -76
  119. package/esm/theme_jaipur_variables.css +149 -76
  120. package/hooks/useMediaSizes/index.d.ts +2 -2
  121. package/hooks/useMediaSizes/index.js +1 -1
  122. package/hooks/useTrapFocus/index.d.ts +1 -1
  123. package/hooks/useTrapFocus/index.js +3 -2
  124. package/index.d.ts +8 -3
  125. package/index.js +54 -35
  126. package/package.json +1 -1
  127. package/theme_ba_variables.css +149 -76
  128. package/theme_jaipur_variables.css +149 -76
@@ -114,14 +114,17 @@ var theme_jaipur = {
114
114
  "color-action-secondary-hover": theme_jaipur$1.default.PINK_JP_300,
115
115
  "color-action-secondary-pressed": theme_jaipur$1.default.PINK_JP_500,
116
116
  "color-action-secondary-text": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
117
+ "color-action-clear-text-hover": theme_jaipur$1.default.PINK_JP_800,
117
118
  "color-action-disabled": theme_jaipur$1.default.NEUTRAL_JP_100,
118
119
  "color-action-disabled-text": theme_jaipur$1.default.NEUTRAL_JP_400,
119
120
  "color-focus-ring": theme_jaipur$1.default.BRAND_JP_PINK,
120
121
  "color-status-success": theme_jaipur$1.default.STATUS_JP_SUCCESS,
121
122
  "color-status-success-bg": theme_jaipur$1.default.STATUS_JP_SUCCESS_BG,
123
+ "color-status-success-bg-hover": theme_jaipur$1.default.STATUS_JP_SUCCESS_BG_HOVER,
122
124
  "color-status-warning": theme_jaipur$1.default.STATUS_JP_WARNING,
123
125
  "color-status-warning-bg": theme_jaipur$1.default.STATUS_JP_WARNING_BG,
124
126
  "color-status-error": theme_jaipur$1.default.STATUS_JP_ERROR,
127
+ "color-status-error-hover": theme_jaipur$1.default.STATUS_JP_ERROR_HOVER,
125
128
  "color-status-error-accent": theme_jaipur$1.default.STATUS_JP_ERROR_ACCENT,
126
129
  "color-status-error-bg": theme_jaipur$1.default.STATUS_JP_ERROR_BG,
127
130
  "color-status-info": theme_jaipur$1.default.STATUS_JP_INFO,
@@ -229,6 +232,36 @@ var theme_jaipur = {
229
232
  "component-input-padding-block": "0.3125rem",
230
233
  "component-input-padding-inline": "0.625rem",
231
234
  "component-input-content-margin-block": "0.4375rem",
235
+ "component-autocomplete-inline-size": "calc(var(--space-32) * 2 + var(--space-16))",
236
+ "component-autocomplete-border-success": theme_jaipur$1.default.STATUS_JP_SUCCESS,
237
+ "component-autocomplete-end-icon-gap": "var(--space-1)",
238
+ "component-autocomplete-icon-size": "var(--component-input-icon-size)",
239
+ "component-autocomplete-clear-size": "var(--space-6)",
240
+ "component-autocomplete-clear-radius": "var(--radius-xs)",
241
+ "component-autocomplete-clear-icon": theme_jaipur$1.default.NEUTRAL_JP_600,
242
+ "component-autocomplete-clear-bg-hover": theme_jaipur$1.default.NEUTRAL_JP_100,
243
+ "component-autocomplete-chevron": theme_jaipur$1.default.NEUTRAL_JP_600,
244
+ "component-autocomplete-popup-bg": theme_jaipur$1.default.NEUTRAL_JP_0,
245
+ "component-autocomplete-popup-border": theme_jaipur$1.default.NEUTRAL_JP_200,
246
+ "component-autocomplete-popup-radius": "var(--radius-md)",
247
+ "component-autocomplete-popup-shadow": "var(--shadow-raised)",
248
+ "component-autocomplete-popup-offset": "var(--space-2)",
249
+ "component-autocomplete-popup-z-index": "1001",
250
+ "component-autocomplete-list-max-height": "13.75rem",
251
+ "component-autocomplete-list-padding": "var(--space-1)",
252
+ "component-autocomplete-option-min-height": "var(--component-input-height-l)",
253
+ "component-autocomplete-option-padding-block": "var(--component-input-padding-block)",
254
+ "component-autocomplete-option-padding-inline": "var(--component-input-padding-inline)",
255
+ "component-autocomplete-option-radius": "var(--radius-xs)",
256
+ "component-autocomplete-option-gap": "var(--space-2)",
257
+ "component-autocomplete-option-bg-hover": theme_jaipur$1.default.NEUTRAL_JP_100,
258
+ "component-autocomplete-option-text": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
259
+ "component-autocomplete-option-text-selected": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
260
+ "component-autocomplete-option-text-disabled": theme_jaipur$1.default.NEUTRAL_JP_400,
261
+ "component-autocomplete-option-description": theme_jaipur$1.default.NEUTRAL_JP_600,
262
+ "component-autocomplete-description-offset": "var(--space-1)",
263
+ "component-autocomplete-message-text": theme_jaipur$1.default.NEUTRAL_JP_600,
264
+ "component-autocomplete-message-padding": "var(--space-4)",
232
265
  "component-editable-icon-size": "1rem",
233
266
  "component-code-field-height-m": "3rem",
234
267
  "component-code-field-height-l": "3.5rem",
@@ -277,82 +310,6 @@ var theme_jaipur = {
277
310
  "component-switch-thumb-size": "1rem",
278
311
  "component-switch-thumb-offset": "0.125rem",
279
312
  "component-switch-thumb-translate": "1.125rem",
280
- "component-button-font-size-xs": "0.75rem",
281
- "component-button-font-size-s": "0.8125rem",
282
- "component-button-font-size-m": "0.9375rem",
283
- "component-button-font-size-l": "1.125rem",
284
- "component-button-height-xs": "1.8125rem",
285
- "component-button-height-s": "2rem",
286
- "component-button-height-m": "2.25rem",
287
- "component-button-height-l": "2.625rem",
288
- "component-button-radius": "1.125rem",
289
- "component-button-radius-lg": "1.5rem",
290
- "component-button-primary-bg": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
291
- "component-button-primary-border": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
292
- "component-button-primary-text": theme_jaipur$1.default.BRAND_JP_PINK,
293
- "component-button-primary-bg-hover": theme_jaipur$1.default.BRAND_JP_INK,
294
- "component-button-primary-border-hover": theme_jaipur$1.default.BRAND_JP_INK,
295
- "component-button-primary-text-hover": theme_jaipur$1.default.BRAND_JP_PINK,
296
- "component-button-primary-bg-pressed": theme_jaipur$1.default.BRAND_JP_PINK,
297
- "component-button-primary-border-pressed": theme_jaipur$1.default.BRAND_JP_PINK,
298
- "component-button-primary-text-pressed": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
299
- "component-button-secondary-bg": theme_jaipur$1.default.NEUTRAL_JP_200,
300
- "component-button-secondary-border": theme_jaipur$1.default.NEUTRAL_JP_300,
301
- "component-button-secondary-text": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
302
- "component-button-secondary-bg-hover": theme_jaipur$1.default.NEUTRAL_JP_300,
303
- "component-button-secondary-border-hover": theme_jaipur$1.default.NEUTRAL_JP_500,
304
- "component-button-secondary-text-hover": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
305
- "component-button-secondary-bg-pressed": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
306
- "component-button-secondary-border-pressed": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
307
- "component-button-secondary-text-pressed": theme_jaipur$1.default.BRAND_JP_PINK,
308
- "component-button-outline-bg": theme_jaipur$1.default.NEUTRAL_JP_0,
309
- "component-button-outline-border": theme_jaipur$1.default.NEUTRAL_JP_300,
310
- "component-button-outline-text": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
311
- "component-button-outline-bg-hover": theme_jaipur$1.default.NEUTRAL_JP_100,
312
- "component-button-outline-border-hover": theme_jaipur$1.default.NEUTRAL_JP_500,
313
- "component-button-outline-text-hover": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
314
- "component-button-outline-bg-pressed": theme_jaipur$1.default.NEUTRAL_JP_200,
315
- "component-button-outline-border-pressed": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
316
- "component-button-outline-text-pressed": theme_jaipur$1.default.BRAND_JP_INK,
317
- "component-button-pseudo-bg": theme_jaipur$1.default.NEUTRAL_JP_50,
318
- "component-button-pseudo-border": theme_jaipur$1.default.NEUTRAL_JP_50,
319
- "component-button-pseudo-text": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
320
- "component-button-pseudo-bg-hover": theme_jaipur$1.default.NEUTRAL_JP_100,
321
- "component-button-pseudo-border-hover": theme_jaipur$1.default.NEUTRAL_JP_100,
322
- "component-button-pseudo-text-hover": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
323
- "component-button-pseudo-bg-pressed": theme_jaipur$1.default.NEUTRAL_JP_200,
324
- "component-button-pseudo-border-pressed": theme_jaipur$1.default.NEUTRAL_JP_200,
325
- "component-button-pseudo-text-pressed": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
326
- "component-button-clear-bg": "transparent",
327
- "component-button-clear-border": "transparent",
328
- "component-button-clear-text": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
329
- "component-button-clear-bg-hover": "transparent",
330
- "component-button-clear-border-hover": "transparent",
331
- "component-button-clear-text-hover": theme_jaipur$1.default.PINK_JP_800,
332
- "component-button-clear-bg-pressed": "transparent",
333
- "component-button-clear-border-pressed": "transparent",
334
- "component-button-clear-text-pressed": theme_jaipur$1.default.BRAND_JP_INK,
335
- "component-button-alert-bg": theme_jaipur$1.default.STATUS_JP_ERROR,
336
- "component-button-alert-border": theme_jaipur$1.default.STATUS_JP_ERROR,
337
- "component-button-alert-text": theme_jaipur$1.default.BRAND_JP_WHITE,
338
- "component-button-alert-bg-hover": theme_jaipur$1.default.PINK_JP_600,
339
- "component-button-alert-border-hover": theme_jaipur$1.default.PINK_JP_600,
340
- "component-button-alert-text-hover": theme_jaipur$1.default.BRAND_JP_WHITE,
341
- "component-button-alert-bg-pressed": theme_jaipur$1.default.STATUS_JP_ERROR_ACCENT,
342
- "component-button-alert-border-pressed": theme_jaipur$1.default.STATUS_JP_ERROR_ACCENT,
343
- "component-button-alert-text-pressed": theme_jaipur$1.default.BRAND_JP_WHITE,
344
- "component-button-success-bg": theme_jaipur$1.default.STATUS_JP_SUCCESS_BG,
345
- "component-button-success-border": theme_jaipur$1.default.STATUS_JP_SUCCESS_BG,
346
- "component-button-success-text": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
347
- "component-button-success-bg-hover": theme_jaipur$1.default.LIME_JP_200,
348
- "component-button-success-border-hover": theme_jaipur$1.default.LIME_JP_200,
349
- "component-button-success-text-hover": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
350
- "component-button-success-bg-pressed": theme_jaipur$1.default.STATUS_JP_SUCCESS,
351
- "component-button-success-border-pressed": theme_jaipur$1.default.STATUS_JP_SUCCESS,
352
- "component-button-success-text-pressed": theme_jaipur$1.default.BRAND_JP_WHITE,
353
- "component-button-bg-disabled": theme_jaipur$1.default.NEUTRAL_JP_100,
354
- "component-button-border-disabled": theme_jaipur$1.default.NEUTRAL_JP_100,
355
- "component-button-text-disabled": theme_jaipur$1.default.NEUTRAL_JP_400,
356
313
  "component-menu-bg": theme_jaipur$1.default.NEUTRAL_JP_0,
357
314
  "component-menu-text": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
358
315
  "component-menu-border": theme_jaipur$1.default.NEUTRAL_JP_200,
@@ -362,6 +319,46 @@ var theme_jaipur = {
362
319
  "component-menu-item-bg-pressed": theme_jaipur$1.default.NEUTRAL_JP_200,
363
320
  "component-menu-item-bg-selected": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
364
321
  "component-menu-item-text-disabled": theme_jaipur$1.default.NEUTRAL_JP_400,
322
+ "component-list-bg": theme_jaipur$1.default.NEUTRAL_JP_0,
323
+ "component-list-text": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
324
+ "component-list-text-disabled": theme_jaipur$1.default.NEUTRAL_JP_400,
325
+ "component-list-description": theme_jaipur$1.default.NEUTRAL_JP_700,
326
+ "component-list-description-selected": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
327
+ "component-list-divider": theme_jaipur$1.default.NEUTRAL_JP_200,
328
+ "component-list-focus-ring": theme_jaipur$1.default.BRAND_JP_PINK,
329
+ "component-list-container-radius": "var(--radius-lg)",
330
+ "component-list-container-padding": "var(--space-1)",
331
+ "component-list-items-gap": "var(--space-1)",
332
+ "component-list-item-bg-hover": theme_jaipur$1.default.NEUTRAL_JP_100,
333
+ "component-list-item-bg-selected": theme_jaipur$1.default.NEUTRAL_JP_100,
334
+ "component-list-item-text-selected": theme_jaipur$1.default.BRAND_JP_EGGPLANT,
335
+ "component-list-item-text-disabled": theme_jaipur$1.default.NEUTRAL_JP_400,
336
+ "component-list-item-radius": "var(--radius-md)",
337
+ "component-list-item-surface-radius": "var(--radius-md)",
338
+ "component-list-item-gap": "var(--space-3)",
339
+ "component-list-item-min-height-s": "calc(var(--space-10) + var(--space-1))",
340
+ "component-list-item-min-height-m": "calc(var(--space-10) + var(--space-4))",
341
+ "component-list-item-min-height-l": "var(--space-16)",
342
+ "component-list-item-min-height-compact": "calc(var(--space-10) + var(--space-1))",
343
+ "component-list-item-padding-block": "var(--component-input-padding-inline)",
344
+ "component-list-item-padding-block-compact": "var(--space-1)",
345
+ "component-list-item-padding-inline": "var(--space-3)",
346
+ "component-list-item-padding-inline-l": "var(--space-4)",
347
+ "component-list-font-size-s": "var(--font-size-text-sm)",
348
+ "component-list-line-height-s": "var(--line-height-text-sm)",
349
+ "component-list-font-size-m": "var(--font-size-text-md)",
350
+ "component-list-line-height-m": "var(--line-height-text-md)",
351
+ "component-list-font-size-l": "var(--font-size-text-md)",
352
+ "component-list-line-height-l": "var(--line-height-text-md)",
353
+ "component-list-description-font-size": "var(--font-size-text-xs)",
354
+ "component-list-description-line-height": "var(--line-height-text-xs)",
355
+ "component-list-description-offset": "var(--space-1)",
356
+ "component-list-section-gap": "var(--space-3)",
357
+ "component-list-section-title": theme_jaipur$1.default.NEUTRAL_JP_700,
358
+ "component-list-section-title-font-size": "var(--font-size-text-xs)",
359
+ "component-list-section-title-line-height": "var(--line-height-text-xs)",
360
+ "component-list-section-title-padding-block-start": "var(--space-2)",
361
+ "component-list-section-title-padding-block-end": "var(--component-input-padding-block)",
365
362
  "component-tab-bg": theme_jaipur$1.default.NEUTRAL_JP_0,
366
363
  "component-tab-bg-hover": theme_jaipur$1.default.NEUTRAL_JP_100,
367
364
  "component-tab-bg-pressed": theme_jaipur$1.default.NEUTRAL_JP_200,
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ import type { ForwardedRef } from "react";
3
+ import type { AutocompleteOption, AutocompleteProps } from "./index.props";
4
+ export declare const Autocomplete: <T extends AutocompleteOption = AutocompleteOption>(props: AutocompleteProps<T> & {
5
+ ref?: ForwardedRef<HTMLInputElement>;
6
+ }) => React.ReactElement;
@@ -0,0 +1,288 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
3
+ import { __rest } from 'tslib';
4
+ import React, { forwardRef, useId, useState, useRef, useCallback, useMemo, useEffect } from 'react';
5
+ import clsx from 'clsx';
6
+ import { Input } from '../Input/index.js';
7
+ import { Chevron } from '../Icons/Chevron.js';
8
+ import { Cross } from '../Icons/Cross.js';
9
+ import styles from './Autocomplete.module.css';
10
+
11
+ var AutocompleteInner = function AutocompleteInner(props, forwardedRef) {
12
+ var options = props.options,
13
+ value = props.value,
14
+ _props$defaultValue = props.defaultValue,
15
+ defaultValue = _props$defaultValue === void 0 ? "" : _props$defaultValue,
16
+ onValueChange = props.onValueChange,
17
+ onOptionSelect = props.onOptionSelect,
18
+ filterOption = props.filterOption,
19
+ renderOption = props.renderOption,
20
+ _props$getOptionKey = props.getOptionKey,
21
+ getOptionKey = _props$getOptionKey === void 0 ? function (option) {
22
+ return option.value;
23
+ } : _props$getOptionKey,
24
+ _props$minQueryLength = props.minQueryLength,
25
+ minQueryLength = _props$minQueryLength === void 0 ? 0 : _props$minQueryLength,
26
+ open = props.open,
27
+ _props$defaultOpen = props.defaultOpen,
28
+ defaultOpen = _props$defaultOpen === void 0 ? false : _props$defaultOpen,
29
+ onOpenChange = props.onOpenChange,
30
+ _props$openOnFocus = props.openOnFocus,
31
+ openOnFocus = _props$openOnFocus === void 0 ? true : _props$openOnFocus,
32
+ _props$loading = props.loading,
33
+ loading = _props$loading === void 0 ? false : _props$loading,
34
+ _props$loadingText = props.loadingText,
35
+ loadingText = _props$loadingText === void 0 ? "Loading..." : _props$loadingText,
36
+ _props$emptyText = props.emptyText,
37
+ emptyText = _props$emptyText === void 0 ? "No results found" : _props$emptyText,
38
+ label = props.label,
39
+ hint = props.hint,
40
+ hasError = props.hasError,
41
+ success = props.success,
42
+ _props$clearable = props.clearable,
43
+ clearable = _props$clearable === void 0 ? true : _props$clearable,
44
+ _props$clearLabel = props.clearLabel,
45
+ clearLabel = _props$clearLabel === void 0 ? "Clear value" : _props$clearLabel,
46
+ _props$size = props.size,
47
+ size = _props$size === void 0 ? "m" : _props$size,
48
+ _props$listMaxHeight = props.listMaxHeight,
49
+ listMaxHeight = _props$listMaxHeight === void 0 ? "var(--component-autocomplete-list-max-height)" : _props$listMaxHeight,
50
+ containerClassName = props.containerClassName,
51
+ className = props.className,
52
+ disabled = props.disabled,
53
+ readOnly = props.readOnly,
54
+ required = props.required,
55
+ id = props.id,
56
+ _onFocus = props.onFocus,
57
+ onBlur = props.onBlur,
58
+ onKeyDown = props.onKeyDown,
59
+ inputProps = __rest(props, ["options", "value", "defaultValue", "onValueChange", "onOptionSelect", "filterOption", "renderOption", "getOptionKey", "minQueryLength", "open", "defaultOpen", "onOpenChange", "openOnFocus", "loading", "loadingText", "emptyText", "label", "hint", "hasError", "success", "clearable", "clearLabel", "size", "listMaxHeight", "containerClassName", "className", "disabled", "readOnly", "required", "id", "onFocus", "onBlur", "onKeyDown"]);
60
+ var generatedId = useId();
61
+ var inputId = id !== null && id !== void 0 ? id : generatedId;
62
+ var listId = "".concat(inputId, "-listbox");
63
+ var controlled = value !== undefined;
64
+ var _useState = useState(defaultValue),
65
+ _useState2 = _slicedToArray(_useState, 2),
66
+ internalValue = _useState2[0],
67
+ setInternalValue = _useState2[1];
68
+ var _useState3 = useState(defaultOpen),
69
+ _useState4 = _slicedToArray(_useState3, 2),
70
+ internalOpen = _useState4[0],
71
+ setInternalOpen = _useState4[1];
72
+ var _useState5 = useState(-1),
73
+ _useState6 = _slicedToArray(_useState5, 2),
74
+ activeIndex = _useState6[0],
75
+ setActiveIndex = _useState6[1];
76
+ var rootRef = useRef(null);
77
+ var controlRef = useRef(null);
78
+ var inputRef = useRef(null);
79
+ var optionRefs = useRef([]);
80
+ var query = controlled ? value : internalValue;
81
+ var isOpen = open !== null && open !== void 0 ? open : internalOpen;
82
+ var setInputRef = function setInputRef(node) {
83
+ inputRef.current = node;
84
+ if (typeof forwardedRef === "function") forwardedRef(node);else if (forwardedRef) forwardedRef.current = node;
85
+ };
86
+ var setOpen = useCallback(function (next) {
87
+ if (open === undefined) setInternalOpen(next);
88
+ onOpenChange === null || onOpenChange === void 0 ? void 0 : onOpenChange(next);
89
+ if (!next) setActiveIndex(-1);
90
+ }, [onOpenChange, open]);
91
+ var filteredOptions = useMemo(function () {
92
+ if (query.length < minQueryLength) return [];
93
+ var normalized = query.trim().toLocaleLowerCase();
94
+ var predicate = filterOption !== null && filterOption !== void 0 ? filterOption : function (option) {
95
+ return option.label.toLocaleLowerCase().includes(normalized);
96
+ };
97
+ return options.filter(function (option) {
98
+ return predicate(option, query);
99
+ });
100
+ }, [filterOption, minQueryLength, options, query]);
101
+ var showPopup = isOpen && !disabled && !readOnly && query.length >= minQueryLength;
102
+ useEffect(function () {
103
+ if (!showPopup) return undefined;
104
+ var closeOutside = function closeOutside(event) {
105
+ var _a;
106
+ if (!((_a = rootRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) setOpen(false);
107
+ };
108
+ document.addEventListener("mousedown", closeOutside);
109
+ return function () {
110
+ return document.removeEventListener("mousedown", closeOutside);
111
+ };
112
+ }, [setOpen, showPopup]);
113
+ useEffect(function () {
114
+ setActiveIndex(-1);
115
+ }, [query]);
116
+ useEffect(function () {
117
+ var _a;
118
+ if (activeIndex >= 0) {
119
+ (_a = optionRefs.current[activeIndex]) === null || _a === void 0 ? void 0 : _a.scrollIntoView({
120
+ block: "nearest"
121
+ });
122
+ }
123
+ }, [activeIndex]);
124
+ var changeValue = function changeValue(next) {
125
+ if (!controlled) setInternalValue(next);
126
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(next);
127
+ };
128
+ var selectOption = function selectOption(option) {
129
+ var _a;
130
+ if (option.disabled) return;
131
+ changeValue(option.label);
132
+ onOptionSelect === null || onOptionSelect === void 0 ? void 0 : onOptionSelect(option);
133
+ setOpen(false);
134
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
135
+ };
136
+ var moveActive = function moveActive(direction) {
137
+ if (!showPopup) setOpen(true);
138
+ if (!filteredOptions.length) return;
139
+ var next = activeIndex;
140
+ for (var attempts = 0; attempts < filteredOptions.length; attempts += 1) {
141
+ next = (next + direction + filteredOptions.length) % filteredOptions.length;
142
+ if (!filteredOptions[next].disabled) break;
143
+ }
144
+ setActiveIndex(next);
145
+ };
146
+ var handleChange = function handleChange(_event, next) {
147
+ changeValue(next);
148
+ setOpen(next.length >= minQueryLength);
149
+ };
150
+ var handleKeyDown = function handleKeyDown(event) {
151
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
152
+ if (event.defaultPrevented) return;
153
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
154
+ event.preventDefault();
155
+ moveActive(event.key === "ArrowDown" ? 1 : -1);
156
+ } else if (event.key === "Enter" && showPopup && activeIndex >= 0) {
157
+ event.preventDefault();
158
+ selectOption(filteredOptions[activeIndex]);
159
+ } else if (event.key === "Escape") {
160
+ event.preventDefault();
161
+ setOpen(false);
162
+ } else if (event.key === "Home" && showPopup) {
163
+ event.preventDefault();
164
+ var first = filteredOptions.findIndex(function (option) {
165
+ return !option.disabled;
166
+ });
167
+ setActiveIndex(first);
168
+ } else if (event.key === "End" && showPopup) {
169
+ event.preventDefault();
170
+ var last = filteredOptions.length - 1;
171
+ while (last >= 0 && filteredOptions[last].disabled) last -= 1;
172
+ setActiveIndex(last);
173
+ } else if (event.key === "Tab") {
174
+ setOpen(false);
175
+ }
176
+ };
177
+ var clearButton = clearable && query && !disabled && !readOnly && (/*#__PURE__*/React.createElement("button", {
178
+ type: "button",
179
+ className: styles.clear,
180
+ "aria-label": clearLabel,
181
+ onMouseDown: function onMouseDown(event) {
182
+ return event.preventDefault();
183
+ },
184
+ onClick: function onClick() {
185
+ var _a;
186
+ changeValue("");
187
+ setOpen(openOnFocus && minQueryLength === 0);
188
+ (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
189
+ }
190
+ }, /*#__PURE__*/React.createElement(Cross, null)));
191
+ var endIcon = /*#__PURE__*/React.createElement("span", {
192
+ className: styles["end-icons"]
193
+ }, clearButton, /*#__PURE__*/React.createElement(Chevron, {
194
+ className: clsx(styles.chevron, _defineProperty({}, styles["chevron_open"], showPopup)),
195
+ "aria-hidden": "true"
196
+ }));
197
+ var popup = showPopup && (/*#__PURE__*/React.createElement("div", {
198
+ className: styles.popup
199
+ }, /*#__PURE__*/React.createElement("ul", {
200
+ id: listId,
201
+ role: "listbox",
202
+ "aria-label": typeof label === "string" ? label : undefined,
203
+ className: styles.list,
204
+ style: {
205
+ maxHeight: listMaxHeight
206
+ }
207
+ }, loading ? (/*#__PURE__*/React.createElement("li", {
208
+ className: styles.message
209
+ }, loadingText)) : filteredOptions.length === 0 ? (/*#__PURE__*/React.createElement("li", {
210
+ className: styles.message
211
+ }, emptyText)) : filteredOptions.map(function (option, index) {
212
+ var active = index === activeIndex;
213
+ var selected = option.label === query;
214
+ return /*#__PURE__*/React.createElement("li", {
215
+ ref: function ref(node) {
216
+ optionRefs.current[index] = node;
217
+ },
218
+ id: "".concat(listId, "-").concat(index),
219
+ key: getOptionKey(option),
220
+ role: "option",
221
+ "aria-selected": selected,
222
+ "aria-disabled": option.disabled || undefined,
223
+ className: clsx(styles.option, _defineProperty(_defineProperty(_defineProperty({}, styles.active, active), styles.selected, selected), styles["option_disabled"], option.disabled)),
224
+ onMouseDown: function onMouseDown(event) {
225
+ return event.preventDefault();
226
+ },
227
+ onMouseEnter: function onMouseEnter() {
228
+ if (!option.disabled) setActiveIndex(index);
229
+ },
230
+ onKeyDown: function onKeyDown(event) {
231
+ if (event.key === "Enter" || event.key === " ") {
232
+ event.preventDefault();
233
+ selectOption(option);
234
+ }
235
+ },
236
+ onClick: function onClick() {
237
+ return selectOption(option);
238
+ }
239
+ }, renderOption ? renderOption(option, {
240
+ active: active,
241
+ selected: selected
242
+ }) : (/*#__PURE__*/React.createElement(React.Fragment, null, option.contentLeft && (/*#__PURE__*/React.createElement("span", {
243
+ className: styles.side
244
+ }, option.contentLeft)), /*#__PURE__*/React.createElement("span", {
245
+ className: styles["option-text"]
246
+ }, /*#__PURE__*/React.createElement("span", null, option.label), option.description && (/*#__PURE__*/React.createElement("small", null, option.description))), option.contentRight && (/*#__PURE__*/React.createElement("span", {
247
+ className: styles.side
248
+ }, option.contentRight)))));
249
+ }))));
250
+ return /*#__PURE__*/React.createElement("div", {
251
+ ref: rootRef,
252
+ className: clsx(styles.root, styles["size_".concat(size)], _defineProperty({}, styles.success, success), containerClassName)
253
+ }, /*#__PURE__*/React.createElement(Input, Object.assign({}, inputProps, {
254
+ id: inputId,
255
+ type: "text",
256
+ role: "combobox",
257
+ "aria-autocomplete": "list",
258
+ "aria-expanded": showPopup,
259
+ "aria-controls": showPopup ? listId : undefined,
260
+ "aria-activedescendant": activeIndex >= 0 ? "".concat(listId, "-").concat(activeIndex) : undefined,
261
+ "aria-invalid": hasError || undefined,
262
+ autoComplete: "off",
263
+ className: clsx(styles.field, className),
264
+ controlAfter: popup,
265
+ controlClassName: styles.control,
266
+ controlRef: controlRef,
267
+ disabled: disabled,
268
+ endIcon: endIcon,
269
+ hasError: hasError,
270
+ hint: hint,
271
+ inputRef: setInputRef,
272
+ label: label,
273
+ readOnly: readOnly,
274
+ required: required,
275
+ size: size,
276
+ value: query,
277
+ onBlur: onBlur,
278
+ onChange: handleChange,
279
+ onFocus: function onFocus(event) {
280
+ _onFocus === null || _onFocus === void 0 ? void 0 : _onFocus(event);
281
+ if (openOnFocus && query.length >= minQueryLength) setOpen(true);
282
+ },
283
+ onKeyDown: handleKeyDown
284
+ })));
285
+ };
286
+ var Autocomplete = /*#__PURE__*/forwardRef(AutocompleteInner);
287
+
288
+ export { Autocomplete };
@@ -0,0 +1,147 @@
1
+ .root {
2
+ display: inline-flex;
3
+ flex-direction: column;
4
+ width: var(--component-autocomplete-inline-size);
5
+ }
6
+
7
+ .field {
8
+ width: 100%;
9
+ }
10
+
11
+ .control {
12
+ position: relative;
13
+ width: 100%;
14
+ }
15
+ .control > div {
16
+ width: 100%;
17
+ }
18
+
19
+ .success {
20
+ --component-input-border: var(--component-autocomplete-border-success);
21
+ --component-input-border-focus: var(--component-autocomplete-border-success);
22
+ }
23
+
24
+ .end-icons {
25
+ align-items: center;
26
+ display: inline-flex;
27
+ gap: var(--component-autocomplete-end-icon-gap);
28
+ }
29
+
30
+ .clear {
31
+ align-items: center;
32
+ background: transparent;
33
+ border: 0;
34
+ border-radius: var(--component-autocomplete-clear-radius);
35
+ color: var(--component-autocomplete-clear-icon);
36
+ cursor: pointer;
37
+ display: inline-flex;
38
+ flex: none;
39
+ height: var(--component-autocomplete-clear-size);
40
+ justify-content: center;
41
+ padding: var(--space-0);
42
+ width: var(--component-autocomplete-clear-size);
43
+ }
44
+ .clear:hover {
45
+ background: var(--component-autocomplete-clear-bg-hover);
46
+ }
47
+ .clear svg {
48
+ height: var(--component-autocomplete-icon-size);
49
+ width: var(--component-autocomplete-icon-size);
50
+ }
51
+
52
+ .chevron {
53
+ color: var(--component-autocomplete-chevron);
54
+ flex: none;
55
+ height: var(--component-autocomplete-icon-size);
56
+ transition: transform 0.16s ease-in;
57
+ width: var(--component-autocomplete-icon-size);
58
+ }
59
+
60
+ .chevron_open {
61
+ transform: rotate(180deg);
62
+ }
63
+
64
+ .popup {
65
+ background: var(--component-autocomplete-popup-bg);
66
+ border-color: var(--component-autocomplete-popup-border);
67
+ border-radius: var(--component-autocomplete-popup-radius);
68
+ border-style: solid;
69
+ border-width: var(--border-width-hairline);
70
+ box-shadow: var(--component-autocomplete-popup-shadow);
71
+ left: 0;
72
+ overflow: hidden;
73
+ position: absolute;
74
+ right: 0;
75
+ top: calc(100% + var(--component-autocomplete-popup-offset));
76
+ z-index: var(--component-autocomplete-popup-z-index);
77
+ }
78
+
79
+ .list {
80
+ box-sizing: border-box;
81
+ list-style: none;
82
+ margin: var(--space-0);
83
+ overflow: auto;
84
+ padding: var(--component-autocomplete-list-padding);
85
+ }
86
+
87
+ .option {
88
+ align-items: center;
89
+ border-radius: var(--component-autocomplete-option-radius);
90
+ color: var(--component-autocomplete-option-text);
91
+ cursor: pointer;
92
+ display: flex;
93
+ gap: var(--component-autocomplete-option-gap);
94
+ min-height: var(--component-autocomplete-option-min-height);
95
+ padding: var(--component-autocomplete-option-padding-block) var(--component-autocomplete-option-padding-inline);
96
+ }
97
+ .option:hover {
98
+ background: var(--component-autocomplete-option-bg-hover);
99
+ }
100
+
101
+ .active {
102
+ background: var(--component-autocomplete-option-bg-hover);
103
+ }
104
+
105
+ .selected {
106
+ color: var(--component-autocomplete-option-text-selected);
107
+ }
108
+
109
+ .option_disabled {
110
+ color: var(--component-autocomplete-option-text-disabled);
111
+ cursor: not-allowed;
112
+ }
113
+ .option_disabled:hover {
114
+ background: transparent;
115
+ }
116
+
117
+ .option-text {
118
+ display: flex;
119
+ flex: 1;
120
+ flex-direction: column;
121
+ min-width: 0;
122
+ }
123
+ .option-text > span {
124
+ overflow: hidden;
125
+ text-overflow: ellipsis;
126
+ white-space: nowrap;
127
+ }
128
+ .option-text small {
129
+ color: var(--component-autocomplete-option-description);
130
+ font-size: var(--font-size-text-xs);
131
+ line-height: var(--line-height-text-xs);
132
+ margin-top: var(--component-autocomplete-description-offset);
133
+ }
134
+
135
+ .side {
136
+ align-items: center;
137
+ display: inline-flex;
138
+ flex: none;
139
+ }
140
+
141
+ .message {
142
+ color: var(--component-autocomplete-message-text);
143
+ font-size: var(--font-size-text-sm);
144
+ line-height: var(--line-height-text-sm);
145
+ padding: var(--component-autocomplete-message-padding);
146
+ text-align: center;
147
+ }
@@ -0,0 +1,2 @@
1
+ export { Autocomplete } from "./Autocomplete";
2
+ export type { AutocompleteOption, AutocompleteOptionState, AutocompleteProps, AutocompleteSize, } from "./index.props";
@@ -0,0 +1,39 @@
1
+ import type { CSSProperties, ReactNode } from "react";
2
+ import type { InputProps } from "../Input/index.props";
3
+ export interface AutocompleteOption {
4
+ contentLeft?: ReactNode;
5
+ contentRight?: ReactNode;
6
+ description?: string;
7
+ disabled?: boolean;
8
+ label: string;
9
+ value: string;
10
+ }
11
+ export type AutocompleteSize = "s" | "m" | "l";
12
+ export interface AutocompleteOptionState {
13
+ active: boolean;
14
+ selected: boolean;
15
+ }
16
+ export interface AutocompleteProps<T extends AutocompleteOption = AutocompleteOption> extends Omit<InputProps, "controlAfter" | "controlClassName" | "controlRef" | "defaultValue" | "endIcon" | "inputRef" | "onChange" | "size" | "value"> {
17
+ clearLabel?: string;
18
+ clearable?: boolean;
19
+ containerClassName?: string;
20
+ defaultOpen?: boolean;
21
+ defaultValue?: string;
22
+ emptyText?: ReactNode;
23
+ filterOption?: (option: T, query: string) => boolean;
24
+ getOptionKey?: (option: T) => string;
25
+ listMaxHeight?: CSSProperties["maxHeight"];
26
+ loading?: boolean;
27
+ loadingText?: ReactNode;
28
+ minQueryLength?: number;
29
+ onOpenChange?: (open: boolean) => void;
30
+ onOptionSelect?: (option: T) => void;
31
+ onValueChange?: (value: string) => void;
32
+ open?: boolean;
33
+ openOnFocus?: boolean;
34
+ options: T[];
35
+ renderOption?: (option: T, state: AutocompleteOptionState) => ReactNode;
36
+ size?: AutocompleteSize;
37
+ success?: boolean;
38
+ value?: string;
39
+ }