@techsio/ui-kit 0.49.0 → 0.51.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 (96) hide show
  1. package/dist/molecules/combobox.js +204 -50
  2. package/dist/src/molecules/combobox.d.ts +50 -4
  3. package/dist/src/molecules/combobox.d.ts.map +1 -1
  4. package/dist/src/templates/facet-filter-panel.d.ts +96 -0
  5. package/dist/src/templates/facet-filter-panel.d.ts.map +1 -0
  6. package/dist/src/templates/search-suggestions.d.ts +23 -0
  7. package/dist/src/templates/search-suggestions.d.ts.map +1 -0
  8. package/dist/src/theme/theme-config.d.ts +5 -0
  9. package/dist/src/theme/theme-config.d.ts.map +1 -1
  10. package/dist/stories/changelog/changelog.stories.d.ts.map +1 -1
  11. package/dist/stories/molecules/combobox.stories.d.ts +6 -0
  12. package/dist/stories/molecules/combobox.stories.d.ts.map +1 -1
  13. package/dist/stories/pages/akros/banner.stories.d.ts +6 -0
  14. package/dist/stories/pages/akros/banner.stories.d.ts.map +1 -0
  15. package/dist/stories/pages/akros/carts.stories.d.ts +7 -0
  16. package/dist/stories/pages/akros/carts.stories.d.ts.map +1 -0
  17. package/dist/stories/pages/akros/categories.stories.d.ts +6 -0
  18. package/dist/stories/pages/akros/categories.stories.d.ts.map +1 -0
  19. package/dist/stories/pages/akros/content.stories.d.ts +7 -0
  20. package/dist/stories/pages/akros/content.stories.d.ts.map +1 -0
  21. package/dist/stories/pages/akros/customers.stories.d.ts +8 -0
  22. package/dist/stories/pages/akros/customers.stories.d.ts.map +1 -0
  23. package/dist/stories/pages/akros/dashboard.stories.d.ts +7 -0
  24. package/dist/stories/pages/akros/dashboard.stories.d.ts.map +1 -0
  25. package/dist/stories/pages/akros/data.d.ts +247 -0
  26. package/dist/stories/pages/akros/data.d.ts.map +1 -0
  27. package/dist/stories/pages/akros/emails.stories.d.ts +7 -0
  28. package/dist/stories/pages/akros/emails.stories.d.ts.map +1 -0
  29. package/dist/stories/pages/akros/feeds.stories.d.ts +6 -0
  30. package/dist/stories/pages/akros/feeds.stories.d.ts.map +1 -0
  31. package/dist/stories/pages/akros/order-detail.stories.d.ts +8 -0
  32. package/dist/stories/pages/akros/order-detail.stories.d.ts.map +1 -0
  33. package/dist/stories/pages/akros/orders.stories.d.ts +8 -0
  34. package/dist/stories/pages/akros/orders.stories.d.ts.map +1 -0
  35. package/dist/stories/pages/akros/products.stories.d.ts +9 -0
  36. package/dist/stories/pages/akros/products.stories.d.ts.map +1 -0
  37. package/dist/stories/pages/akros/shared.d.ts +69 -0
  38. package/dist/stories/pages/akros/shared.d.ts.map +1 -0
  39. package/dist/stories/pages/akros/shipping-payments.stories.d.ts +7 -0
  40. package/dist/stories/pages/akros/shipping-payments.stories.d.ts.map +1 -0
  41. package/dist/stories/pages/auth.stories.d.ts +9 -0
  42. package/dist/stories/pages/auth.stories.d.ts.map +1 -0
  43. package/dist/stories/pages/board.stories.d.ts +7 -0
  44. package/dist/stories/pages/board.stories.d.ts.map +1 -0
  45. package/dist/stories/pages/checkout.stories.d.ts +7 -0
  46. package/dist/stories/pages/checkout.stories.d.ts.map +1 -0
  47. package/dist/stories/pages/cms-content-list.stories.d.ts +8 -0
  48. package/dist/stories/pages/cms-content-list.stories.d.ts.map +1 -0
  49. package/dist/stories/pages/cms-record-editor.stories.d.ts +7 -0
  50. package/dist/stories/pages/cms-record-editor.stories.d.ts.map +1 -0
  51. package/dist/stories/pages/crm-customer-workspace.stories.d.ts +6 -0
  52. package/dist/stories/pages/crm-customer-workspace.stories.d.ts.map +1 -0
  53. package/dist/stories/pages/crud-workflow.stories.d.ts +6 -0
  54. package/dist/stories/pages/crud-workflow.stories.d.ts.map +1 -0
  55. package/dist/stories/pages/dashboard.stories.d.ts +7 -0
  56. package/dist/stories/pages/dashboard.stories.d.ts.map +1 -0
  57. package/dist/stories/pages/data.d.ts +179 -0
  58. package/dist/stories/pages/data.d.ts.map +1 -0
  59. package/dist/stories/pages/ecommerce-orders.stories.d.ts +6 -0
  60. package/dist/stories/pages/ecommerce-orders.stories.d.ts.map +1 -0
  61. package/dist/stories/pages/frame.d.ts +102 -0
  62. package/dist/stories/pages/frame.d.ts.map +1 -0
  63. package/dist/stories/pages/layouts.stories.d.ts +15 -0
  64. package/dist/stories/pages/layouts.stories.d.ts.map +1 -0
  65. package/dist/stories/pages/media-library.stories.d.ts +6 -0
  66. package/dist/stories/pages/media-library.stories.d.ts.map +1 -0
  67. package/dist/stories/pages/order-detail.stories.d.ts +6 -0
  68. package/dist/stories/pages/order-detail.stories.d.ts.map +1 -0
  69. package/dist/stories/pages/settings.stories.d.ts +6 -0
  70. package/dist/stories/pages/settings.stories.d.ts.map +1 -0
  71. package/dist/stories/pages/shell.d.ts +115 -0
  72. package/dist/stories/pages/shell.d.ts.map +1 -0
  73. package/dist/stories/pages/storefront-category.stories.d.ts +7 -0
  74. package/dist/stories/pages/storefront-category.stories.d.ts.map +1 -0
  75. package/dist/stories/pages/storefront-product.stories.d.ts +6 -0
  76. package/dist/stories/pages/storefront-product.stories.d.ts.map +1 -0
  77. package/dist/stories/pages/system-states.stories.d.ts +12 -0
  78. package/dist/stories/pages/system-states.stories.d.ts.map +1 -0
  79. package/dist/stories/templates/facet-filter-panel.stories.d.ts +17 -0
  80. package/dist/stories/templates/facet-filter-panel.stories.d.ts.map +1 -0
  81. package/dist/stories/templates/search-suggestions.stories.d.ts +119 -0
  82. package/dist/stories/templates/search-suggestions.stories.d.ts.map +1 -0
  83. package/dist/templates/facet-filter-panel.js +310 -0
  84. package/dist/templates/search-suggestions.js +14 -0
  85. package/dist/test/combobox.behavior.spec.d.ts +2 -0
  86. package/dist/test/combobox.behavior.spec.d.ts.map +1 -0
  87. package/dist/test/facet-filter-panel.spec.d.ts +2 -0
  88. package/dist/test/facet-filter-panel.spec.d.ts.map +1 -0
  89. package/dist/test/search-suggestions.spec.d.ts +2 -0
  90. package/dist/test/search-suggestions.spec.d.ts.map +1 -0
  91. package/dist/theme/theme-config.js +7 -0
  92. package/package.json +1 -1
  93. package/src/tokens/components/components.css +2 -0
  94. package/src/tokens/components/molecules/_combobox.css +22 -0
  95. package/src/tokens/components/templates/_facet-filter-panel.css +43 -0
  96. package/src/tokens/figma/brand-overrides.css +165 -0
@@ -1,7 +1,7 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { createElement, useEffect, useId, useMemo, useState } from "react";
2
3
  import { collection as combobox_collection, connect, machine } from "@zag-js/combobox";
3
4
  import { Portal, normalizeProps, useMachine } from "@zag-js/react";
4
- import { useEffect, useId, useState } from "react";
5
5
  import { ActionIcon } from "../atoms/action-icon.js";
6
6
  import { Button } from "../atoms/button.js";
7
7
  import { Icon } from "../atoms/icon.js";
@@ -53,7 +53,7 @@ const comboboxVariants = tv({
53
53
  content: [
54
54
  "popup-surface-base",
55
55
  "w-full",
56
- "flex flex-col",
56
+ "flex flex-col overflow-hidden",
57
57
  "duration-200 ease-out motion-safe:transition-[opacity,display,translate,scale]",
58
58
  "transition-discrete",
59
59
  "starting:scale-98 starting:opacity-0",
@@ -62,7 +62,14 @@ const comboboxVariants = tv({
62
62
  "data-[state=closed]:scale-98 data-[state=closed]:opacity-0"
63
63
  ],
64
64
  list: [
65
- "m-0 flex list-none flex-col"
65
+ "m-0 flex min-h-0 list-none flex-col overflow-y-auto overscroll-contain"
66
+ ],
67
+ groupLabel: [
68
+ "combobox-popup-padding",
69
+ "text-combobox-group-label-size font-combobox-group-label text-combobox-group-fg"
70
+ ],
71
+ footer: [
72
+ "combobox-popup-padding shrink-0 border-t border-combobox-footer-border"
66
73
  ],
67
74
  itemText: [
68
75
  "min-w-0 flex-grow truncate"
@@ -83,7 +90,12 @@ const comboboxVariants = tv({
83
90
  ],
84
91
  emptyState: [
85
92
  "px-(--popup-item-x) py-(--popup-item-y)",
86
- "text-popup-item-fg-muted"
93
+ "text-combobox-status-fg"
94
+ ],
95
+ status: [
96
+ "combobox-status-gap flex items-center",
97
+ "px-(--popup-item-x) py-(--popup-item-y)",
98
+ "text-combobox-status-fg"
87
99
  ],
88
100
  triggerIndicator: [
89
101
  "text-combobox-trigger-fg-base group-hover:text-combobox-trigger-fg-hover",
@@ -142,65 +154,151 @@ const comboboxVariants = tv({
142
154
  size: "md"
143
155
  }
144
156
  });
145
- function Combobox({ id, name, label, size, placeholder = "Select option", disabled = false, readOnly = false, required = false, items = [], value, defaultValue, inputValue, multiple = false, validateStatus, helpText, showHelpTextIcon = true, noResultsMessage = 'No results found for "{inputValue}"', clearable = true, selectionBehavior = "replace", closeOnSelect = true, allowCustomValue = false, loopFocus = true, autoFocus = false, triggerIcon = "token-icon-combobox-chevron", triggerIconSize, clearIcon = "token-icon-combobox-clear", inputBehavior = "autocomplete", onChange, onInputValueChange, onOpenChange }) {
157
+ function Combobox({ id, name, label, size, placeholder = "Select option", disabled = false, readOnly = false, required = false, items, groups, value, defaultValue, inputValue, multiple = false, validateStatus, helpText, showHelpTextIcon = true, noResultsMessage = 'No results found for "{inputValue}"', clearable = true, selectionBehavior = "replace", closeOnSelect = true, allowCustomValue = false, loopFocus = true, autoFocus = false, open, defaultOpen, triggerIcon = "token-icon-combobox-chevron", triggerIconSize, clearIcon = "token-icon-combobox-clear", inputBehavior = "autocomplete", filterBehavior = "local", loading = false, loadingMessage = "Loading results", error, retryLabel = "Retry", onRetry, renderItem, onChange, onInputValueChange, onOpenChange, mode = "selection", navigate, footer, portalled = true }) {
146
158
  const generatedId = useId();
147
159
  const uniqueId = id || generatedId;
148
- const [options, setOptions] = useState(items);
160
+ const listId = `${uniqueId}-listbox`;
161
+ const helpTextId = `${uniqueId}-help`;
162
+ const navigation = "navigation" === mode;
163
+ const allItems = useMemo(()=>groups ? groups.flatMap((group)=>group.items) : items ?? [], [
164
+ groups,
165
+ items
166
+ ]);
167
+ const [options, setOptions] = useState(allItems);
149
168
  useEffect(()=>{
150
- setOptions(items);
169
+ setOptions(allItems);
151
170
  }, [
152
- items
171
+ allItems
153
172
  ]);
173
+ const displayedItems = "external" === filterBehavior ? allItems : options;
174
+ const resultsHidden = loading || Boolean(error);
154
175
  const collection = combobox_collection({
155
- items: options,
176
+ items: displayedItems,
156
177
  itemToString: (item)=>item.label,
157
178
  itemToValue: (item)=>item.value,
158
- isItemDisabled: (item)=>!!item.disabled
179
+ isItemDisabled: (item)=>Boolean(resultsHidden || item.disabled || readOnly || navigation && !item.href)
159
180
  });
160
181
  const service = useMachine(machine, {
161
182
  id: uniqueId,
162
- name,
183
+ name: navigation ? void 0 : name,
163
184
  collection,
164
185
  disabled,
165
186
  readOnly,
166
187
  closeOnSelect,
167
- selectionBehavior,
168
- allowCustomValue,
188
+ selectionBehavior: navigation ? "preserve" : selectionBehavior,
189
+ allowCustomValue: !navigation && allowCustomValue,
169
190
  autoFocus,
191
+ open,
192
+ defaultOpen,
170
193
  inputBehavior,
171
194
  loopFocus,
195
+ navigate,
196
+ composite: false,
197
+ positioning: {
198
+ strategy: portalled ? "absolute" : "fixed"
199
+ },
200
+ scrollToIndexFn: ({ getElement })=>{
201
+ getElement()?.scrollIntoView({
202
+ block: "nearest",
203
+ inline: "nearest"
204
+ });
205
+ },
206
+ invalid: "error" === validateStatus,
172
207
  ids: {
173
208
  label: `${uniqueId}-label`,
174
209
  input: `${uniqueId}-input`,
175
210
  control: `${uniqueId}-control`
176
211
  },
177
- value: value,
178
- defaultValue: defaultValue,
179
- multiple,
212
+ value: navigation ? [] : "string" == typeof value ? [
213
+ value
214
+ ] : value,
215
+ defaultValue: navigation ? void 0 : "string" == typeof defaultValue ? [
216
+ defaultValue
217
+ ] : defaultValue,
218
+ multiple: !navigation && multiple,
180
219
  inputValue,
181
220
  onValueChange: ({ value: selectedValue })=>{
182
- onChange?.(selectedValue);
221
+ if (!navigation) onChange?.(selectedValue);
183
222
  },
184
223
  onInputValueChange: ({ inputValue: newItemInputValue })=>{
185
- const filtered = items.filter((item)=>item.label.toLowerCase().includes(newItemInputValue.toLowerCase()));
186
- setOptions(filtered);
224
+ if ("local" === filterBehavior) {
225
+ const filtered = allItems.filter((item)=>item.label.toLowerCase().includes(newItemInputValue.toLowerCase()));
226
+ setOptions(filtered);
227
+ }
187
228
  onInputValueChange?.(newItemInputValue);
188
229
  },
189
230
  onOpenChange: ({ open })=>{
190
- setOptions(items);
231
+ setOptions(allItems);
191
232
  onOpenChange?.(open);
192
233
  }
193
234
  });
194
235
  const api = connect(service, normalizeProps);
195
- const inputProps = api.getInputProps();
196
- const { ...restInputProps } = inputProps;
197
- const { root, label: labelStyles, control, input, trigger, positioner, content, list, item: itemSlot, itemText, itemIndicator, emptyState, triggerIndicator } = comboboxVariants({
236
+ const { root, label: labelStyles, control, input, trigger, positioner, content, list, groupLabel, footer: footerSlot, item: itemSlot, itemText, itemIndicator, emptyState, status: statusSlot, triggerIndicator } = comboboxVariants({
198
237
  size
199
238
  });
200
239
  const hasOptions = api.collection.size > 0;
201
- const showEmptyState = !hasOptions && Boolean(api.inputValue);
240
+ const showEmptyState = !resultsHidden && !hasOptions && Boolean(api.inputValue);
241
+ let state = "idle";
242
+ if (loading) state = "loading";
243
+ else if (error) state = "error";
244
+ else if (hasOptions) state = "results";
245
+ else if (showEmptyState) state = "empty";
246
+ const visibleValues = new Set(collection.items.map((item)=>item.value));
247
+ const renderOption = (item)=>{
248
+ const itemProps = api.getItemProps({
249
+ item
250
+ });
251
+ const itemContent = renderItem ? renderItem(item) : /*#__PURE__*/ jsx("span", {
252
+ className: itemText(),
253
+ children: item.label
254
+ });
255
+ if (navigation) {
256
+ const blocked = disabled || readOnly || item.disabled || !item.href;
257
+ return /*#__PURE__*/ createElement("a", {
258
+ ...itemProps,
259
+ "aria-label": item.label,
260
+ className: itemSlot(),
261
+ href: blocked ? void 0 : item.href,
262
+ key: item.value,
263
+ onClick: (event)=>{
264
+ if (blocked) return void event.preventDefault();
265
+ itemProps.onClick?.(event);
266
+ if (navigate && !event.defaultPrevented && 0 === event.button && !event.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey) {
267
+ event.preventDefault();
268
+ navigate({
269
+ node: event.currentTarget,
270
+ href: event.currentTarget.href,
271
+ value: item.value
272
+ });
273
+ }
274
+ }
275
+ }, itemContent);
276
+ }
277
+ return /*#__PURE__*/ createElement("div", {
278
+ ...itemProps,
279
+ "aria-label": item.label,
280
+ className: itemSlot(),
281
+ key: item.value,
282
+ children: [
283
+ itemContent,
284
+ /*#__PURE__*/ jsx("span", {
285
+ ...api.getItemIndicatorProps({
286
+ item
287
+ }),
288
+ className: itemIndicator(),
289
+ children: /*#__PURE__*/ jsx(Icon, {
290
+ icon: "token-icon-check",
291
+ size: "current"
292
+ })
293
+ })
294
+ ]
295
+ });
296
+ };
202
297
  return /*#__PURE__*/ jsxs("div", {
298
+ ...api.getRootProps(),
203
299
  className: root(),
300
+ "data-mode": mode,
301
+ "data-status": state,
204
302
  children: [
205
303
  label && /*#__PURE__*/ jsx(Label, {
206
304
  className: labelStyles(),
@@ -216,20 +314,33 @@ function Combobox({ id, name, label, size, placeholder = "Select option", disabl
216
314
  children: [
217
315
  /*#__PURE__*/ jsx(Input, {
218
316
  className: input(),
219
- ...restInputProps,
220
- name: name,
317
+ ...api.getInputProps(),
318
+ "aria-controls": api.open ? listId : void 0,
319
+ "aria-describedby": helpText ? helpTextId : void 0,
320
+ name: navigation ? void 0 : name,
221
321
  placeholder: placeholder,
222
322
  required: required,
223
323
  size: size
224
324
  }),
225
- clearable && api.value.length > 0 && /*#__PURE__*/ jsx(ActionIcon, {
325
+ clearable && (navigation ? Boolean(api.inputValue) : api.value.length > 0) && /*#__PURE__*/ jsx(ActionIcon, {
226
326
  icon: clearIcon,
227
327
  size: size ?? "md",
228
328
  tone: "neutral",
229
- ...api.getClearTriggerProps()
329
+ ...api.getClearTriggerProps(),
330
+ disabled: disabled || readOnly,
331
+ hidden: false,
332
+ onClick: (event)=>{
333
+ if (navigation) {
334
+ if (disabled || readOnly) return;
335
+ api.setInputValue("");
336
+ api.focus();
337
+ } else api.getClearTriggerProps().onClick?.(event);
338
+ }
230
339
  }),
231
340
  /*#__PURE__*/ jsx(Button, {
232
341
  ...api.getTriggerProps(),
342
+ "aria-controls": api.open ? listId : void 0,
343
+ "aria-haspopup": "listbox",
233
344
  className: trigger(),
234
345
  size: "current",
235
346
  theme: "unstyled",
@@ -242,48 +353,91 @@ function Combobox({ id, name, label, size, placeholder = "Select option", disabl
242
353
  ]
243
354
  }),
244
355
  /*#__PURE__*/ jsx(Portal, {
356
+ disabled: !portalled,
245
357
  children: /*#__PURE__*/ jsx("div", {
246
358
  ...api.getPositionerProps(),
247
359
  className: positioner(),
248
360
  children: /*#__PURE__*/ jsxs("div", {
249
361
  ...api.getContentProps(),
362
+ "aria-labelledby": void 0,
250
363
  className: content(),
364
+ "data-status": state,
365
+ role: void 0,
366
+ tabIndex: void 0,
251
367
  children: [
252
- hasOptions && /*#__PURE__*/ jsx("ul", {
368
+ loading ? /*#__PURE__*/ jsxs("div", {
369
+ className: statusSlot(),
370
+ role: "status",
371
+ children: [
372
+ /*#__PURE__*/ jsx(Icon, {
373
+ icon: "token-icon-spinner",
374
+ size: "current"
375
+ }),
376
+ /*#__PURE__*/ jsx("span", {
377
+ children: loadingMessage
378
+ })
379
+ ]
380
+ }) : error ? /*#__PURE__*/ jsxs("div", {
381
+ className: statusSlot(),
382
+ role: "alert",
383
+ children: [
384
+ /*#__PURE__*/ jsx("span", {
385
+ className: "min-w-0 flex-1",
386
+ children: error
387
+ }),
388
+ onRetry && /*#__PURE__*/ jsx(Button, {
389
+ disabled: disabled || readOnly,
390
+ onClick: onRetry,
391
+ size: "sm",
392
+ variant: "secondary",
393
+ children: retryLabel
394
+ })
395
+ ]
396
+ }) : showEmptyState ? /*#__PURE__*/ jsx("div", {
397
+ className: emptyState(),
398
+ role: "status",
399
+ children: noResultsMessage.replace("{inputValue}", api.inputValue)
400
+ }) : null,
401
+ /*#__PURE__*/ jsx("div", {
253
402
  ...api.getListProps(),
403
+ "aria-busy": loading || void 0,
254
404
  className: list(),
255
- children: options.map((item)=>/*#__PURE__*/ jsxs("li", {
256
- ...api.getItemProps({
257
- item
405
+ id: listId,
406
+ children: !resultsHidden && (groups ? groups.map((group)=>{
407
+ const groupItems = group.items.filter((item)=>visibleValues.has(item.value));
408
+ if (0 === groupItems.length) return null;
409
+ return /*#__PURE__*/ createElement("div", {
410
+ ...api.getItemGroupProps({
411
+ id: group.id
258
412
  }),
259
- className: itemSlot(),
413
+ "aria-labelledby": group.label ? api.getItemGroupProps({
414
+ id: group.id
415
+ })["aria-labelledby"] : void 0,
416
+ key: group.id,
260
417
  children: [
261
- /*#__PURE__*/ jsx("span", {
262
- className: itemText(),
263
- children: item.label
264
- }),
265
- /*#__PURE__*/ jsx("span", {
266
- ...api.getItemIndicatorProps({
267
- item
418
+ group.label && /*#__PURE__*/ jsx("div", {
419
+ ...api.getItemGroupLabelProps({
420
+ htmlFor: group.id
268
421
  }),
269
- className: itemIndicator(),
270
- children: /*#__PURE__*/ jsx(Icon, {
271
- icon: "token-icon-check",
272
- size: "current"
273
- })
274
- })
422
+ className: groupLabel(),
423
+ children: group.label
424
+ }),
425
+ groupItems.map(renderOption)
275
426
  ]
276
- }, item.value))
427
+ });
428
+ }) : collection.items.map(renderOption))
277
429
  }),
278
- showEmptyState && /*#__PURE__*/ jsx("div", {
279
- className: emptyState(),
280
- children: noResultsMessage.replace("{inputValue}", api.inputValue)
430
+ footer && /*#__PURE__*/ jsx("div", {
431
+ className: footerSlot(),
432
+ "data-part": "footer",
433
+ children: footer
281
434
  })
282
435
  ]
283
436
  })
284
437
  })
285
438
  }),
286
439
  helpText && /*#__PURE__*/ jsx(StatusText, {
440
+ id: helpTextId,
287
441
  showIcon: showHelpTextIcon,
288
442
  size: size,
289
443
  status: validateStatus,
@@ -1,3 +1,16 @@
1
+ /**
2
+ * Combobox — @techsio/ui-kit molecule.
3
+ *
4
+ * @component Combobox
5
+ * @componentVersion v1.3.0
6
+ * @skill combobox-usage
7
+ * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
+ *
9
+ * Versioning is enforced at commit by scripts/check-skill-sync.mjs: @componentVersion must match
10
+ * the combobox-usage skill's component_version and a changelog entry. Bump all three together.
11
+ */
12
+ import { type Props as ZagComboboxProps } from "@zag-js/combobox";
13
+ import { type ReactNode } from "react";
1
14
  import type { VariantProps } from "tailwind-variants";
2
15
  import { type IconProps, type IconType } from "../atoms/icon.js";
3
16
  declare const comboboxVariants: import("tailwind-variants").TVReturnType<{
@@ -33,10 +46,13 @@ declare const comboboxVariants: import("tailwind-variants").TVReturnType<{
33
46
  positioner: string[];
34
47
  content: string[];
35
48
  list: string[];
49
+ groupLabel: string[];
50
+ footer: string[];
36
51
  itemText: string[];
37
52
  item: string[];
38
53
  itemIndicator: string[];
39
54
  emptyState: string[];
55
+ status: string[];
40
56
  triggerIndicator: string[];
41
57
  helper: string[];
42
58
  multiple: never[];
@@ -73,10 +89,13 @@ declare const comboboxVariants: import("tailwind-variants").TVReturnType<{
73
89
  positioner: string[];
74
90
  content: string[];
75
91
  list: string[];
92
+ groupLabel: string[];
93
+ footer: string[];
76
94
  itemText: string[];
77
95
  item: string[];
78
96
  itemIndicator: string[];
79
97
  emptyState: string[];
98
+ status: string[];
80
99
  triggerIndicator: string[];
81
100
  helper: string[];
82
101
  multiple: never[];
@@ -113,10 +132,13 @@ declare const comboboxVariants: import("tailwind-variants").TVReturnType<{
113
132
  positioner: string[];
114
133
  content: string[];
115
134
  list: string[];
135
+ groupLabel: string[];
136
+ footer: string[];
116
137
  itemText: string[];
117
138
  item: string[];
118
139
  itemIndicator: string[];
119
140
  emptyState: string[];
141
+ status: string[];
120
142
  triggerIndicator: string[];
121
143
  helper: string[];
122
144
  multiple: never[];
@@ -127,8 +149,20 @@ export type ComboboxItem<T = unknown> = {
127
149
  value: string;
128
150
  disabled?: boolean;
129
151
  data?: T;
152
+ href?: string;
130
153
  };
131
- export interface ComboboxProps<T = unknown> extends VariantProps<typeof comboboxVariants> {
154
+ export type ComboboxItemGroup<T = unknown> = {
155
+ id: string;
156
+ label?: string;
157
+ items: ComboboxItem<T>[];
158
+ };
159
+ export type ComboboxProps<T = unknown> = VariantProps<typeof comboboxVariants> & ({
160
+ items: ComboboxItem<T>[];
161
+ groups?: never;
162
+ } | {
163
+ items?: never;
164
+ groups: ComboboxItemGroup<T>[];
165
+ }) & {
132
166
  id?: string;
133
167
  name?: string;
134
168
  label?: string;
@@ -136,7 +170,6 @@ export interface ComboboxProps<T = unknown> extends VariantProps<typeof combobox
136
170
  disabled?: boolean;
137
171
  readOnly?: boolean;
138
172
  required?: boolean;
139
- items: ComboboxItem<T>[];
140
173
  value?: string | string[];
141
174
  defaultValue?: string | string[];
142
175
  inputValue?: string;
@@ -151,6 +184,8 @@ export interface ComboboxProps<T = unknown> extends VariantProps<typeof combobox
151
184
  allowCustomValue?: boolean;
152
185
  loopFocus?: boolean;
153
186
  autoFocus?: boolean;
187
+ open?: boolean;
188
+ defaultOpen?: boolean;
154
189
  triggerIcon?: IconType;
155
190
  triggerIconSize?: IconProps["size"];
156
191
  clearIcon?: IconType;
@@ -158,7 +193,18 @@ export interface ComboboxProps<T = unknown> extends VariantProps<typeof combobox
158
193
  onInputValueChange?: (value: string) => void;
159
194
  onOpenChange?: (open: boolean) => void;
160
195
  inputBehavior?: "autohighlight" | "autocomplete" | "none";
161
- }
162
- export declare function Combobox<T = unknown>({ id, name, label, size, placeholder, disabled, readOnly, required, items, value, defaultValue, inputValue, multiple, validateStatus, helpText, showHelpTextIcon, noResultsMessage, clearable, selectionBehavior, closeOnSelect, allowCustomValue, loopFocus, autoFocus, triggerIcon, triggerIconSize, clearIcon, inputBehavior, onChange, onInputValueChange, onOpenChange, }: ComboboxProps<T>): import("react/jsx-runtime").JSX.Element;
196
+ filterBehavior?: "local" | "external";
197
+ loading?: boolean;
198
+ loadingMessage?: string;
199
+ error?: ReactNode;
200
+ retryLabel?: string;
201
+ onRetry?: () => void;
202
+ renderItem?: (item: ComboboxItem<T>) => ReactNode;
203
+ mode?: "selection" | "navigation";
204
+ navigate?: ZagComboboxProps["navigate"];
205
+ footer?: ReactNode;
206
+ portalled?: boolean;
207
+ };
208
+ export declare function Combobox<T = unknown>({ id, name, label, size, placeholder, disabled, readOnly, required, items, groups, value, defaultValue, inputValue, multiple, validateStatus, helpText, showHelpTextIcon, noResultsMessage, clearable, selectionBehavior, closeOnSelect, allowCustomValue, loopFocus, autoFocus, open, defaultOpen, triggerIcon, triggerIconSize, clearIcon, inputBehavior, filterBehavior, loading, loadingMessage, error, retryLabel, onRetry, renderItem, onChange, onInputValueChange, onOpenChange, mode, navigate, footer, portalled, }: ComboboxProps<T>): import("react/jsx-runtime").JSX.Element;
163
209
  export {};
164
210
  //# sourceMappingURL=combobox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../src/molecules/combobox.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../src/molecules/combobox.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * FacetFilterPanel - @techsio/ui-kit template.
3
+ *
4
+ * @component FacetFilterPanel
5
+ * @componentVersion v1.0.1
6
+ * @skill facet-filter-panel-usage
7
+ * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
+ */
9
+ import type { ReactNode } from "react";
10
+ export type FacetFilterOption = {
11
+ value: string;
12
+ label: ReactNode;
13
+ count?: number;
14
+ disabled?: boolean;
15
+ };
16
+ type FacetFilterGroupBase = {
17
+ id: string;
18
+ disabled?: boolean;
19
+ };
20
+ export type FacetFilterOptionsGroup = FacetFilterGroupBase & {
21
+ type: "options";
22
+ label: ReactNode;
23
+ options: readonly FacetFilterOption[];
24
+ collapseAfter?: number;
25
+ emptyLabel?: ReactNode;
26
+ };
27
+ export type FacetFilterRangeGroup = FacetFilterGroupBase & {
28
+ type: "range";
29
+ label: string;
30
+ min: number;
31
+ max: number;
32
+ step?: number;
33
+ minStepsBetweenThumbs?: number;
34
+ value: readonly [number, number];
35
+ formatValue?: (value: number) => string;
36
+ formatRangeText?: (values: number[]) => string;
37
+ };
38
+ export type FacetFilterGroup = FacetFilterOptionsGroup | FacetFilterRangeGroup;
39
+ export type FacetFilterActiveItem = {
40
+ id: string;
41
+ label: ReactNode;
42
+ removeLabel: string;
43
+ };
44
+ export type FacetFilterOptionChangeDetails = {
45
+ groupId: string;
46
+ value: string;
47
+ checked: boolean;
48
+ };
49
+ export type FacetFilterRangeChangeDetails = {
50
+ groupId: string;
51
+ value: [number, number];
52
+ };
53
+ export type FacetFilterPanelProps = {
54
+ title: ReactNode;
55
+ groups: readonly FacetFilterGroup[];
56
+ selectedValues?: Readonly<Record<string, readonly string[]>>;
57
+ activeFilters?: readonly FacetFilterActiveItem[];
58
+ presentation?: "inline" | "drawer";
59
+ disabled?: boolean;
60
+ pending?: boolean;
61
+ pendingLabel?: ReactNode;
62
+ activeFiltersLabel?: ReactNode;
63
+ resetLabel?: ReactNode;
64
+ showMoreLabel?: (hiddenCount: number) => ReactNode;
65
+ showLessLabel?: ReactNode;
66
+ expandedGroups?: string[];
67
+ defaultExpandedGroups?: string[];
68
+ onExpandedGroupsChange?: (groupIds: string[]) => void;
69
+ drawerTriggerLabel?: ReactNode;
70
+ drawerPlacement?: "left" | "right";
71
+ drawerSize?: "xs" | "sm" | "md" | "lg" | "xl" | "full";
72
+ drawerOpen?: boolean;
73
+ defaultDrawerOpen?: boolean;
74
+ onDrawerOpenChange?: (open: boolean) => void;
75
+ className?: string;
76
+ onOptionChange?: (details: FacetFilterOptionChangeDetails) => void;
77
+ onRangeChange?: (details: FacetFilterRangeChangeDetails) => void;
78
+ onRangeChangeEnd?: (details: FacetFilterRangeChangeDetails) => void;
79
+ onRemoveFilter?: (id: string) => void;
80
+ onReset?: () => void;
81
+ };
82
+ export type FacetFilterActiveFiltersProps = {
83
+ items: readonly FacetFilterActiveItem[];
84
+ label?: ReactNode;
85
+ resetLabel?: ReactNode;
86
+ disabled?: boolean;
87
+ className?: string;
88
+ onRemove?: (id: string) => void;
89
+ onReset?: () => void;
90
+ };
91
+ export declare function FacetFilterPanel({ presentation, drawerTriggerLabel, drawerPlacement, drawerSize, drawerOpen, defaultDrawerOpen, onDrawerOpenChange, className, ...props }: FacetFilterPanelProps): import("react/jsx-runtime").JSX.Element;
92
+ export declare namespace FacetFilterPanel {
93
+ var ActiveFilters: ({ items, label, resetLabel, disabled, className, onRemove, onReset, }: FacetFilterActiveFiltersProps) => import("react/jsx-runtime").JSX.Element | null;
94
+ }
95
+ export {};
96
+ //# sourceMappingURL=facet-filter-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facet-filter-panel.d.ts","sourceRoot":"","sources":["../../../src/templates/facet-filter-panel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * SearchSuggestions - @techsio/ui-kit template.
3
+ *
4
+ * @component SearchSuggestions
5
+ * @componentVersion v1.0.0
6
+ * @skill search-suggestions-usage
7
+ * @changelog libs/ui/stories/changelog/changelog.stories.tsx
8
+ */
9
+ import type { ReactNode } from "react";
10
+ import { type ComboboxItem, type ComboboxItemGroup, type ComboboxProps } from "../molecules/combobox.js";
11
+ export type SearchSuggestionItem<T = unknown> = ComboboxItem<T> & {
12
+ href: string;
13
+ };
14
+ export type SearchSuggestionGroup<T = unknown> = Omit<ComboboxItemGroup<T>, "items"> & {
15
+ items: SearchSuggestionItem<T>[];
16
+ };
17
+ export type SearchSuggestionsProps<T = unknown> = Omit<ComboboxProps<T>, "items" | "groups" | "renderItem" | "footer" | "mode" | "multiple" | "value" | "defaultValue" | "onChange" | "name" | "selectionBehavior" | "allowCustomValue"> & {
18
+ groups: SearchSuggestionGroup<T>[];
19
+ resultSlot?: ComboboxProps<T>["renderItem"];
20
+ allResultsLink?: ReactNode;
21
+ };
22
+ export declare function SearchSuggestions<T = unknown>({ resultSlot, allResultsLink, filterBehavior, inputBehavior, portalled, ...props }: SearchSuggestionsProps<T>): import("react/jsx-runtime").JSX.Element;
23
+ //# sourceMappingURL=search-suggestions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-suggestions.d.ts","sourceRoot":"","sources":["../../../src/templates/search-suggestions.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,MAAM,oBAAoB,CAAC,CAAC,GAAG,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG;IAChE,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,qBAAqB,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CACnD,iBAAiB,CAAC,CAAC,CAAC,EACpB,OAAO,CACR,GAAG;IACF,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,OAAO,IAAI,IAAI,CACpD,aAAa,CAAC,CAAC,CAAC,EACd,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,UAAU,GACV,OAAO,GACP,cAAc,GACd,UAAU,GACV,MAAM,GACN,mBAAmB,GACnB,kBAAkB,CACrB,GAAG;IACF,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAA;IAClC,UAAU,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IAC3C,cAAc,CAAC,EAAE,SAAS,CAAA;CAC3B,CAAA;AAED,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,EAC7C,UAAU,EACV,cAAc,EACd,cAA2B,EAC3B,aAAsB,EACtB,SAAiB,EACjB,GAAG,KAAK,EACT,EAAE,sBAAsB,CAAC,CAAC,CAAC,2CAY3B"}
@@ -27,6 +27,11 @@ export declare const THEMES: {
27
27
  readonly modes: ["light"];
28
28
  readonly attr: "business";
29
29
  };
30
+ readonly akros: {
31
+ readonly label: "Akros";
32
+ readonly modes: ["light"];
33
+ readonly attr: "akros";
34
+ };
30
35
  };
31
36
  export type BrandKey = keyof typeof THEMES;
32
37
  export declare const DEFAULT_BRAND: BrandKey;
@@ -1 +1 @@
1
- {"version":3,"file":"theme-config.d.ts","sourceRoot":"","sources":["../../../src/theme/theme-config.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;AAExC,yEAAyE;AACzE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;CAI6B,CAAA;AAEhD,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,MAAM,CAAA;AAE1C,eAAO,MAAM,aAAa,EAAE,QAAiB,CAAA;AAC7C,eAAO,MAAM,YAAY,EAAE,WAAsB,CAAA;AAEjD,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,aAAa,CAAA;AAC3C,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAEzC,wBAAgB,SAAS,IAAI,QAAQ,EAAE,CAEtC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,CAEnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAE3D;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAExD;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,EAAE,CAElE"}
1
+ {"version":3,"file":"theme-config.d.ts","sourceRoot":"","sources":["../../../src/theme/theme-config.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,CAAA;AAExC,yEAAyE;AACzE,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE9C,MAAM,MAAM,WAAW,GAAG;IACxB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;CAK6B,CAAA;AAEhD,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,MAAM,CAAA;AAE1C,eAAO,MAAM,aAAa,EAAE,QAAiB,CAAA;AAC7C,eAAO,MAAM,YAAY,EAAE,WAAsB,CAAA;AAEjD,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB,aAAa,CAAA;AAC3C,eAAO,MAAM,gBAAgB,YAAY,CAAA;AAEzC,wBAAgB,SAAS,IAAI,QAAQ,EAAE,CAEtC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,CAEnD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,QAAQ,CAE3D;AAED,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAE3D;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAExD;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,QAAQ,GAAG,WAAW,EAAE,CAElE"}