@pipe0/react 0.0.2
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.
- package/CHANGELOG.md +119 -0
- package/README.md +172 -0
- package/dist/components/compound/pipe-catalog/active-filters.d.mts +26 -0
- package/dist/components/compound/pipe-catalog/active-filters.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/active-filters.mjs +47 -0
- package/dist/components/compound/pipe-catalog/active-filters.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/card.d.mts +30 -0
- package/dist/components/compound/pipe-catalog/card.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/card.mjs +77 -0
- package/dist/components/compound/pipe-catalog/card.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/category-filter.d.mts +30 -0
- package/dist/components/compound/pipe-catalog/category-filter.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/category-filter.mjs +56 -0
- package/dist/components/compound/pipe-catalog/category-filter.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/column-filter.d.mts +40 -0
- package/dist/components/compound/pipe-catalog/column-filter.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/column-filter.mjs +66 -0
- package/dist/components/compound/pipe-catalog/column-filter.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/column-filters.d.mts +16 -0
- package/dist/components/compound/pipe-catalog/column-filters.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/column-filters.mjs +21 -0
- package/dist/components/compound/pipe-catalog/column-filters.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/empty.d.mts +22 -0
- package/dist/components/compound/pipe-catalog/empty.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/empty.mjs +31 -0
- package/dist/components/compound/pipe-catalog/empty.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/index.d.mts +13 -0
- package/dist/components/compound/pipe-catalog/index.mjs +15 -0
- package/dist/components/compound/pipe-catalog/input-field-filter.d.mts +22 -0
- package/dist/components/compound/pipe-catalog/input-field-filter.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/input-field-filter.mjs +22 -0
- package/dist/components/compound/pipe-catalog/input-field-filter.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/list.d.mts +34 -0
- package/dist/components/compound/pipe-catalog/list.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/list.mjs +29 -0
- package/dist/components/compound/pipe-catalog/list.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/output-field-filter.d.mts +22 -0
- package/dist/components/compound/pipe-catalog/output-field-filter.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/output-field-filter.mjs +22 -0
- package/dist/components/compound/pipe-catalog/output-field-filter.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/provider-filter.d.mts +22 -0
- package/dist/components/compound/pipe-catalog/provider-filter.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/provider-filter.mjs +29 -0
- package/dist/components/compound/pipe-catalog/provider-filter.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/root.d.mts +47 -0
- package/dist/components/compound/pipe-catalog/root.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/root.mjs +85 -0
- package/dist/components/compound/pipe-catalog/root.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/search-filter.d.mts +24 -0
- package/dist/components/compound/pipe-catalog/search-filter.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/search-filter.mjs +46 -0
- package/dist/components/compound/pipe-catalog/search-filter.mjs.map +1 -0
- package/dist/components/compound/pipe-catalog/tag-filter.d.mts +22 -0
- package/dist/components/compound/pipe-catalog/tag-filter.d.mts.map +1 -0
- package/dist/components/compound/pipe-catalog/tag-filter.mjs +22 -0
- package/dist/components/compound/pipe-catalog/tag-filter.mjs.map +1 -0
- package/dist/components/compound/pipe-form/content.d.mts +18 -0
- package/dist/components/compound/pipe-form/content.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/content.mjs +45 -0
- package/dist/components/compound/pipe-form/content.mjs.map +1 -0
- package/dist/components/compound/pipe-form/field.d.mts +17 -0
- package/dist/components/compound/pipe-form/field.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/field.mjs +21 -0
- package/dist/components/compound/pipe-form/field.mjs.map +1 -0
- package/dist/components/compound/pipe-form/footer.d.mts +14 -0
- package/dist/components/compound/pipe-form/footer.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/footer.mjs +14 -0
- package/dist/components/compound/pipe-form/footer.mjs.map +1 -0
- package/dist/components/compound/pipe-form/group.d.mts +13 -0
- package/dist/components/compound/pipe-form/group.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/group.mjs +17 -0
- package/dist/components/compound/pipe-form/group.mjs.map +1 -0
- package/dist/components/compound/pipe-form/header.d.mts +14 -0
- package/dist/components/compound/pipe-form/header.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/header.mjs +14 -0
- package/dist/components/compound/pipe-form/header.mjs.map +1 -0
- package/dist/components/compound/pipe-form/index.d.mts +9 -0
- package/dist/components/compound/pipe-form/index.mjs +11 -0
- package/dist/components/compound/pipe-form/root.d.mts +56 -0
- package/dist/components/compound/pipe-form/root.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/root.mjs +98 -0
- package/dist/components/compound/pipe-form/root.mjs.map +1 -0
- package/dist/components/compound/pipe-form/section.d.mts +13 -0
- package/dist/components/compound/pipe-form/section.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/section.mjs +17 -0
- package/dist/components/compound/pipe-form/section.mjs.map +1 -0
- package/dist/components/compound/pipe-form/submit-button.d.mts +9 -0
- package/dist/components/compound/pipe-form/submit-button.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/submit-button.mjs +17 -0
- package/dist/components/compound/pipe-form/submit-button.mjs.map +1 -0
- package/dist/components/compound/pipe-form/title.d.mts +16 -0
- package/dist/components/compound/pipe-form/title.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/title.mjs +14 -0
- package/dist/components/compound/pipe-form/title.mjs.map +1 -0
- package/dist/components/compound/search-catalog/active-filters.d.mts +26 -0
- package/dist/components/compound/search-catalog/active-filters.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/active-filters.mjs +46 -0
- package/dist/components/compound/search-catalog/active-filters.mjs.map +1 -0
- package/dist/components/compound/search-catalog/card.d.mts +30 -0
- package/dist/components/compound/search-catalog/card.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/card.mjs +77 -0
- package/dist/components/compound/search-catalog/card.mjs.map +1 -0
- package/dist/components/compound/search-catalog/category-filter.d.mts +29 -0
- package/dist/components/compound/search-catalog/category-filter.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/category-filter.mjs +51 -0
- package/dist/components/compound/search-catalog/category-filter.mjs.map +1 -0
- package/dist/components/compound/search-catalog/column-filter.d.mts +40 -0
- package/dist/components/compound/search-catalog/column-filter.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/column-filter.mjs +63 -0
- package/dist/components/compound/search-catalog/column-filter.mjs.map +1 -0
- package/dist/components/compound/search-catalog/column-filters.d.mts +15 -0
- package/dist/components/compound/search-catalog/column-filters.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/column-filters.mjs +16 -0
- package/dist/components/compound/search-catalog/column-filters.mjs.map +1 -0
- package/dist/components/compound/search-catalog/empty.d.mts +22 -0
- package/dist/components/compound/search-catalog/empty.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/empty.mjs +31 -0
- package/dist/components/compound/search-catalog/empty.mjs.map +1 -0
- package/dist/components/compound/search-catalog/index.d.mts +12 -0
- package/dist/components/compound/search-catalog/index.mjs +14 -0
- package/dist/components/compound/search-catalog/list.d.mts +19 -0
- package/dist/components/compound/search-catalog/list.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/list.mjs +29 -0
- package/dist/components/compound/search-catalog/list.mjs.map +1 -0
- package/dist/components/compound/search-catalog/output-field-filter.d.mts +22 -0
- package/dist/components/compound/search-catalog/output-field-filter.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/output-field-filter.mjs +22 -0
- package/dist/components/compound/search-catalog/output-field-filter.mjs.map +1 -0
- package/dist/components/compound/search-catalog/provider-filter.d.mts +22 -0
- package/dist/components/compound/search-catalog/provider-filter.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/provider-filter.mjs +29 -0
- package/dist/components/compound/search-catalog/provider-filter.mjs.map +1 -0
- package/dist/components/compound/search-catalog/root.d.mts +33 -0
- package/dist/components/compound/search-catalog/root.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/root.mjs +74 -0
- package/dist/components/compound/search-catalog/root.mjs.map +1 -0
- package/dist/components/compound/search-catalog/search-filter.d.mts +24 -0
- package/dist/components/compound/search-catalog/search-filter.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/search-filter.mjs +46 -0
- package/dist/components/compound/search-catalog/search-filter.mjs.map +1 -0
- package/dist/components/compound/search-catalog/tag-filter.d.mts +22 -0
- package/dist/components/compound/search-catalog/tag-filter.d.mts.map +1 -0
- package/dist/components/compound/search-catalog/tag-filter.mjs +22 -0
- package/dist/components/compound/search-catalog/tag-filter.mjs.map +1 -0
- package/dist/components/compound/search-form/content.d.mts +18 -0
- package/dist/components/compound/search-form/content.d.mts.map +1 -0
- package/dist/components/compound/search-form/content.mjs +45 -0
- package/dist/components/compound/search-form/content.mjs.map +1 -0
- package/dist/components/compound/search-form/field.d.mts +17 -0
- package/dist/components/compound/search-form/field.d.mts.map +1 -0
- package/dist/components/compound/search-form/field.mjs +21 -0
- package/dist/components/compound/search-form/field.mjs.map +1 -0
- package/dist/components/compound/search-form/footer.d.mts +14 -0
- package/dist/components/compound/search-form/footer.d.mts.map +1 -0
- package/dist/components/compound/search-form/footer.mjs +14 -0
- package/dist/components/compound/search-form/footer.mjs.map +1 -0
- package/dist/components/compound/search-form/group.d.mts +13 -0
- package/dist/components/compound/search-form/group.d.mts.map +1 -0
- package/dist/components/compound/search-form/group.mjs +17 -0
- package/dist/components/compound/search-form/group.mjs.map +1 -0
- package/dist/components/compound/search-form/header.d.mts +14 -0
- package/dist/components/compound/search-form/header.d.mts.map +1 -0
- package/dist/components/compound/search-form/header.mjs +14 -0
- package/dist/components/compound/search-form/header.mjs.map +1 -0
- package/dist/components/compound/search-form/index.d.mts +9 -0
- package/dist/components/compound/search-form/index.mjs +11 -0
- package/dist/components/compound/search-form/root.d.mts +45 -0
- package/dist/components/compound/search-form/root.d.mts.map +1 -0
- package/dist/components/compound/search-form/root.mjs +90 -0
- package/dist/components/compound/search-form/root.mjs.map +1 -0
- package/dist/components/compound/search-form/section.d.mts +13 -0
- package/dist/components/compound/search-form/section.d.mts.map +1 -0
- package/dist/components/compound/search-form/section.mjs +17 -0
- package/dist/components/compound/search-form/section.mjs.map +1 -0
- package/dist/components/compound/search-form/submit-button.d.mts +9 -0
- package/dist/components/compound/search-form/submit-button.d.mts.map +1 -0
- package/dist/components/compound/search-form/submit-button.mjs +17 -0
- package/dist/components/compound/search-form/submit-button.mjs.map +1 -0
- package/dist/components/compound/search-form/title.d.mts +16 -0
- package/dist/components/compound/search-form/title.d.mts.map +1 -0
- package/dist/components/compound/search-form/title.mjs +14 -0
- package/dist/components/compound/search-form/title.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/active-filters.d.mts +26 -0
- package/dist/components/compound/searches-catalog/active-filters.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/active-filters.mjs +46 -0
- package/dist/components/compound/searches-catalog/active-filters.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/card.d.mts +22 -0
- package/dist/components/compound/searches-catalog/card.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/card.mjs +70 -0
- package/dist/components/compound/searches-catalog/card.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/category-filter.d.mts +29 -0
- package/dist/components/compound/searches-catalog/category-filter.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/category-filter.mjs +51 -0
- package/dist/components/compound/searches-catalog/category-filter.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/column-filter.d.mts +31 -0
- package/dist/components/compound/searches-catalog/column-filter.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/column-filter.mjs +58 -0
- package/dist/components/compound/searches-catalog/column-filter.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/column-filters.d.mts +15 -0
- package/dist/components/compound/searches-catalog/column-filters.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/column-filters.mjs +16 -0
- package/dist/components/compound/searches-catalog/column-filters.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/empty.d.mts +22 -0
- package/dist/components/compound/searches-catalog/empty.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/empty.mjs +31 -0
- package/dist/components/compound/searches-catalog/empty.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/index.d.mts +12 -0
- package/dist/components/compound/searches-catalog/index.mjs +14 -0
- package/dist/components/compound/searches-catalog/list.d.mts +19 -0
- package/dist/components/compound/searches-catalog/list.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/list.mjs +29 -0
- package/dist/components/compound/searches-catalog/list.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/output-field-filter.d.mts +22 -0
- package/dist/components/compound/searches-catalog/output-field-filter.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/output-field-filter.mjs +22 -0
- package/dist/components/compound/searches-catalog/output-field-filter.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/provider-filter.d.mts +22 -0
- package/dist/components/compound/searches-catalog/provider-filter.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/provider-filter.mjs +29 -0
- package/dist/components/compound/searches-catalog/provider-filter.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/root.d.mts +33 -0
- package/dist/components/compound/searches-catalog/root.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/root.mjs +74 -0
- package/dist/components/compound/searches-catalog/root.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/search-filter.d.mts +24 -0
- package/dist/components/compound/searches-catalog/search-filter.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/search-filter.mjs +46 -0
- package/dist/components/compound/searches-catalog/search-filter.mjs.map +1 -0
- package/dist/components/compound/searches-catalog/tag-filter.d.mts +22 -0
- package/dist/components/compound/searches-catalog/tag-filter.d.mts.map +1 -0
- package/dist/components/compound/searches-catalog/tag-filter.mjs +22 -0
- package/dist/components/compound/searches-catalog/tag-filter.mjs.map +1 -0
- package/dist/components/defaults/adapters/async-include-exclude-select-input.mjs +32 -0
- package/dist/components/defaults/adapters/async-include-exclude-select-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/async-multi-select-input.mjs +26 -0
- package/dist/components/defaults/adapters/async-multi-select-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/boolean-input.mjs +82 -0
- package/dist/components/defaults/adapters/boolean-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/connector-input.mjs +94 -0
- package/dist/components/defaults/adapters/connector-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/context-select-input.mjs +74 -0
- package/dist/components/defaults/adapters/context-select-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/cursor-pagination-input.mjs +29 -0
- package/dist/components/defaults/adapters/cursor-pagination-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/date-range-input.mjs +53 -0
- package/dist/components/defaults/adapters/date-range-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/exact-range-input.mjs +75 -0
- package/dist/components/defaults/adapters/exact-range-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/fields-select-input.mjs +25 -0
- package/dist/components/defaults/adapters/fields-select-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/include-exclude-input.mjs +33 -0
- package/dist/components/defaults/adapters/include-exclude-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/include-exclude-select-input.mjs +36 -0
- package/dist/components/defaults/adapters/include-exclude-select-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/index.d.mts +11 -0
- package/dist/components/defaults/adapters/index.d.mts.map +1 -0
- package/dist/components/defaults/adapters/index.mjs +73 -0
- package/dist/components/defaults/adapters/index.mjs.map +1 -0
- package/dist/components/defaults/adapters/int-input.mjs +16 -0
- package/dist/components/defaults/adapters/int-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/json-extraction-input.mjs +333 -0
- package/dist/components/defaults/adapters/json-extraction-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/json-schema-input.mjs +30 -0
- package/dist/components/defaults/adapters/json-schema-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/key-value-list-input.mjs +100 -0
- package/dist/components/defaults/adapters/key-value-list-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/min-max-int-input.mjs +65 -0
- package/dist/components/defaults/adapters/min-max-int-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/multi-create-input.mjs +32 -0
- package/dist/components/defaults/adapters/multi-create-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/multi-select-input.mjs +26 -0
- package/dist/components/defaults/adapters/multi-select-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/number-input.mjs +15 -0
- package/dist/components/defaults/adapters/number-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/ordered-multi-create-input.mjs +43 -0
- package/dist/components/defaults/adapters/ordered-multi-create-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/output-field-input.mjs +37 -0
- package/dist/components/defaults/adapters/output-field-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/pipes-trigger-input.mjs +381 -0
- package/dist/components/defaults/adapters/pipes-trigger-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/prompt-input.mjs +208 -0
- package/dist/components/defaults/adapters/prompt-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/providers-input.mjs +23 -0
- package/dist/components/defaults/adapters/providers-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/range-input.mjs +61 -0
- package/dist/components/defaults/adapters/range-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/select-input.mjs +54 -0
- package/dist/components/defaults/adapters/select-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/tagged-text-input.mjs +154 -0
- package/dist/components/defaults/adapters/tagged-text-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/template-input.mjs +34 -0
- package/dist/components/defaults/adapters/template-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/text-input.mjs +18 -0
- package/dist/components/defaults/adapters/text-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/textarea-input.mjs +17 -0
- package/dist/components/defaults/adapters/textarea-input.mjs.map +1 -0
- package/dist/components/defaults/catalog/active-filter-pill.mjs +30 -0
- package/dist/components/defaults/catalog/active-filter-pill.mjs.map +1 -0
- package/dist/components/defaults/catalog/card-derived.d.mts +98 -0
- package/dist/components/defaults/catalog/card-derived.d.mts.map +1 -0
- package/dist/components/defaults/catalog/card-derived.mjs +172 -0
- package/dist/components/defaults/catalog/card-derived.mjs.map +1 -0
- package/dist/components/defaults/catalog/card-primitives.d.mts +81 -0
- package/dist/components/defaults/catalog/card-primitives.d.mts.map +1 -0
- package/dist/components/defaults/catalog/card-primitives.mjs +108 -0
- package/dist/components/defaults/catalog/card-primitives.mjs.map +1 -0
- package/dist/components/defaults/catalog/category-filter.d.mts +13 -0
- package/dist/components/defaults/catalog/category-filter.d.mts.map +1 -0
- package/dist/components/defaults/catalog/category-filter.mjs +28 -0
- package/dist/components/defaults/catalog/category-filter.mjs.map +1 -0
- package/dist/components/defaults/catalog/category-section.d.mts +39 -0
- package/dist/components/defaults/catalog/category-section.d.mts.map +1 -0
- package/dist/components/defaults/catalog/category-section.mjs +59 -0
- package/dist/components/defaults/catalog/category-section.mjs.map +1 -0
- package/dist/components/defaults/catalog/empty-state.mjs +20 -0
- package/dist/components/defaults/catalog/empty-state.mjs.map +1 -0
- package/dist/components/defaults/catalog/filter-select.d.mts +13 -0
- package/dist/components/defaults/catalog/filter-select.d.mts.map +1 -0
- package/dist/components/defaults/catalog/filter-select.mjs +45 -0
- package/dist/components/defaults/catalog/filter-select.mjs.map +1 -0
- package/dist/components/defaults/catalog/layout.mjs +53 -0
- package/dist/components/defaults/catalog/layout.mjs.map +1 -0
- package/dist/components/defaults/catalog/provider-avatars.d.mts +37 -0
- package/dist/components/defaults/catalog/provider-avatars.d.mts.map +1 -0
- package/dist/components/defaults/catalog/provider-avatars.mjs +98 -0
- package/dist/components/defaults/catalog/provider-avatars.mjs.map +1 -0
- package/dist/components/defaults/field-section-enumeration.mjs +32 -0
- package/dist/components/defaults/field-section-enumeration.mjs.map +1 -0
- package/dist/components/defaults/layout/field-wrapper.d.mts +13 -0
- package/dist/components/defaults/layout/field-wrapper.d.mts.map +1 -0
- package/dist/components/defaults/layout/field-wrapper.mjs +67 -0
- package/dist/components/defaults/layout/field-wrapper.mjs.map +1 -0
- package/dist/components/defaults/layout/form.mjs +21 -0
- package/dist/components/defaults/layout/form.mjs.map +1 -0
- package/dist/components/defaults/layout/group.d.mts +16 -0
- package/dist/components/defaults/layout/group.d.mts.map +1 -0
- package/dist/components/defaults/layout/group.mjs +87 -0
- package/dist/components/defaults/layout/group.mjs.map +1 -0
- package/dist/components/defaults/layout/section.d.mts +14 -0
- package/dist/components/defaults/layout/section.d.mts.map +1 -0
- package/dist/components/defaults/layout/section.mjs +39 -0
- package/dist/components/defaults/layout/section.mjs.map +1 -0
- package/dist/components/defaults/layout/submit-button.d.mts +9 -0
- package/dist/components/defaults/layout/submit-button.d.mts.map +1 -0
- package/dist/components/defaults/layout/submit-button.mjs +23 -0
- package/dist/components/defaults/layout/submit-button.mjs.map +1 -0
- package/dist/components/defaults/toggle-advanced-button.mjs +29 -0
- package/dist/components/defaults/toggle-advanced-button.mjs.map +1 -0
- package/dist/components/field-renderer.d.mts +14 -0
- package/dist/components/field-renderer.d.mts.map +1 -0
- package/dist/components/field-renderer.mjs +21 -0
- package/dist/components/field-renderer.mjs.map +1 -0
- package/dist/components/hover-info.mjs +30 -0
- package/dist/components/hover-info.mjs.map +1 -0
- package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs +319 -0
- package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs.map +1 -0
- package/dist/components/internal/LiquidEditor/LiquidEditor.mjs +208 -0
- package/dist/components/internal/LiquidEditor/LiquidEditor.mjs.map +1 -0
- package/dist/components/internal/LiquidEditor/UnifiedReferencePicker.mjs +240 -0
- package/dist/components/internal/LiquidEditor/UnifiedReferencePicker.mjs.map +1 -0
- package/dist/components/internal/combobox/include-exclude-combobox.mjs +368 -0
- package/dist/components/internal/combobox/include-exclude-combobox.mjs.map +1 -0
- package/dist/components/internal/combobox/suggest-combobox.mjs +294 -0
- package/dist/components/internal/combobox/suggest-combobox.mjs.map +1 -0
- package/dist/components/internal/field-legend.mjs +37 -0
- package/dist/components/internal/field-legend.mjs.map +1 -0
- package/dist/components/internal/form-level-errors.mjs +71 -0
- package/dist/components/internal/form-level-errors.mjs.map +1 -0
- package/dist/components/internal/icons.mjs +131 -0
- package/dist/components/internal/icons.mjs.map +1 -0
- package/dist/components/internal/multi-select-popover-trigger.mjs +26 -0
- package/dist/components/internal/multi-select-popover-trigger.mjs.map +1 -0
- package/dist/components/internal/schema-editor/SchemaEditor.mjs +468 -0
- package/dist/components/internal/schema-editor/SchemaEditor.mjs.map +1 -0
- package/dist/components/internal/schema-editor/generate-schema-rows.mjs +374 -0
- package/dist/components/internal/schema-editor/generate-schema-rows.mjs.map +1 -0
- package/dist/components/internal/schema-editor/schema-editor-context.mjs +32 -0
- package/dist/components/internal/schema-editor/schema-editor-context.mjs.map +1 -0
- package/dist/components/internal/schema-editor/schema-utils.mjs +249 -0
- package/dist/components/internal/schema-editor/schema-utils.mjs.map +1 -0
- package/dist/components/internal/suggestion-menu/suggestion-menu-utils.mjs +12 -0
- package/dist/components/internal/suggestion-menu/suggestion-menu-utils.mjs.map +1 -0
- package/dist/components/internal/suggestion-menu/suggestion-menu.mjs +151 -0
- package/dist/components/internal/suggestion-menu/suggestion-menu.mjs.map +1 -0
- package/dist/components/internal/tag-chip-decoration.mjs +180 -0
- package/dist/components/internal/tag-chip-decoration.mjs.map +1 -0
- package/dist/components/rich-text.mjs +42 -0
- package/dist/components/rich-text.mjs.map +1 -0
- package/dist/components/ui/badge.mjs +32 -0
- package/dist/components/ui/badge.mjs.map +1 -0
- package/dist/components/ui/button.d.mts +19 -0
- package/dist/components/ui/button.d.mts.map +1 -0
- package/dist/components/ui/button.mjs +47 -0
- package/dist/components/ui/button.mjs.map +1 -0
- package/dist/components/ui/combobox.mjs +103 -0
- package/dist/components/ui/combobox.mjs.map +1 -0
- package/dist/components/ui/input-group.mjs +30 -0
- package/dist/components/ui/input-group.mjs.map +1 -0
- package/dist/components/ui/input.mjs +17 -0
- package/dist/components/ui/input.mjs.map +1 -0
- package/dist/components/ui/label.mjs +17 -0
- package/dist/components/ui/label.mjs.map +1 -0
- package/dist/components/ui/popover.mjs +40 -0
- package/dist/components/ui/popover.mjs.map +1 -0
- package/dist/components/ui/select.mjs +92 -0
- package/dist/components/ui/select.mjs.map +1 -0
- package/dist/components/ui/switch.mjs +21 -0
- package/dist/components/ui/switch.mjs.map +1 -0
- package/dist/components/ui/table.mjs +56 -0
- package/dist/components/ui/table.mjs.map +1 -0
- package/dist/components/ui/textarea.mjs +15 -0
- package/dist/components/ui/textarea.mjs.map +1 -0
- package/dist/components/ui/tooltip.mjs +48 -0
- package/dist/components/ui/tooltip.mjs.map +1 -0
- package/dist/context/catalog-card-context.mjs +31 -0
- package/dist/context/catalog-card-context.mjs.map +1 -0
- package/dist/context/catalog-config-context.d.mts +43 -0
- package/dist/context/catalog-config-context.d.mts.map +1 -0
- package/dist/context/catalog-config-context.mjs +48 -0
- package/dist/context/catalog-config-context.mjs.map +1 -0
- package/dist/context/form-context.mjs +11 -0
- package/dist/context/form-context.mjs.map +1 -0
- package/dist/context/form-customization-context.d.mts +71 -0
- package/dist/context/form-customization-context.d.mts.map +1 -0
- package/dist/context/form-customization-context.mjs +114 -0
- package/dist/context/form-customization-context.mjs.map +1 -0
- package/dist/context/form-provider.d.mts +41 -0
- package/dist/context/form-provider.d.mts.map +1 -0
- package/dist/context/form-provider.mjs +53 -0
- package/dist/context/form-provider.mjs.map +1 -0
- package/dist/context/pipe-catalog-card-context.d.mts +17 -0
- package/dist/context/pipe-catalog-card-context.d.mts.map +1 -0
- package/dist/context/pipe-catalog-card-context.mjs +13 -0
- package/dist/context/pipe-catalog-card-context.mjs.map +1 -0
- package/dist/context/pipe-catalog-context.d.mts +26 -0
- package/dist/context/pipe-catalog-context.d.mts.map +1 -0
- package/dist/context/pipe-catalog-context.mjs +13 -0
- package/dist/context/pipe-catalog-context.mjs.map +1 -0
- package/dist/context/pipe-form-context.d.mts +25 -0
- package/dist/context/pipe-form-context.d.mts.map +1 -0
- package/dist/context/pipe-form-context.mjs +13 -0
- package/dist/context/pipe-form-context.mjs.map +1 -0
- package/dist/context/portal-container-context.d.mts +5 -0
- package/dist/context/portal-container-context.d.mts.map +1 -0
- package/dist/context/portal-container-context.mjs +15 -0
- package/dist/context/portal-container-context.mjs.map +1 -0
- package/dist/context/search-catalog-card-context.d.mts +16 -0
- package/dist/context/search-catalog-card-context.d.mts.map +1 -0
- package/dist/context/search-catalog-card-context.mjs +13 -0
- package/dist/context/search-catalog-card-context.mjs.map +1 -0
- package/dist/context/search-catalog-context.d.mts +20 -0
- package/dist/context/search-catalog-context.d.mts.map +1 -0
- package/dist/context/search-catalog-context.mjs +13 -0
- package/dist/context/search-catalog-context.mjs.map +1 -0
- package/dist/context/search-form-context.d.mts +25 -0
- package/dist/context/search-form-context.d.mts.map +1 -0
- package/dist/context/search-form-context.mjs +13 -0
- package/dist/context/search-form-context.mjs.map +1 -0
- package/dist/context/searches-catalog-card-context.d.mts +16 -0
- package/dist/context/searches-catalog-card-context.d.mts.map +1 -0
- package/dist/context/searches-catalog-card-context.mjs +13 -0
- package/dist/context/searches-catalog-card-context.mjs.map +1 -0
- package/dist/context/searches-catalog-context.d.mts +20 -0
- package/dist/context/searches-catalog-context.d.mts.map +1 -0
- package/dist/context/searches-catalog-context.mjs +13 -0
- package/dist/context/searches-catalog-context.mjs.map +1 -0
- package/dist/hooks/use-debounce.mjs +28 -0
- package/dist/hooks/use-debounce.mjs.map +1 -0
- package/dist/hooks/use-debounced-fn.mjs +47 -0
- package/dist/hooks/use-debounced-fn.mjs.map +1 -0
- package/dist/hooks/use-disclosure.mjs +35 -0
- package/dist/hooks/use-disclosure.mjs.map +1 -0
- package/dist/hooks/use-field-error.d.mts +11 -0
- package/dist/hooks/use-field-error.d.mts.map +1 -0
- package/dist/hooks/use-field-error.mjs +23 -0
- package/dist/hooks/use-field-error.mjs.map +1 -0
- package/dist/hooks/use-floating-element.mjs +45 -0
- package/dist/hooks/use-floating-element.mjs.map +1 -0
- package/dist/hooks/use-form-core.d.mts +16 -0
- package/dist/hooks/use-form-core.d.mts.map +1 -0
- package/dist/hooks/use-form-core.mjs +241 -0
- package/dist/hooks/use-form-core.mjs.map +1 -0
- package/dist/hooks/use-jsonata-preview.mjs +38 -0
- package/dist/hooks/use-jsonata-preview.mjs.map +1 -0
- package/dist/hooks/use-menu-navigation.mjs +86 -0
- package/dist/hooks/use-menu-navigation.mjs.map +1 -0
- package/dist/hooks/use-pipe-catalog-table.d.mts +47 -0
- package/dist/hooks/use-pipe-catalog-table.d.mts.map +1 -0
- package/dist/hooks/use-pipe-catalog-table.mjs +170 -0
- package/dist/hooks/use-pipe-catalog-table.mjs.map +1 -0
- package/dist/hooks/use-pipe-form.d.mts +31 -0
- package/dist/hooks/use-pipe-form.d.mts.map +1 -0
- package/dist/hooks/use-pipe-form.mjs +65 -0
- package/dist/hooks/use-pipe-form.mjs.map +1 -0
- package/dist/hooks/use-search-catalog-table.d.mts +40 -0
- package/dist/hooks/use-search-catalog-table.d.mts.map +1 -0
- package/dist/hooks/use-search-catalog-table.mjs +161 -0
- package/dist/hooks/use-search-catalog-table.mjs.map +1 -0
- package/dist/hooks/use-search-form.d.mts +17 -0
- package/dist/hooks/use-search-form.d.mts.map +1 -0
- package/dist/hooks/use-search-form.mjs +58 -0
- package/dist/hooks/use-search-form.mjs.map +1 -0
- package/dist/hooks/use-searches-catalog-table.d.mts +40 -0
- package/dist/hooks/use-searches-catalog-table.d.mts.map +1 -0
- package/dist/hooks/use-searches-catalog-table.mjs +161 -0
- package/dist/hooks/use-searches-catalog-table.mjs.map +1 -0
- package/dist/index.d.mts +96 -0
- package/dist/index.mjs +98 -0
- package/dist/lib/utils.mjs +11 -0
- package/dist/lib/utils.mjs.map +1 -0
- package/dist/styles/pipe0-form.css +3785 -0
- package/dist/types/adapters.d.mts +107 -0
- package/dist/types/adapters.d.mts.map +1 -0
- package/dist/types/catalog-adapters.d.mts +122 -0
- package/dist/types/catalog-adapters.d.mts.map +1 -0
- package/dist/types/field-handle.d.mts +3 -0
- package/dist/types/field-props.d.mts +285 -0
- package/dist/types/field-props.d.mts.map +1 -0
- package/dist/types/form-customization.d.mts +25 -0
- package/dist/types/form-customization.d.mts.map +1 -0
- package/dist/types/form-handle.d.mts +23 -0
- package/dist/types/form-handle.d.mts.map +1 -0
- package/dist/utils/build-section-handlers.mjs +419 -0
- package/dist/utils/build-section-handlers.mjs.map +1 -0
- package/dist/utils/catalog-helpers.d.mts +12 -0
- package/dist/utils/catalog-helpers.d.mts.map +1 -0
- package/dist/utils/catalog-helpers.mjs +35 -0
- package/dist/utils/catalog-helpers.mjs.map +1 -0
- package/dist/utils/generate-random-string.mjs +11 -0
- package/dist/utils/generate-random-string.mjs.map +1 -0
- package/dist/utils/merge-form-stores.mjs +14 -0
- package/dist/utils/merge-form-stores.mjs.map +1 -0
- package/dist/utils/object-path.mjs +72 -0
- package/dist/utils/object-path.mjs.map +1 -0
- package/dist/utils/render-slot.d.mts +44 -0
- package/dist/utils/render-slot.d.mts.map +1 -0
- package/dist/utils/render-slot.mjs +30 -0
- package/dist/utils/render-slot.mjs.map +1 -0
- package/dist/widgets/avatar-group.d.mts +36 -0
- package/dist/widgets/avatar-group.d.mts.map +1 -0
- package/dist/widgets/avatar-group.mjs +114 -0
- package/dist/widgets/avatar-group.mjs.map +1 -0
- package/dist/widgets/emoji-glyph.d.mts +11 -0
- package/dist/widgets/emoji-glyph.d.mts.map +1 -0
- package/dist/widgets/emoji-glyph.mjs +13 -0
- package/dist/widgets/emoji-glyph.mjs.map +1 -0
- package/dist/widgets/field-type-badge.d.mts +13 -0
- package/dist/widgets/field-type-badge.d.mts.map +1 -0
- package/dist/widgets/field-type-badge.mjs +30 -0
- package/dist/widgets/field-type-badge.mjs.map +1 -0
- package/dist/widgets/icon-glyph.d.mts +16 -0
- package/dist/widgets/icon-glyph.d.mts.map +1 -0
- package/dist/widgets/icon-glyph.mjs +59 -0
- package/dist/widgets/icon-glyph.mjs.map +1 -0
- package/dist/widgets/index.d.mts +9 -0
- package/dist/widgets/index.mjs +11 -0
- package/dist/widgets/logo-url.d.mts +17 -0
- package/dist/widgets/logo-url.d.mts.map +1 -0
- package/dist/widgets/logo-url.mjs +17 -0
- package/dist/widgets/logo-url.mjs.map +1 -0
- package/dist/widgets/pricing-badge.d.mts +11 -0
- package/dist/widgets/pricing-badge.d.mts.map +1 -0
- package/dist/widgets/pricing-badge.mjs +13 -0
- package/dist/widgets/pricing-badge.mjs.map +1 -0
- package/dist/widgets/provider-logo.d.mts +16 -0
- package/dist/widgets/provider-logo.d.mts.map +1 -0
- package/dist/widgets/provider-logo.mjs +20 -0
- package/dist/widgets/provider-logo.mjs.map +1 -0
- package/dist/widgets/widget-strip.d.mts +16 -0
- package/dist/widgets/widget-strip.d.mts.map +1 -0
- package/dist/widgets/widget-strip.mjs +42 -0
- package/dist/widgets/widget-strip.mjs.map +1 -0
- package/dist/widgets/widget-view.d.mts +14 -0
- package/dist/widgets/widget-view.d.mts.map +1 -0
- package/dist/widgets/widget-view.mjs +36 -0
- package/dist/widgets/widget-view.mjs.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { cn } from "../../../lib/utils.mjs";
|
|
2
|
+
import { Button } from "../../ui/button.mjs";
|
|
3
|
+
import { IconGripVertical } from "../icons.mjs";
|
|
4
|
+
import { useDebouncedFn } from "../../../hooks/use-debounced-fn.mjs";
|
|
5
|
+
import { FieldTypeBadge } from "../../../widgets/field-type-badge.mjs";
|
|
6
|
+
import { WidgetStrip } from "../../../widgets/widget-strip.mjs";
|
|
7
|
+
import { Combobox, ComboboxChip, ComboboxChips, ComboboxChipsInput, ComboboxContent, ComboboxEmpty, ComboboxItem, ComboboxList, ComboboxTrigger, useComboboxAnchor } from "../../ui/combobox.mjs";
|
|
8
|
+
import { filterOptions } from "../multi-select-popover-trigger.mjs";
|
|
9
|
+
import { useEffect, useId, useMemo, useRef, useState } from "react";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
import { XIcon } from "lucide-react";
|
|
12
|
+
import { DndContext, KeyboardSensor, PointerSensor, closestCenter, useSensor, useSensors } from "@dnd-kit/core";
|
|
13
|
+
import { SortableContext, horizontalListSortingStrategy, useSortable } from "@dnd-kit/sortable";
|
|
14
|
+
import useSWR from "swr";
|
|
15
|
+
|
|
16
|
+
//#region src/components/internal/combobox/suggest-combobox.tsx
|
|
17
|
+
/** Split widgets so `field_type` can render on the trailing edge of dropdown
|
|
18
|
+
* rows while every other widget stays in the leading strip. */
|
|
19
|
+
function splitWidgets(widgets) {
|
|
20
|
+
const { field_type: _ignored, ...rest } = widgets;
|
|
21
|
+
return { leading: Object.values(rest).some((v) => v != null) ? rest : void 0 };
|
|
22
|
+
}
|
|
23
|
+
/** Reorderable chip matching `ComboboxChip` visually, with a grip handle. */
|
|
24
|
+
function SortableChip({ id, onRemove, children }) {
|
|
25
|
+
const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ id });
|
|
26
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
27
|
+
ref: setNodeRef,
|
|
28
|
+
style: {
|
|
29
|
+
transform: transform ? `translate3d(${Math.round(transform.x)}px, ${Math.round(transform.y)}px, 0)` : void 0,
|
|
30
|
+
transition,
|
|
31
|
+
opacity: isDragging ? .6 : 1
|
|
32
|
+
},
|
|
33
|
+
className: cn("pz:flex pz:h-[calc(--spacing(5.25))] pz:w-fit pz:items-center pz:gap-1 pz:rounded-sm pz:bg-muted pz:pl-0.5 pz:pr-0 pz:text-xs pz:font-medium pz:whitespace-nowrap pz:text-foreground"),
|
|
34
|
+
...attributes,
|
|
35
|
+
children: [
|
|
36
|
+
/* @__PURE__ */ jsx("span", {
|
|
37
|
+
role: "button",
|
|
38
|
+
tabIndex: -1,
|
|
39
|
+
"aria-label": "Drag to reorder",
|
|
40
|
+
className: "pz:flex pz:items-center pz:justify-center pz:cursor-grab pz:text-muted-foreground pz:hover:text-foreground pz:touch-none",
|
|
41
|
+
...listeners,
|
|
42
|
+
children: /* @__PURE__ */ jsx(IconGripVertical, {
|
|
43
|
+
width: 12,
|
|
44
|
+
height: 12
|
|
45
|
+
})
|
|
46
|
+
}),
|
|
47
|
+
children,
|
|
48
|
+
/* @__PURE__ */ jsx(Button, {
|
|
49
|
+
type: "button",
|
|
50
|
+
variant: "ghost",
|
|
51
|
+
size: "icon-xs",
|
|
52
|
+
className: "pz:opacity-50 pz:hover:opacity-100",
|
|
53
|
+
onClick: (e) => {
|
|
54
|
+
e.stopPropagation();
|
|
55
|
+
onRemove();
|
|
56
|
+
},
|
|
57
|
+
"aria-label": "Remove",
|
|
58
|
+
children: /* @__PURE__ */ jsx(XIcon, { className: "pz:pointer-events-none" })
|
|
59
|
+
})
|
|
60
|
+
]
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Unified combobox built on `@base-ui/react`'s Combobox primitive.
|
|
65
|
+
*
|
|
66
|
+
* - Chips + inline search input via `ComboboxChips` / `ComboboxChipsInput`.
|
|
67
|
+
* - Static (`options`) or async (`loadOptions`) item sources. External
|
|
68
|
+
* filtering in both cases so match-sorter ranking / server relevance is
|
|
69
|
+
* honored and base-ui's built-in filter doesn't double-filter.
|
|
70
|
+
* - Free-text creation (`allowCreate`) renders an inline "Add \"X\"" item.
|
|
71
|
+
* - `maxItems`, `excludeValues`, `disableSearch`, `ariaInvalid`, `disabled`.
|
|
72
|
+
* - Debounced async loader with an in-memory cache keyed by query string.
|
|
73
|
+
*/
|
|
74
|
+
function SuggestCombobox({ value, onChange, options, loadOptions, allowCreate = false, disableSearch = false, maxItems, excludeValues = [], ariaInvalid, disabled, debounceMs = 300, labelFor, iconFor, emptyLabel, placeholder, reorderable = false }) {
|
|
75
|
+
const [input, setInput] = useState("");
|
|
76
|
+
const [debouncedQuery, setDebouncedQuery] = useState("");
|
|
77
|
+
const [open, setOpen] = useState(false);
|
|
78
|
+
const isAsync = typeof loadOptions === "function";
|
|
79
|
+
const debouncedSetQuery = useDebouncedFn((q) => setDebouncedQuery(q), debounceMs);
|
|
80
|
+
const instanceId = useId();
|
|
81
|
+
const { data: asyncResults = null, isLoading: swrIsLoading, isValidating: swrIsValidating } = useSWR(loadOptions && (open || debouncedQuery !== "") ? [instanceId, debouncedQuery] : null, async ([, q]) => {
|
|
82
|
+
if (!loadOptions) return [];
|
|
83
|
+
return (await loadOptions(q)).filter((o) => !!o.value);
|
|
84
|
+
}, { keepPreviousData: true });
|
|
85
|
+
const loading = swrIsLoading || swrIsValidating;
|
|
86
|
+
const excludeSet = useMemo(() => new Set(excludeValues), [excludeValues]);
|
|
87
|
+
const selectedSet = useMemo(() => new Set(value), [value]);
|
|
88
|
+
const anchor = useComboboxAnchor();
|
|
89
|
+
const filteredSuggestions = useMemo(() => {
|
|
90
|
+
const source = isAsync ? asyncResults ?? [] : options ?? [];
|
|
91
|
+
return (isAsync ? source : filterOptions(source, input)).filter((o) => !excludeSet.has(o.value));
|
|
92
|
+
}, [
|
|
93
|
+
isAsync,
|
|
94
|
+
asyncResults,
|
|
95
|
+
options,
|
|
96
|
+
input,
|
|
97
|
+
excludeSet
|
|
98
|
+
]);
|
|
99
|
+
const trimmedInput = input.trim();
|
|
100
|
+
const showCreateRow = allowCreate && trimmedInput.length > 0 && !selectedSet.has(trimmedInput) && !excludeSet.has(trimmedInput) && !filteredSuggestions.some((o) => o.value.toLowerCase() === trimmedInput.toLowerCase());
|
|
101
|
+
const resolveLabel = (v) => {
|
|
102
|
+
if (labelFor) return labelFor(v);
|
|
103
|
+
const fromStatic = options?.find((o) => o.value === v)?.label;
|
|
104
|
+
if (fromStatic) return fromStatic;
|
|
105
|
+
return asyncResults?.find((o) => o.value === v)?.label ?? v;
|
|
106
|
+
};
|
|
107
|
+
const widgetCacheRef = useRef(/* @__PURE__ */ new Map());
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
for (const opt of options ?? []) if (opt.widgets) widgetCacheRef.current.set(opt.value, opt.widgets);
|
|
110
|
+
for (const opt of asyncResults ?? []) if (opt.widgets) widgetCacheRef.current.set(opt.value, opt.widgets);
|
|
111
|
+
}, [options, asyncResults]);
|
|
112
|
+
const resolveWidgets = (v) => options?.find((o) => o.value === v)?.widgets ?? asyncResults?.find((o) => o.value === v)?.widgets ?? widgetCacheRef.current.get(v);
|
|
113
|
+
const valueObjects = useMemo(() => value.map((v) => ({
|
|
114
|
+
value: v,
|
|
115
|
+
label: resolveLabel(v),
|
|
116
|
+
widgets: resolveWidgets(v)
|
|
117
|
+
})), [
|
|
118
|
+
value,
|
|
119
|
+
options,
|
|
120
|
+
asyncResults,
|
|
121
|
+
labelFor
|
|
122
|
+
]);
|
|
123
|
+
const items = useMemo(() => {
|
|
124
|
+
const list = [];
|
|
125
|
+
if (showCreateRow) list.push({
|
|
126
|
+
value: trimmedInput,
|
|
127
|
+
label: `Add "${trimmedInput}"`,
|
|
128
|
+
__create: true
|
|
129
|
+
});
|
|
130
|
+
for (const o of filteredSuggestions) list.push(o);
|
|
131
|
+
return list;
|
|
132
|
+
}, [
|
|
133
|
+
showCreateRow,
|
|
134
|
+
trimmedInput,
|
|
135
|
+
filteredSuggestions
|
|
136
|
+
]);
|
|
137
|
+
const atMax = maxItems !== void 0 && value.length >= maxItems;
|
|
138
|
+
const sortSensors = useSensors(useSensor(PointerSensor, { activationConstraint: { distance: 4 } }), useSensor(KeyboardSensor));
|
|
139
|
+
const handleDragEnd = (event) => {
|
|
140
|
+
const { active, over } = event;
|
|
141
|
+
if (!over || active.id === over.id) return;
|
|
142
|
+
const from = value.indexOf(String(active.id));
|
|
143
|
+
const to = value.indexOf(String(over.id));
|
|
144
|
+
if (from === -1 || to === -1) return;
|
|
145
|
+
const next = [...value];
|
|
146
|
+
const [moved] = next.splice(from, 1);
|
|
147
|
+
next.splice(to, 0, moved);
|
|
148
|
+
onChange(next);
|
|
149
|
+
};
|
|
150
|
+
return /* @__PURE__ */ jsxs(Combobox, {
|
|
151
|
+
multiple: true,
|
|
152
|
+
items,
|
|
153
|
+
filter: null,
|
|
154
|
+
open,
|
|
155
|
+
onOpenChange: setOpen,
|
|
156
|
+
value: valueObjects,
|
|
157
|
+
onValueChange: (next) => {
|
|
158
|
+
if (!Array.isArray(next)) return;
|
|
159
|
+
const seen = /* @__PURE__ */ new Set();
|
|
160
|
+
const deduped = [];
|
|
161
|
+
for (const item of next) {
|
|
162
|
+
const v = typeof item === "string" ? item : item.value;
|
|
163
|
+
if (!v || seen.has(v)) continue;
|
|
164
|
+
if (excludeSet.has(v)) continue;
|
|
165
|
+
if (maxItems !== void 0 && deduped.length >= maxItems) break;
|
|
166
|
+
seen.add(v);
|
|
167
|
+
deduped.push(v);
|
|
168
|
+
}
|
|
169
|
+
onChange(deduped);
|
|
170
|
+
setInput("");
|
|
171
|
+
if (isAsync) debouncedSetQuery("");
|
|
172
|
+
},
|
|
173
|
+
isItemEqualToValue: (a, b) => a.value === b.value,
|
|
174
|
+
itemToStringLabel: (item) => item.label,
|
|
175
|
+
itemToStringValue: (item) => item.value,
|
|
176
|
+
inputValue: input,
|
|
177
|
+
onInputValueChange: (v) => {
|
|
178
|
+
setInput(v);
|
|
179
|
+
if (isAsync) debouncedSetQuery(v);
|
|
180
|
+
},
|
|
181
|
+
disabled,
|
|
182
|
+
children: [/* @__PURE__ */ jsxs(ComboboxChips, {
|
|
183
|
+
"aria-invalid": ariaInvalid || void 0,
|
|
184
|
+
ref: anchor,
|
|
185
|
+
children: [
|
|
186
|
+
reorderable ? /* @__PURE__ */ jsx(DndContext, {
|
|
187
|
+
sensors: sortSensors,
|
|
188
|
+
collisionDetection: closestCenter,
|
|
189
|
+
onDragEnd: handleDragEnd,
|
|
190
|
+
children: /* @__PURE__ */ jsx(SortableContext, {
|
|
191
|
+
items: value,
|
|
192
|
+
strategy: horizontalListSortingStrategy,
|
|
193
|
+
children: valueObjects.map((v) => /* @__PURE__ */ jsxs(SortableChip, {
|
|
194
|
+
id: v.value,
|
|
195
|
+
onRemove: () => onChange(value.filter((x) => x !== v.value)),
|
|
196
|
+
children: [
|
|
197
|
+
iconFor?.(v.value),
|
|
198
|
+
v.widgets && /* @__PURE__ */ jsx(WidgetStrip, {
|
|
199
|
+
widgets: v.widgets,
|
|
200
|
+
size: 14
|
|
201
|
+
}),
|
|
202
|
+
v.label
|
|
203
|
+
]
|
|
204
|
+
}, v.value))
|
|
205
|
+
})
|
|
206
|
+
}) : valueObjects.map((v) => /* @__PURE__ */ jsxs(ComboboxChip, { children: [
|
|
207
|
+
iconFor?.(v.value),
|
|
208
|
+
v.widgets && /* @__PURE__ */ jsx(WidgetStrip, {
|
|
209
|
+
widgets: v.widgets,
|
|
210
|
+
size: 14
|
|
211
|
+
}),
|
|
212
|
+
v.label
|
|
213
|
+
] }, v.value)),
|
|
214
|
+
/* @__PURE__ */ jsx(ComboboxChipsInput, {
|
|
215
|
+
placeholder: value.length === 0 ? placeholder : void 0,
|
|
216
|
+
readOnly: disableSearch,
|
|
217
|
+
"aria-invalid": ariaInvalid || void 0,
|
|
218
|
+
onKeyDown: (e) => {
|
|
219
|
+
if (e.key !== "Enter" || e.nativeEvent.isComposing) return;
|
|
220
|
+
if (trimmedInput.length === 0) return;
|
|
221
|
+
e.preventDefault();
|
|
222
|
+
e.stopPropagation();
|
|
223
|
+
if (atMax) return;
|
|
224
|
+
const toAdd = filteredSuggestions.find((o) => o.value.toLowerCase() === trimmedInput.toLowerCase())?.value ?? (allowCreate ? trimmedInput : null);
|
|
225
|
+
if (!toAdd) return;
|
|
226
|
+
if (selectedSet.has(toAdd) || excludeSet.has(toAdd)) return;
|
|
227
|
+
onChange([...value, toAdd]);
|
|
228
|
+
setInput("");
|
|
229
|
+
if (isAsync) debouncedSetQuery("");
|
|
230
|
+
}
|
|
231
|
+
}),
|
|
232
|
+
/* @__PURE__ */ jsx(ComboboxTrigger, { className: "pz:ml-auto pz:bg-transparent pz:hover:bg-transparent" })
|
|
233
|
+
]
|
|
234
|
+
}), /* @__PURE__ */ jsxs(ComboboxContent, {
|
|
235
|
+
anchor,
|
|
236
|
+
children: [
|
|
237
|
+
loading && items.length > 0 && /* @__PURE__ */ jsx("span", {
|
|
238
|
+
"aria-label": "Loading",
|
|
239
|
+
className: "pz:absolute pz:right-2 pz:top-2 pz:z-10 pz:inline-block pz:h-3 pz:w-3 pz:animate-spin pz:rounded-full pz:border-2 pz:border-muted-foreground/30 pz:border-t-muted-foreground"
|
|
240
|
+
}),
|
|
241
|
+
loading && items.length === 0 && /* @__PURE__ */ jsx("div", {
|
|
242
|
+
role: "status",
|
|
243
|
+
"aria-label": "Loading",
|
|
244
|
+
className: "pz:flex pz:items-center pz:justify-center pz:py-6",
|
|
245
|
+
children: /* @__PURE__ */ jsx("span", { className: "pz:inline-block pz:h-5 pz:w-5 pz:animate-spin pz:rounded-full pz:border-2 pz:border-muted-foreground/30 pz:border-t-muted-foreground" })
|
|
246
|
+
}),
|
|
247
|
+
/* @__PURE__ */ jsxs(ComboboxList, {
|
|
248
|
+
className: cn(loading && items.length > 0 && "pz:opacity-50 pz:transition-opacity pz:pointer-events-none"),
|
|
249
|
+
children: [
|
|
250
|
+
atMax && /* @__PURE__ */ jsxs("div", {
|
|
251
|
+
className: "pz:px-2 pz:py-1.5 pz:text-xs pz:text-muted-foreground",
|
|
252
|
+
children: [
|
|
253
|
+
"Maximum ",
|
|
254
|
+
maxItems,
|
|
255
|
+
" item",
|
|
256
|
+
maxItems === 1 ? "" : "s",
|
|
257
|
+
" reached."
|
|
258
|
+
]
|
|
259
|
+
}),
|
|
260
|
+
items.map((item) => {
|
|
261
|
+
const fieldType = !item.__create ? item.widgets?.field_type : void 0;
|
|
262
|
+
const leadingWidgets = !item.__create && item.widgets ? splitWidgets(item.widgets).leading : void 0;
|
|
263
|
+
return /* @__PURE__ */ jsxs(ComboboxItem, {
|
|
264
|
+
value: item,
|
|
265
|
+
className: item.__create ? "pz:italic" : void 0,
|
|
266
|
+
disabled: !selectedSet.has(item.value) && atMax && !item.__create,
|
|
267
|
+
children: [
|
|
268
|
+
!item.__create && iconFor?.(item.value),
|
|
269
|
+
leadingWidgets && /* @__PURE__ */ jsx(WidgetStrip, {
|
|
270
|
+
widgets: leadingWidgets,
|
|
271
|
+
size: 14
|
|
272
|
+
}),
|
|
273
|
+
/* @__PURE__ */ jsx("span", {
|
|
274
|
+
className: "pz:flex-1 pz:truncate",
|
|
275
|
+
children: item.label
|
|
276
|
+
}),
|
|
277
|
+
fieldType && /* @__PURE__ */ jsx(FieldTypeBadge, {
|
|
278
|
+
type: fieldType.type,
|
|
279
|
+
format: fieldType.format
|
|
280
|
+
})
|
|
281
|
+
]
|
|
282
|
+
}, `${item.__create ? "__create__:" : ""}${item.value}`);
|
|
283
|
+
}),
|
|
284
|
+
!loading && items.length === 0 && /* @__PURE__ */ jsx(ComboboxEmpty, { children: emptyLabel ?? (allowCreate ? options || loadOptions ? "No matches" : "Type to add" : "No options") })
|
|
285
|
+
]
|
|
286
|
+
})
|
|
287
|
+
]
|
|
288
|
+
})]
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
//#endregion
|
|
293
|
+
export { SuggestCombobox };
|
|
294
|
+
//# sourceMappingURL=suggest-combobox.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest-combobox.mjs","names":[],"sources":["../../../../src/components/internal/combobox/suggest-combobox.tsx"],"sourcesContent":["import {\n closestCenter,\n DndContext,\n type DragEndEvent,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n} from \"@dnd-kit/core\";\nimport { horizontalListSortingStrategy, SortableContext, useSortable } from \"@dnd-kit/sortable\";\nimport type { WidgetsByKind } from \"@pipe0/base\";\nimport { XIcon } from \"lucide-react\";\nimport { type ReactNode, useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport useSWR from \"swr\";\nimport { useDebouncedFn } from \"../../../hooks/use-debounced-fn.js\";\nimport { cn } from \"../../../lib/utils.js\";\nimport { FieldTypeBadge } from \"../../../widgets/field-type-badge.js\";\nimport { WidgetStrip } from \"../../../widgets/widget-strip.js\";\nimport { Button } from \"../../ui/button.js\";\nimport {\n Combobox,\n ComboboxChip,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxItem,\n ComboboxList,\n ComboboxTrigger,\n useComboboxAnchor,\n} from \"../../ui/combobox.js\";\nimport { IconGripVertical } from \"../icons.js\";\nimport { filterOptions, type PayloadOption } from \"../multi-select-popover-trigger.js\";\n\n/** Internal item type — the base-ui Combobox handles `{value, label}` natively. */\ntype ComboboxOption = PayloadOption & { __create?: boolean };\n\n/** Split widgets so `field_type` can render on the trailing edge of dropdown\n * rows while every other widget stays in the leading strip. */\nfunction splitWidgets(widgets: WidgetsByKind): {\n leading: WidgetsByKind | undefined;\n} {\n const { field_type: _ignored, ...rest } = widgets;\n const hasLeading = Object.values(rest).some((v) => v != null);\n return { leading: hasLeading ? rest : undefined };\n}\n\n/** Reorderable chip matching `ComboboxChip` visually, with a grip handle. */\nfunction SortableChip({\n id,\n onRemove,\n children,\n}: {\n id: string;\n onRemove: () => void;\n children: ReactNode;\n}) {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id,\n });\n const style: React.CSSProperties = {\n transform: transform\n ? `translate3d(${Math.round(transform.x)}px, ${Math.round(transform.y)}px, 0)`\n : undefined,\n transition,\n opacity: isDragging ? 0.6 : 1,\n };\n return (\n <span\n ref={setNodeRef}\n style={style}\n className={cn(\n \"pz:flex pz:h-[calc(--spacing(5.25))] pz:w-fit pz:items-center pz:gap-1 pz:rounded-sm pz:bg-muted pz:pl-0.5 pz:pr-0 pz:text-xs pz:font-medium pz:whitespace-nowrap pz:text-foreground\",\n )}\n {...attributes}\n >\n <span\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Drag to reorder\"\n className=\"pz:flex pz:items-center pz:justify-center pz:cursor-grab pz:text-muted-foreground pz:hover:text-foreground pz:touch-none\"\n {...listeners}\n >\n <IconGripVertical width={12} height={12} />\n </span>\n {children}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"pz:opacity-50 pz:hover:opacity-100\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n aria-label=\"Remove\"\n >\n <XIcon className=\"pz:pointer-events-none\" />\n </Button>\n </span>\n );\n}\n\nexport interface SuggestComboboxProps {\n value: string[];\n onChange: (value: string[]) => void;\n options?: PayloadOption[];\n loadOptions?: (query: string) => Promise<PayloadOption[]>;\n allowCreate?: boolean;\n disableSearch?: boolean;\n maxItems?: number;\n excludeValues?: string[];\n ariaInvalid?: boolean;\n disabled?: boolean;\n debounceMs?: number;\n labelFor?: (value: string) => string;\n /** Optional leading icon (e.g. provider logo) rendered inside chips and list items. */\n iconFor?: (value: string) => ReactNode;\n emptyLabel?: string;\n placeholder?: string;\n /** When true, chips become drag-sortable and reorder the `value` array. */\n reorderable?: boolean;\n}\n\n/**\n * Unified combobox built on `@base-ui/react`'s Combobox primitive.\n *\n * - Chips + inline search input via `ComboboxChips` / `ComboboxChipsInput`.\n * - Static (`options`) or async (`loadOptions`) item sources. External\n * filtering in both cases so match-sorter ranking / server relevance is\n * honored and base-ui's built-in filter doesn't double-filter.\n * - Free-text creation (`allowCreate`) renders an inline \"Add \\\"X\\\"\" item.\n * - `maxItems`, `excludeValues`, `disableSearch`, `ariaInvalid`, `disabled`.\n * - Debounced async loader with an in-memory cache keyed by query string.\n */\nexport function SuggestCombobox({\n value,\n onChange,\n options,\n loadOptions,\n allowCreate = false,\n disableSearch = false,\n maxItems,\n excludeValues = [],\n ariaInvalid,\n disabled,\n debounceMs = 300,\n labelFor,\n iconFor,\n emptyLabel,\n placeholder,\n reorderable = false,\n}: SuggestComboboxProps) {\n const [input, setInput] = useState(\"\");\n const [debouncedQuery, setDebouncedQuery] = useState(\"\");\n const [open, setOpen] = useState(false);\n\n const isAsync = typeof loadOptions === \"function\";\n\n const debouncedSetQuery = useDebouncedFn((q: string) => setDebouncedQuery(q), debounceMs);\n\n // Per-instance cache key prefix so two comboboxes with the same query but\n // different `loadOptions` functions don't share results.\n const instanceId = useId();\n\n // SWR handles dedupe + caching by-query + race-safety. We defer the\n // empty-query fetch until the user opens the dropdown — some backends\n // (e.g. Crustdata persondb) don't accept empty queries, and on-mount\n // fetches are wasted work if the field is never opened. `keepPreviousData`\n // preserves the prior result set during a refetch so the UI dims rather\n // than empties.\n const swrKey: readonly [string, string] | null =\n loadOptions && (open || debouncedQuery !== \"\") ? [instanceId, debouncedQuery] : null;\n const {\n data: asyncResults = null,\n isLoading: swrIsLoading,\n isValidating: swrIsValidating,\n } = useSWR<PayloadOption[], Error, readonly [string, string] | null>(\n swrKey,\n async ([, q]) => {\n // `swrKey` was `null` when `loadOptions` is undefined, so the fetcher\n // never runs without one — the runtime check is just to satisfy TS.\n if (!loadOptions) return [];\n const opts = await loadOptions(q);\n return opts.filter((o) => !!o.value);\n },\n { keepPreviousData: true },\n );\n const loading = swrIsLoading || swrIsValidating;\n\n const excludeSet = useMemo(() => new Set(excludeValues), [excludeValues]);\n const selectedSet = useMemo(() => new Set(value), [value]);\n\n const anchor = useComboboxAnchor();\n\n const filteredSuggestions = useMemo<PayloadOption[]>(() => {\n const source = isAsync ? (asyncResults ?? []) : (options ?? []);\n const ranked = isAsync ? source : filterOptions(source, input);\n return ranked.filter((o) => !excludeSet.has(o.value));\n }, [isAsync, asyncResults, options, input, excludeSet]);\n\n const trimmedInput = input.trim();\n const showCreateRow =\n allowCreate &&\n trimmedInput.length > 0 &&\n !selectedSet.has(trimmedInput) &&\n !excludeSet.has(trimmedInput) &&\n !filteredSuggestions.some((o) => o.value.toLowerCase() === trimmedInput.toLowerCase());\n\n const resolveLabel = (v: string): string => {\n if (labelFor) return labelFor(v);\n const fromStatic = options?.find((o) => o.value === v)?.label;\n if (fromStatic) return fromStatic;\n const fromAsync = asyncResults?.find((o) => o.value === v)?.label;\n return fromAsync ?? v;\n };\n\n // Persist widgets per value across loadOptions cycles. Async results are\n // replaced with each query, so without this cache an icon shown when\n // picking a value would disappear on the next refetch. Updates run in an\n // effect (not during render) so the cache stays consistent under strict\n // mode and concurrent rendering.\n const widgetCacheRef = useRef<Map<string, WidgetsByKind>>(new Map());\n useEffect(() => {\n for (const opt of options ?? []) {\n if (opt.widgets) widgetCacheRef.current.set(opt.value, opt.widgets);\n }\n for (const opt of asyncResults ?? []) {\n if (opt.widgets) widgetCacheRef.current.set(opt.value, opt.widgets);\n }\n }, [options, asyncResults]);\n\n const resolveWidgets = (v: string): WidgetsByKind | undefined =>\n options?.find((o) => o.value === v)?.widgets ??\n asyncResults?.find((o) => o.value === v)?.widgets ??\n widgetCacheRef.current.get(v);\n\n const valueObjects = useMemo<ComboboxOption[]>(\n () =>\n value.map((v) => ({\n value: v,\n label: resolveLabel(v),\n widgets: resolveWidgets(v),\n })),\n // resolveLabel/resolveWidgets close over options/asyncResults/labelFor\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [value, options, asyncResults, labelFor],\n );\n\n const items = useMemo<ComboboxOption[]>(() => {\n const list: ComboboxOption[] = [];\n if (showCreateRow) {\n list.push({\n value: trimmedInput,\n label: `Add \"${trimmedInput}\"`,\n __create: true,\n });\n }\n for (const o of filteredSuggestions) list.push(o);\n return list;\n }, [showCreateRow, trimmedInput, filteredSuggestions]);\n\n const atMax = maxItems !== undefined && value.length >= maxItems;\n\n const sortSensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 4 } }),\n useSensor(KeyboardSensor),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n const from = value.indexOf(String(active.id));\n const to = value.indexOf(String(over.id));\n if (from === -1 || to === -1) return;\n const next = [...value];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n onChange(next);\n };\n\n return (\n <Combobox<ComboboxOption, true>\n multiple\n items={items}\n filter={null}\n open={open}\n onOpenChange={setOpen}\n value={valueObjects}\n onValueChange={(next) => {\n if (!Array.isArray(next)) return;\n // Unique by value, rewrite __create items to clean objects.\n const seen = new Set<string>();\n const deduped: string[] = [];\n for (const item of next) {\n const v = typeof item === \"string\" ? item : (item as ComboboxOption).value;\n if (!v || seen.has(v)) continue;\n if (excludeSet.has(v)) continue;\n if (maxItems !== undefined && deduped.length >= maxItems) break;\n seen.add(v);\n deduped.push(v);\n }\n onChange(deduped);\n setInput(\"\");\n if (isAsync) debouncedSetQuery(\"\");\n }}\n isItemEqualToValue={(a, b) => (a as ComboboxOption).value === (b as ComboboxOption).value}\n itemToStringLabel={(item) => (item as ComboboxOption).label}\n itemToStringValue={(item) => (item as ComboboxOption).value}\n inputValue={input}\n onInputValueChange={(v) => {\n setInput(v);\n if (isAsync) debouncedSetQuery(v);\n }}\n disabled={disabled}\n >\n <ComboboxChips aria-invalid={ariaInvalid || undefined} ref={anchor}>\n {reorderable ? (\n <DndContext\n sensors={sortSensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <SortableContext items={value} strategy={horizontalListSortingStrategy}>\n {valueObjects.map((v) => (\n <SortableChip\n key={v.value}\n id={v.value}\n onRemove={() => onChange(value.filter((x) => x !== v.value))}\n >\n {iconFor?.(v.value)}\n {v.widgets && <WidgetStrip widgets={v.widgets} size={14} />}\n {v.label}\n </SortableChip>\n ))}\n </SortableContext>\n </DndContext>\n ) : (\n valueObjects.map((v) => (\n <ComboboxChip key={v.value}>\n {iconFor?.(v.value)}\n {v.widgets && <WidgetStrip widgets={v.widgets} size={14} />}\n {v.label}\n </ComboboxChip>\n ))\n )}\n <ComboboxChipsInput\n placeholder={value.length === 0 ? placeholder : undefined}\n readOnly={disableSearch}\n aria-invalid={ariaInvalid || undefined}\n onKeyDown={(e) => {\n if (e.key !== \"Enter\" || e.nativeEvent.isComposing) return;\n if (trimmedInput.length === 0) return;\n // Prevent the Enter from bubbling up and submitting an enclosing form.\n e.preventDefault();\n e.stopPropagation();\n if (atMax) return;\n // Prefer an exact match against the visible suggestions, otherwise\n // fall back to creating a new value when allowed.\n const exact = filteredSuggestions.find(\n (o) => o.value.toLowerCase() === trimmedInput.toLowerCase(),\n );\n const toAdd = exact?.value ?? (allowCreate ? trimmedInput : null);\n if (!toAdd) return;\n if (selectedSet.has(toAdd) || excludeSet.has(toAdd)) return;\n onChange([...value, toAdd]);\n setInput(\"\");\n if (isAsync) debouncedSetQuery(\"\");\n }}\n />\n <ComboboxTrigger className=\"pz:ml-auto pz:bg-transparent pz:hover:bg-transparent\" />\n </ComboboxChips>\n <ComboboxContent anchor={anchor}>\n {loading && items.length > 0 && (\n // Refetch: prior items stay visible, dimmed, with a small corner\n // spinner so the layout doesn't jump while the new page loads.\n <span\n aria-label=\"Loading\"\n className=\"pz:absolute pz:right-2 pz:top-2 pz:z-10 pz:inline-block pz:h-3 pz:w-3 pz:animate-spin pz:rounded-full pz:border-2 pz:border-muted-foreground/30 pz:border-t-muted-foreground\"\n />\n )}\n {loading && items.length === 0 && (\n // Initial load: nothing to dim, so render a visible spinner in the\n // popover body to confirm options are being fetched.\n <div\n role=\"status\"\n aria-label=\"Loading\"\n className=\"pz:flex pz:items-center pz:justify-center pz:py-6\"\n >\n <span className=\"pz:inline-block pz:h-5 pz:w-5 pz:animate-spin pz:rounded-full pz:border-2 pz:border-muted-foreground/30 pz:border-t-muted-foreground\" />\n </div>\n )}\n <ComboboxList\n className={cn(\n loading &&\n items.length > 0 &&\n \"pz:opacity-50 pz:transition-opacity pz:pointer-events-none\",\n )}\n >\n {atMax && (\n <div className=\"pz:px-2 pz:py-1.5 pz:text-xs pz:text-muted-foreground\">\n Maximum {maxItems} item{maxItems === 1 ? \"\" : \"s\"} reached.\n </div>\n )}\n\n {items.map((item) => {\n // Field-type widget renders on the trailing edge of the row so\n // the field name reads first; everything else stays in the\n // leading widget strip.\n const fieldType = !item.__create ? item.widgets?.field_type : undefined;\n const leadingWidgets =\n !item.__create && item.widgets ? splitWidgets(item.widgets).leading : undefined;\n return (\n <ComboboxItem\n key={`${item.__create ? \"__create__:\" : \"\"}${item.value}`}\n value={item}\n className={item.__create ? \"pz:italic\" : undefined}\n disabled={!selectedSet.has(item.value) && atMax && !item.__create}\n >\n {!item.__create && iconFor?.(item.value)}\n {leadingWidgets && <WidgetStrip widgets={leadingWidgets} size={14} />}\n <span className=\"pz:flex-1 pz:truncate\">{item.label}</span>\n {fieldType && <FieldTypeBadge type={fieldType.type} format={fieldType.format} />}\n </ComboboxItem>\n );\n })}\n\n {!loading && items.length === 0 && (\n <ComboboxEmpty>\n {emptyLabel ??\n (allowCreate\n ? options || loadOptions\n ? \"No matches\"\n : \"Type to add\"\n : \"No options\")}\n </ComboboxEmpty>\n )}\n </ComboboxList>\n </ComboboxContent>\n </Combobox>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/internal/field-legend.tsx
|
|
4
|
+
function separatorAfter(index, total) {
|
|
5
|
+
if (index === total - 1) return "";
|
|
6
|
+
if (index === total - 2) return total === 2 ? " and " : ", and ";
|
|
7
|
+
return ", ";
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Single shared legend rendered below tag-aware form-field editors. Lists
|
|
11
|
+
* the active trigger keys (`/`, `@`) with a short description so users
|
|
12
|
+
* discover the suggestion menus without having to type a probe character.
|
|
13
|
+
*
|
|
14
|
+
* Architectural rule: this is the only place trigger-hint copy is
|
|
15
|
+
* rendered. `LiquidEditor` owns it. Adapters never wire their own legend
|
|
16
|
+
* or hint strip — drift between adapters is the only thing this component
|
|
17
|
+
* exists to prevent.
|
|
18
|
+
*/
|
|
19
|
+
function FieldLegend({ entries }) {
|
|
20
|
+
if (entries.length === 0) return null;
|
|
21
|
+
return /* @__PURE__ */ jsxs("p", {
|
|
22
|
+
className: "pz:px-2.5 pz:pt-1 pz:pb-1.5 pz:text-xs pz:text-muted-foreground",
|
|
23
|
+
children: [entries.map((entry, i) => /* @__PURE__ */ jsxs("span", { children: [
|
|
24
|
+
/* @__PURE__ */ jsx("kbd", {
|
|
25
|
+
className: "pz:rounded pz:border pz:bg-muted pz:px-1.5 pz:py-0.5 pz:text-xs",
|
|
26
|
+
children: entry.key
|
|
27
|
+
}),
|
|
28
|
+
" ",
|
|
29
|
+
entry.label,
|
|
30
|
+
separatorAfter(i, entries.length)
|
|
31
|
+
] }, entry.key)), "."]
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
//#endregion
|
|
36
|
+
export { FieldLegend };
|
|
37
|
+
//# sourceMappingURL=field-legend.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-legend.mjs","names":[],"sources":["../../../src/components/internal/field-legend.tsx"],"sourcesContent":["export type LegendEntry = { key: string; label: string };\n\nfunction separatorAfter(index: number, total: number): string {\n if (index === total - 1) return \"\";\n if (index === total - 2) return total === 2 ? \" and \" : \", and \";\n return \", \";\n}\n\n/**\n * Single shared legend rendered below tag-aware form-field editors. Lists\n * the active trigger keys (`/`, `@`) with a short description so users\n * discover the suggestion menus without having to type a probe character.\n *\n * Architectural rule: this is the only place trigger-hint copy is\n * rendered. `LiquidEditor` owns it. Adapters never wire their own legend\n * or hint strip — drift between adapters is the only thing this component\n * exists to prevent.\n */\nexport function FieldLegend({ entries }: { entries: LegendEntry[] }) {\n if (entries.length === 0) return null;\n return (\n <p className=\"pz:px-2.5 pz:pt-1 pz:pb-1.5 pz:text-xs pz:text-muted-foreground\">\n {entries.map((entry, i) => (\n <span key={entry.key}>\n <kbd className=\"pz:rounded pz:border pz:bg-muted pz:px-1.5 pz:py-0.5 pz:text-xs\">\n {entry.key}\n </kbd>{\" \"}\n {entry.label}\n {separatorAfter(i, entries.length)}\n </span>\n ))}\n .\n </p>\n );\n}\n"],"mappings":";;;AAEA,SAAS,eAAe,OAAe,OAAuB;AAC5D,KAAI,UAAU,QAAQ,EAAG,QAAO;AAChC,KAAI,UAAU,QAAQ,EAAG,QAAO,UAAU,IAAI,UAAU;AACxD,QAAO;;;;;;;;;;;;AAaT,SAAgB,YAAY,EAAE,WAAuC;AACnE,KAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QACE,qBAAC,KAAD;EAAG,WAAU;YAAb,CACG,QAAQ,KAAK,OAAO,MACnB,qBAAC,QAAD;GACE,oBAAC,OAAD;IAAK,WAAU;cACZ,MAAM;IACH;GAAC;GACN,MAAM;GACN,eAAe,GAAG,QAAQ,OAAO;GAC7B,IANI,MAAM,IAMV,CACP,EAAC,IAED"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useFormState } from "react-hook-form";
|
|
3
|
+
|
|
4
|
+
//#region src/components/internal/form-level-errors.tsx
|
|
5
|
+
function isFieldErrorNode(node) {
|
|
6
|
+
return !!node && typeof node === "object" && typeof node.message === "string" && typeof node.type === "string";
|
|
7
|
+
}
|
|
8
|
+
const FIELD_ERROR_KEYS = new Set([
|
|
9
|
+
"message",
|
|
10
|
+
"type",
|
|
11
|
+
"ref",
|
|
12
|
+
"types",
|
|
13
|
+
"root"
|
|
14
|
+
]);
|
|
15
|
+
function collectErrors(errors, prefix = "") {
|
|
16
|
+
if (!errors || typeof errors !== "object") return [];
|
|
17
|
+
const out = [];
|
|
18
|
+
for (const key of Object.keys(errors)) {
|
|
19
|
+
const node = errors[key];
|
|
20
|
+
if (!node) continue;
|
|
21
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
22
|
+
if (isFieldErrorNode(node)) out.push({
|
|
23
|
+
path,
|
|
24
|
+
message: node.message
|
|
25
|
+
});
|
|
26
|
+
if (node && typeof node === "object") {
|
|
27
|
+
const nested = {};
|
|
28
|
+
for (const childKey of Object.keys(node)) {
|
|
29
|
+
if (FIELD_ERROR_KEYS.has(childKey)) continue;
|
|
30
|
+
nested[childKey] = node[childKey];
|
|
31
|
+
}
|
|
32
|
+
out.push(...collectErrors(nested, path));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return out;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Renders any errors set on the form that are not attached to a rendered
|
|
39
|
+
* field. This surfaces:
|
|
40
|
+
* - root errors (e.g. `errors.root`)
|
|
41
|
+
* - container-level errors set on non-leaf paths (e.g. a Zod custom check
|
|
42
|
+
* on `config.filters` that says "You must set at least one filter.")
|
|
43
|
+
*/
|
|
44
|
+
function FormLevelErrors({ control, fieldPaths }) {
|
|
45
|
+
const { errors, isSubmitted } = useFormState({ control });
|
|
46
|
+
if (!isSubmitted) return null;
|
|
47
|
+
const rootMessage = typeof errors?.root === "object" && errors.root && "message" in errors.root && typeof errors.root.message === "string" ? errors.root.message : void 0;
|
|
48
|
+
const isOwnedByField = (path) => {
|
|
49
|
+
if (fieldPaths.has(path)) return true;
|
|
50
|
+
for (const p of fieldPaths) if (path.startsWith(`${p}.`)) return true;
|
|
51
|
+
return false;
|
|
52
|
+
};
|
|
53
|
+
const others = collectErrors(errors).filter((e) => !isOwnedByField(e.path));
|
|
54
|
+
if (!rootMessage && others.length === 0) return null;
|
|
55
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
56
|
+
"data-p0": "form-errors",
|
|
57
|
+
role: "alert",
|
|
58
|
+
className: "pz:flex pz:flex-col pz:gap-1 pz:rounded-md pz:border pz:border-destructive/50 pz:bg-destructive/5 pz:px-3 pz:py-2 pz:text-destructive pz:text-xs pz:font-medium",
|
|
59
|
+
children: [rootMessage && /* @__PURE__ */ jsx("span", {
|
|
60
|
+
"data-p0-error-path": "root",
|
|
61
|
+
children: rootMessage
|
|
62
|
+
}), others.map((e) => /* @__PURE__ */ jsx("span", {
|
|
63
|
+
"data-p0-error-path": e.path,
|
|
64
|
+
children: e.message
|
|
65
|
+
}, e.path))]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//#endregion
|
|
70
|
+
export { FormLevelErrors };
|
|
71
|
+
//# sourceMappingURL=form-level-errors.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-level-errors.mjs","names":[],"sources":["../../../src/components/internal/form-level-errors.tsx"],"sourcesContent":["import { type Control, type FieldErrors, useFormState } from \"react-hook-form\";\n\ntype CollectedError = { path: string; message: string };\n\nfunction isFieldErrorNode(node: unknown): node is { message: string; type: string } {\n return (\n !!node &&\n typeof node === \"object\" &&\n typeof (node as { message?: unknown }).message === \"string\" &&\n typeof (node as { type?: unknown }).type === \"string\"\n );\n}\n\nconst FIELD_ERROR_KEYS = new Set([\"message\", \"type\", \"ref\", \"types\", \"root\"]);\n\nfunction collectErrors(\n errors: FieldErrors | Record<string, unknown> | undefined,\n prefix = \"\",\n): CollectedError[] {\n if (!errors || typeof errors !== \"object\") return [];\n const out: CollectedError[] = [];\n for (const key of Object.keys(errors)) {\n const node = (errors as Record<string, unknown>)[key];\n if (!node) continue;\n const path = prefix ? `${prefix}.${key}` : key;\n if (isFieldErrorNode(node)) {\n out.push({ path, message: node.message });\n }\n if (node && typeof node === \"object\") {\n const nested: Record<string, unknown> = {};\n for (const childKey of Object.keys(node as Record<string, unknown>)) {\n if (FIELD_ERROR_KEYS.has(childKey)) continue;\n nested[childKey] = (node as Record<string, unknown>)[childKey];\n }\n out.push(...collectErrors(nested, path));\n }\n }\n return out;\n}\n\n/**\n * Renders any errors set on the form that are not attached to a rendered\n * field. This surfaces:\n * - root errors (e.g. `errors.root`)\n * - container-level errors set on non-leaf paths (e.g. a Zod custom check\n * on `config.filters` that says \"You must set at least one filter.\")\n */\nexport function FormLevelErrors({\n control,\n fieldPaths,\n}: {\n control: Control<any>;\n fieldPaths: Set<string>;\n}) {\n const { errors, isSubmitted } = useFormState({ control });\n\n // Match `useFieldError`: only surface errors after the form has been\n // submitted at least once. Otherwise merely focusing a field triggers\n // live validation and makes the form feel immediately \"broken\".\n if (!isSubmitted) return null;\n\n const rootMessage =\n typeof errors?.root === \"object\" &&\n errors.root &&\n \"message\" in errors.root &&\n typeof (errors.root as { message?: unknown }).message === \"string\"\n ? (errors.root as { message: string }).message\n : undefined;\n\n // Errors on any rendered field — or on any descendant of a rendered field —\n // belong to that field's adapter, not the global banner. Complex adapters\n // like json_extraction / pipes_trigger register a single path at the top\n // level and render their own inline errors for nested paths underneath.\n const isOwnedByField = (path: string) => {\n if (fieldPaths.has(path)) return true;\n for (const p of fieldPaths) {\n if (path.startsWith(`${p}.`)) return true;\n }\n return false;\n };\n\n const others = collectErrors(errors).filter((e) => !isOwnedByField(e.path));\n\n if (!rootMessage && others.length === 0) return null;\n\n return (\n <div\n data-p0=\"form-errors\"\n role=\"alert\"\n className=\"pz:flex pz:flex-col pz:gap-1 pz:rounded-md pz:border pz:border-destructive/50 pz:bg-destructive/5 pz:px-3 pz:py-2 pz:text-destructive pz:text-xs pz:font-medium\"\n >\n {rootMessage && <span data-p0-error-path=\"root\">{rootMessage}</span>}\n {others.map((e) => (\n <span key={e.path} data-p0-error-path={e.path}>\n {e.message}\n </span>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;AAIA,SAAS,iBAAiB,MAA0D;AAClF,QACE,CAAC,CAAC,QACF,OAAO,SAAS,YAChB,OAAQ,KAA+B,YAAY,YACnD,OAAQ,KAA4B,SAAS;;AAIjD,MAAM,mBAAmB,IAAI,IAAI;CAAC;CAAW;CAAQ;CAAO;CAAS;CAAO,CAAC;AAE7E,SAAS,cACP,QACA,SAAS,IACS;AAClB,KAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO,EAAE;CACpD,MAAM,MAAwB,EAAE;AAChC,MAAK,MAAM,OAAO,OAAO,KAAK,OAAO,EAAE;EACrC,MAAM,OAAQ,OAAmC;AACjD,MAAI,CAAC,KAAM;EACX,MAAM,OAAO,SAAS,GAAG,OAAO,GAAG,QAAQ;AAC3C,MAAI,iBAAiB,KAAK,CACxB,KAAI,KAAK;GAAE;GAAM,SAAS,KAAK;GAAS,CAAC;AAE3C,MAAI,QAAQ,OAAO,SAAS,UAAU;GACpC,MAAM,SAAkC,EAAE;AAC1C,QAAK,MAAM,YAAY,OAAO,KAAK,KAAgC,EAAE;AACnE,QAAI,iBAAiB,IAAI,SAAS,CAAE;AACpC,WAAO,YAAa,KAAiC;;AAEvD,OAAI,KAAK,GAAG,cAAc,QAAQ,KAAK,CAAC;;;AAG5C,QAAO;;;;;;;;;AAUT,SAAgB,gBAAgB,EAC9B,SACA,cAIC;CACD,MAAM,EAAE,QAAQ,gBAAgB,aAAa,EAAE,SAAS,CAAC;AAKzD,KAAI,CAAC,YAAa,QAAO;CAEzB,MAAM,cACJ,OAAO,QAAQ,SAAS,YACxB,OAAO,QACP,aAAa,OAAO,QACpB,OAAQ,OAAO,KAA+B,YAAY,WACrD,OAAO,KAA6B,UACrC;CAMN,MAAM,kBAAkB,SAAiB;AACvC,MAAI,WAAW,IAAI,KAAK,CAAE,QAAO;AACjC,OAAK,MAAM,KAAK,WACd,KAAI,KAAK,WAAW,GAAG,EAAE,GAAG,CAAE,QAAO;AAEvC,SAAO;;CAGT,MAAM,SAAS,cAAc,OAAO,CAAC,QAAQ,MAAM,CAAC,eAAe,EAAE,KAAK,CAAC;AAE3E,KAAI,CAAC,eAAe,OAAO,WAAW,EAAG,QAAO;AAEhD,QACE,qBAAC,OAAD;EACE,WAAQ;EACR,MAAK;EACL,WAAU;YAHZ,CAKG,eAAe,oBAAC,QAAD;GAAM,sBAAmB;aAAQ;GAAmB,GACnE,OAAO,KAAK,MACX,oBAAC,QAAD;GAAmB,sBAAoB,EAAE;aACtC,EAAE;GACE,EAFI,EAAE,KAEN,CACP,CACE"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/internal/icons.tsx
|
|
4
|
+
const defaults = {
|
|
5
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
6
|
+
width: 16,
|
|
7
|
+
height: 16,
|
|
8
|
+
viewBox: "0 0 24 24",
|
|
9
|
+
fill: "none",
|
|
10
|
+
stroke: "currentColor",
|
|
11
|
+
strokeWidth: 2,
|
|
12
|
+
strokeLinecap: "round",
|
|
13
|
+
strokeLinejoin: "round"
|
|
14
|
+
};
|
|
15
|
+
function IconPlus(props) {
|
|
16
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
17
|
+
...defaults,
|
|
18
|
+
...props,
|
|
19
|
+
children: [/* @__PURE__ */ jsx("path", { d: "M5 12h14" }), /* @__PURE__ */ jsx("path", { d: "M12 5v14" })]
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function IconMinus(props) {
|
|
23
|
+
return /* @__PURE__ */ jsx("svg", {
|
|
24
|
+
...defaults,
|
|
25
|
+
...props,
|
|
26
|
+
children: /* @__PURE__ */ jsx("path", { d: "M5 12h14" })
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function IconInfo(props) {
|
|
30
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
31
|
+
...defaults,
|
|
32
|
+
...props,
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsx("circle", {
|
|
35
|
+
cx: "12",
|
|
36
|
+
cy: "12",
|
|
37
|
+
r: "10"
|
|
38
|
+
}),
|
|
39
|
+
/* @__PURE__ */ jsx("path", { d: "M12 16v-4" }),
|
|
40
|
+
/* @__PURE__ */ jsx("path", { d: "M12 8h.01" })
|
|
41
|
+
]
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
function IconPencil(props) {
|
|
45
|
+
return /* @__PURE__ */ jsx("svg", {
|
|
46
|
+
...defaults,
|
|
47
|
+
...props,
|
|
48
|
+
children: /* @__PURE__ */ jsx("path", { d: "M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z" })
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function IconTrash(props) {
|
|
52
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
53
|
+
...defaults,
|
|
54
|
+
...props,
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsx("path", { d: "M3 6h18" }),
|
|
57
|
+
/* @__PURE__ */ jsx("path", { d: "M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6" }),
|
|
58
|
+
/* @__PURE__ */ jsx("path", { d: "M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2" })
|
|
59
|
+
]
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function IconChevronDown(props) {
|
|
63
|
+
return /* @__PURE__ */ jsx("svg", {
|
|
64
|
+
...defaults,
|
|
65
|
+
...props,
|
|
66
|
+
children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" })
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function IconLock(props) {
|
|
70
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
71
|
+
...defaults,
|
|
72
|
+
...props,
|
|
73
|
+
children: [/* @__PURE__ */ jsx("rect", {
|
|
74
|
+
width: "18",
|
|
75
|
+
height: "11",
|
|
76
|
+
x: "3",
|
|
77
|
+
y: "11",
|
|
78
|
+
rx: "2",
|
|
79
|
+
ry: "2"
|
|
80
|
+
}), /* @__PURE__ */ jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })]
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
function IconGripVertical(props) {
|
|
84
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
85
|
+
...defaults,
|
|
86
|
+
...props,
|
|
87
|
+
children: [
|
|
88
|
+
/* @__PURE__ */ jsx("circle", {
|
|
89
|
+
cx: "9",
|
|
90
|
+
cy: "12",
|
|
91
|
+
r: "1"
|
|
92
|
+
}),
|
|
93
|
+
/* @__PURE__ */ jsx("circle", {
|
|
94
|
+
cx: "9",
|
|
95
|
+
cy: "5",
|
|
96
|
+
r: "1"
|
|
97
|
+
}),
|
|
98
|
+
/* @__PURE__ */ jsx("circle", {
|
|
99
|
+
cx: "9",
|
|
100
|
+
cy: "19",
|
|
101
|
+
r: "1"
|
|
102
|
+
}),
|
|
103
|
+
/* @__PURE__ */ jsx("circle", {
|
|
104
|
+
cx: "15",
|
|
105
|
+
cy: "12",
|
|
106
|
+
r: "1"
|
|
107
|
+
}),
|
|
108
|
+
/* @__PURE__ */ jsx("circle", {
|
|
109
|
+
cx: "15",
|
|
110
|
+
cy: "5",
|
|
111
|
+
r: "1"
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ jsx("circle", {
|
|
114
|
+
cx: "15",
|
|
115
|
+
cy: "19",
|
|
116
|
+
r: "1"
|
|
117
|
+
})
|
|
118
|
+
]
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function IconCheck(props) {
|
|
122
|
+
return /* @__PURE__ */ jsx("svg", {
|
|
123
|
+
...defaults,
|
|
124
|
+
...props,
|
|
125
|
+
children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" })
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
//#endregion
|
|
130
|
+
export { IconCheck, IconChevronDown, IconGripVertical, IconInfo, IconLock, IconMinus, IconPencil, IconPlus, IconTrash };
|
|
131
|
+
//# sourceMappingURL=icons.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.mjs","names":[],"sources":["../../../src/components/internal/icons.tsx"],"sourcesContent":["import type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\n\nconst defaults: IconProps = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\" as const,\n strokeLinejoin: \"round\" as const,\n};\n\nexport function IconPlus(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\nexport function IconMinus(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M5 12h14\" />\n </svg>\n );\n}\n\nexport function IconX(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nexport function IconInfo(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 16v-4\" />\n <path d=\"M12 8h.01\" />\n </svg>\n );\n}\n\nexport function IconPencil(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n </svg>\n );\n}\n\nexport function IconTrash(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n </svg>\n );\n}\n\nexport function IconChevronDown(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nexport function IconLock(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\nexport function IconGripVertical(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\n </svg>\n );\n}\n\nexport function IconMoreHorizontal(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </svg>\n );\n}\n\nexport function IconPlay(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <polygon points=\"6 3 20 12 6 21 6 3\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function IconCheck(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n"],"mappings":";;;AAIA,MAAM,WAAsB;CAC1B,OAAO;CACP,OAAO;CACP,QAAQ;CACR,SAAS;CACT,MAAM;CACN,QAAQ;CACR,aAAa;CACb,eAAe;CACf,gBAAgB;CACjB;AAED,SAAgB,SAAS,OAAkB;AACzC,QACE,qBAAC,OAAD;EAAK,GAAI;EAAU,GAAI;YAAvB,CACE,oBAAC,QAAD,EAAM,GAAE,YAAa,GACrB,oBAAC,QAAD,EAAM,GAAE,YAAa,EACjB;;;AAIV,SAAgB,UAAU,OAAkB;AAC1C,QACE,oBAAC,OAAD;EAAK,GAAI;EAAU,GAAI;YACrB,oBAAC,QAAD,EAAM,GAAE,YAAa;EACjB;;AAaV,SAAgB,SAAS,OAAkB;AACzC,QACE,qBAAC,OAAD;EAAK,GAAI;EAAU,GAAI;YAAvB;GACE,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;IAAO;GACjC,oBAAC,QAAD,EAAM,GAAE,aAAc;GACtB,oBAAC,QAAD,EAAM,GAAE,aAAc;GAClB;;;AAIV,SAAgB,WAAW,OAAkB;AAC3C,QACE,oBAAC,OAAD;EAAK,GAAI;EAAU,GAAI;YACrB,oBAAC,QAAD,EAAM,GAAE,oIAAqI;EACzI;;AAIV,SAAgB,UAAU,OAAkB;AAC1C,QACE,qBAAC,OAAD;EAAK,GAAI;EAAU,GAAI;YAAvB;GACE,oBAAC,QAAD,EAAM,GAAE,WAAY;GACpB,oBAAC,QAAD,EAAM,GAAE,yCAA0C;GAClD,oBAAC,QAAD,EAAM,GAAE,sCAAuC;GAC3C;;;AAIV,SAAgB,gBAAgB,OAAkB;AAChD,QACE,oBAAC,OAAD;EAAK,GAAI;EAAU,GAAI;YACrB,oBAAC,QAAD,EAAM,GAAE,gBAAiB;EACrB;;AAIV,SAAgB,SAAS,OAAkB;AACzC,QACE,qBAAC,OAAD;EAAK,GAAI;EAAU,GAAI;YAAvB,CACE,oBAAC,QAAD;GAAM,OAAM;GAAK,QAAO;GAAK,GAAE;GAAI,GAAE;GAAK,IAAG;GAAI,IAAG;GAAM,GAC1D,oBAAC,QAAD,EAAM,GAAE,4BAA6B,EACjC;;;AAIV,SAAgB,iBAAiB,OAAkB;AACjD,QACE,qBAAC,OAAD;EAAK,GAAI;EAAU,GAAI;YAAvB;GACE,oBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;IAAM;GAC/B,oBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAI,GAAE;IAAM;GAC9B,oBAAC,UAAD;IAAQ,IAAG;IAAI,IAAG;IAAK,GAAE;IAAM;GAC/B,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;IAAM;GAChC,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAI,GAAE;IAAM;GAC/B,oBAAC,UAAD;IAAQ,IAAG;IAAK,IAAG;IAAK,GAAE;IAAM;GAC5B;;;AAsBV,SAAgB,UAAU,OAAkB;AAC1C,QACE,oBAAC,OAAD;EAAK,GAAI;EAAU,GAAI;YACrB,oBAAC,QAAD,EAAM,GAAE,mBAAoB;EACxB"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import "../../lib/utils.mjs";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { rankItem } from "@tanstack/match-sorter-utils";
|
|
4
|
+
|
|
5
|
+
//#region src/components/internal/multi-select-popover-trigger.tsx
|
|
6
|
+
/**
|
|
7
|
+
* Rank-filter an option list using match-sorter-utils.
|
|
8
|
+
* Returns options sorted by descending rank, empty `input` returns all options
|
|
9
|
+
* (match-sorter assigns all passing).
|
|
10
|
+
*/
|
|
11
|
+
function filterOptions(options, input) {
|
|
12
|
+
if (!input) return options;
|
|
13
|
+
return options.map((option) => {
|
|
14
|
+
const labelRank = rankItem(option.label, input);
|
|
15
|
+
const valueRank = rankItem(option.value, input);
|
|
16
|
+
const ranking = labelRank.rank > valueRank.rank ? labelRank : valueRank;
|
|
17
|
+
return ranking.passed ? {
|
|
18
|
+
...option,
|
|
19
|
+
ranking
|
|
20
|
+
} : null;
|
|
21
|
+
}).filter((o) => o !== null).sort((a, b) => b.ranking.rank - a.ranking.rank);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//#endregion
|
|
25
|
+
export { filterOptions };
|
|
26
|
+
//# sourceMappingURL=multi-select-popover-trigger.mjs.map
|