@pipe0/react 0.0.4 → 0.0.6
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 +14 -0
- package/README.md +58 -2
- package/dist/components/compound/pipe-catalog/active-filters.d.mts +7 -10
- package/dist/components/compound/pipe-catalog/active-filters.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/active-filters.mjs +22 -18
- package/dist/components/compound/pipe-catalog/active-filters.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/card.d.mts +3 -12
- package/dist/components/compound/pipe-catalog/card.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/card.mjs +28 -25
- package/dist/components/compound/pipe-catalog/card.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/category-filter.d.mts +6 -13
- package/dist/components/compound/pipe-catalog/category-filter.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/category-filter.mjs +12 -13
- package/dist/components/compound/pipe-catalog/category-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/column-filter.d.mts +6 -14
- package/dist/components/compound/pipe-catalog/column-filter.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/column-filter.mjs +9 -9
- package/dist/components/compound/pipe-catalog/column-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/empty.d.mts +5 -10
- package/dist/components/compound/pipe-catalog/empty.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/empty.mjs +12 -14
- package/dist/components/compound/pipe-catalog/empty.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/index.d.mts +1 -1
- package/dist/components/compound/pipe-catalog/input-field-filter.d.mts +3 -3
- package/dist/components/compound/pipe-catalog/input-field-filter.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/input-field-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/list.d.mts +8 -25
- package/dist/components/compound/pipe-catalog/list.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/list.mjs +14 -14
- package/dist/components/compound/pipe-catalog/list.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/output-field-filter.d.mts +3 -3
- package/dist/components/compound/pipe-catalog/output-field-filter.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/output-field-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/provider-filter.d.mts +3 -3
- package/dist/components/compound/pipe-catalog/provider-filter.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/provider-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/root.d.mts +6 -6
- package/dist/components/compound/pipe-catalog/root.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/root.mjs +2 -2
- package/dist/components/compound/pipe-catalog/root.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/search-filter.d.mts +5 -9
- package/dist/components/compound/pipe-catalog/search-filter.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/search-filter.mjs +9 -10
- package/dist/components/compound/pipe-catalog/search-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-catalog/tag-filter.d.mts +3 -3
- package/dist/components/compound/pipe-catalog/tag-filter.d.mts.map +1 -1
- package/dist/components/compound/pipe-catalog/tag-filter.mjs.map +1 -1
- package/dist/components/compound/pipe-form/content.d.mts +6 -3
- package/dist/components/compound/pipe-form/content.d.mts.map +1 -1
- package/dist/components/compound/pipe-form/content.mjs +17 -25
- package/dist/components/compound/pipe-form/content.mjs.map +1 -1
- package/dist/components/compound/pipe-form/errors.d.mts +23 -0
- package/dist/components/compound/pipe-form/errors.d.mts.map +1 -0
- package/dist/components/compound/pipe-form/errors.mjs +40 -0
- package/dist/components/compound/pipe-form/errors.mjs.map +1 -0
- package/dist/components/compound/pipe-form/footer.d.mts +7 -7
- package/dist/components/compound/pipe-form/footer.d.mts.map +1 -1
- package/dist/components/compound/pipe-form/footer.mjs +11 -6
- package/dist/components/compound/pipe-form/footer.mjs.map +1 -1
- package/dist/components/compound/pipe-form/header.d.mts +7 -7
- package/dist/components/compound/pipe-form/header.d.mts.map +1 -1
- package/dist/components/compound/pipe-form/header.mjs +11 -6
- package/dist/components/compound/pipe-form/header.mjs.map +1 -1
- package/dist/components/compound/pipe-form/index.d.mts +2 -1
- package/dist/components/compound/pipe-form/root.d.mts +18 -11
- package/dist/components/compound/pipe-form/root.d.mts.map +1 -1
- package/dist/components/compound/pipe-form/root.mjs +21 -27
- package/dist/components/compound/pipe-form/root.mjs.map +1 -1
- package/dist/components/compound/pipe-form/submit-button.d.mts +15 -4
- package/dist/components/compound/pipe-form/submit-button.d.mts.map +1 -1
- package/dist/components/compound/pipe-form/submit-button.mjs +23 -8
- package/dist/components/compound/pipe-form/submit-button.mjs.map +1 -1
- package/dist/components/compound/pipe-form/title.d.mts +9 -8
- package/dist/components/compound/pipe-form/title.d.mts.map +1 -1
- package/dist/components/compound/pipe-form/title.mjs +11 -6
- package/dist/components/compound/pipe-form/title.mjs.map +1 -1
- package/dist/components/compound/search-catalog/active-filters.d.mts +7 -10
- package/dist/components/compound/search-catalog/active-filters.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/active-filters.mjs +22 -18
- package/dist/components/compound/search-catalog/active-filters.mjs.map +1 -1
- package/dist/components/compound/search-catalog/card.d.mts +4 -13
- package/dist/components/compound/search-catalog/card.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/card.mjs +31 -28
- package/dist/components/compound/search-catalog/card.mjs.map +1 -1
- package/dist/components/compound/search-catalog/category-filter.d.mts +7 -13
- package/dist/components/compound/search-catalog/category-filter.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/category-filter.mjs +12 -13
- package/dist/components/compound/search-catalog/category-filter.mjs.map +1 -1
- package/dist/components/compound/search-catalog/column-filter.d.mts +6 -10
- package/dist/components/compound/search-catalog/column-filter.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/column-filter.mjs +9 -9
- package/dist/components/compound/search-catalog/column-filter.mjs.map +1 -1
- package/dist/components/compound/search-catalog/empty.d.mts +5 -10
- package/dist/components/compound/search-catalog/empty.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/empty.mjs +12 -14
- package/dist/components/compound/search-catalog/empty.mjs.map +1 -1
- package/dist/components/compound/search-catalog/index.d.mts +1 -1
- package/dist/components/compound/search-catalog/list.d.mts +8 -10
- package/dist/components/compound/search-catalog/list.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/list.mjs +14 -14
- package/dist/components/compound/search-catalog/list.mjs.map +1 -1
- package/dist/components/compound/search-catalog/output-field-filter.d.mts +3 -3
- package/dist/components/compound/search-catalog/output-field-filter.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/output-field-filter.mjs.map +1 -1
- package/dist/components/compound/search-catalog/provider-filter.d.mts +3 -3
- package/dist/components/compound/search-catalog/provider-filter.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/provider-filter.mjs.map +1 -1
- package/dist/components/compound/search-catalog/root.d.mts +6 -6
- package/dist/components/compound/search-catalog/root.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/root.mjs +2 -2
- package/dist/components/compound/search-catalog/root.mjs.map +1 -1
- package/dist/components/compound/search-catalog/search-filter.d.mts +5 -9
- package/dist/components/compound/search-catalog/search-filter.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/search-filter.mjs +9 -10
- package/dist/components/compound/search-catalog/search-filter.mjs.map +1 -1
- package/dist/components/compound/search-catalog/tag-filter.d.mts +3 -3
- package/dist/components/compound/search-catalog/tag-filter.d.mts.map +1 -1
- package/dist/components/compound/search-catalog/tag-filter.mjs.map +1 -1
- package/dist/components/compound/search-form/content.d.mts +6 -3
- package/dist/components/compound/search-form/content.d.mts.map +1 -1
- package/dist/components/compound/search-form/content.mjs +17 -25
- package/dist/components/compound/search-form/content.mjs.map +1 -1
- package/dist/components/compound/search-form/errors.d.mts +23 -0
- package/dist/components/compound/search-form/errors.d.mts.map +1 -0
- package/dist/components/compound/search-form/errors.mjs +40 -0
- package/dist/components/compound/search-form/errors.mjs.map +1 -0
- package/dist/components/compound/search-form/footer.d.mts +7 -7
- package/dist/components/compound/search-form/footer.d.mts.map +1 -1
- package/dist/components/compound/search-form/footer.mjs +11 -6
- package/dist/components/compound/search-form/footer.mjs.map +1 -1
- package/dist/components/compound/search-form/header.d.mts +7 -7
- package/dist/components/compound/search-form/header.d.mts.map +1 -1
- package/dist/components/compound/search-form/header.mjs +11 -6
- package/dist/components/compound/search-form/header.mjs.map +1 -1
- package/dist/components/compound/search-form/index.d.mts +2 -1
- package/dist/components/compound/search-form/root.d.mts +19 -12
- package/dist/components/compound/search-form/root.d.mts.map +1 -1
- package/dist/components/compound/search-form/root.mjs +21 -27
- package/dist/components/compound/search-form/root.mjs.map +1 -1
- package/dist/components/compound/search-form/submit-button.d.mts +15 -4
- package/dist/components/compound/search-form/submit-button.d.mts.map +1 -1
- package/dist/components/compound/search-form/submit-button.mjs +23 -8
- package/dist/components/compound/search-form/submit-button.mjs.map +1 -1
- package/dist/components/compound/search-form/title.d.mts +9 -8
- package/dist/components/compound/search-form/title.d.mts.map +1 -1
- package/dist/components/compound/search-form/title.mjs +11 -6
- package/dist/components/compound/search-form/title.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/active-filters.d.mts +7 -10
- package/dist/components/compound/searches-catalog/active-filters.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/active-filters.mjs +22 -18
- package/dist/components/compound/searches-catalog/active-filters.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/card.d.mts +5 -6
- package/dist/components/compound/searches-catalog/card.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/card.mjs +38 -28
- package/dist/components/compound/searches-catalog/card.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/category-filter.d.mts +7 -13
- package/dist/components/compound/searches-catalog/category-filter.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/category-filter.mjs +12 -13
- package/dist/components/compound/searches-catalog/category-filter.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/column-filter.d.mts +6 -10
- package/dist/components/compound/searches-catalog/column-filter.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/column-filter.mjs +9 -9
- package/dist/components/compound/searches-catalog/column-filter.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/empty.d.mts +5 -10
- package/dist/components/compound/searches-catalog/empty.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/empty.mjs +12 -14
- package/dist/components/compound/searches-catalog/empty.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/index.d.mts +1 -1
- package/dist/components/compound/searches-catalog/list.d.mts +8 -10
- package/dist/components/compound/searches-catalog/list.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/list.mjs +14 -14
- package/dist/components/compound/searches-catalog/list.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/output-field-filter.d.mts +3 -3
- package/dist/components/compound/searches-catalog/output-field-filter.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/output-field-filter.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/provider-filter.d.mts +3 -3
- package/dist/components/compound/searches-catalog/provider-filter.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/provider-filter.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/root.d.mts +6 -6
- package/dist/components/compound/searches-catalog/root.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/root.mjs +2 -2
- package/dist/components/compound/searches-catalog/root.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/search-filter.d.mts +5 -9
- package/dist/components/compound/searches-catalog/search-filter.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/search-filter.mjs +9 -10
- package/dist/components/compound/searches-catalog/search-filter.mjs.map +1 -1
- package/dist/components/compound/searches-catalog/tag-filter.d.mts +3 -3
- package/dist/components/compound/searches-catalog/tag-filter.d.mts.map +1 -1
- package/dist/components/compound/searches-catalog/tag-filter.mjs.map +1 -1
- package/dist/components/defaults/adapters/index.mjs +2 -2
- package/dist/components/defaults/adapters/index.mjs.map +1 -1
- package/dist/components/defaults/adapters/json-extraction-input.mjs +291 -199
- package/dist/components/defaults/adapters/json-extraction-input.mjs.map +1 -1
- package/dist/components/defaults/adapters/{pipes-trigger-input.mjs → pipes-run-if-input.mjs} +32 -32
- package/dist/components/defaults/adapters/pipes-run-if-input.mjs.map +1 -0
- package/dist/components/defaults/adapters/providers-input.mjs +221 -13
- package/dist/components/defaults/adapters/providers-input.mjs.map +1 -1
- package/dist/components/defaults/catalog/card-primitives.d.mts +14 -24
- package/dist/components/defaults/catalog/card-primitives.d.mts.map +1 -1
- package/dist/components/defaults/catalog/card-primitives.mjs +19 -19
- package/dist/components/defaults/catalog/card-primitives.mjs.map +1 -1
- package/dist/components/defaults/catalog/layout.mjs +7 -10
- package/dist/components/defaults/catalog/layout.mjs.map +1 -1
- package/dist/components/defaults/layout/field-wrapper.d.mts +2 -2
- package/dist/components/defaults/layout/field-wrapper.d.mts.map +1 -1
- package/dist/components/defaults/layout/field-wrapper.mjs +5 -2
- package/dist/components/defaults/layout/field-wrapper.mjs.map +1 -1
- package/dist/components/defaults/layout/group.d.mts +4 -4
- package/dist/components/defaults/layout/group.d.mts.map +1 -1
- package/dist/components/defaults/layout/group.mjs +69 -54
- package/dist/components/defaults/layout/group.mjs.map +1 -1
- package/dist/components/defaults/layout/section.d.mts +9 -4
- package/dist/components/defaults/layout/section.d.mts.map +1 -1
- package/dist/components/defaults/layout/section.mjs +11 -13
- package/dist/components/defaults/layout/section.mjs.map +1 -1
- package/dist/components/field-renderer.d.mts.map +1 -1
- package/dist/components/field-renderer.mjs +1 -1
- package/dist/components/field-renderer.mjs.map +1 -1
- package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs +30 -15
- package/dist/components/internal/LiquidEditor/ChipEditPopover.mjs.map +1 -1
- package/dist/components/internal/icons.mjs +36 -1
- package/dist/components/internal/icons.mjs.map +1 -1
- package/dist/components/internal/multi-select-popover-trigger.mjs +0 -1
- package/dist/components/internal/multi-select-popover-trigger.mjs.map +1 -1
- package/dist/components/internal/tag-chip-decoration.mjs +15 -0
- package/dist/components/internal/tag-chip-decoration.mjs.map +1 -1
- package/dist/components/ui/badge.mjs +1 -1
- package/dist/components/ui/button.d.mts +2 -2
- package/dist/components/ui/combobox.mjs +0 -1
- package/dist/components/ui/combobox.mjs.map +1 -1
- package/dist/context/pipe-catalog-card-context.d.mts +7 -0
- package/dist/context/pipe-catalog-card-context.d.mts.map +1 -1
- package/dist/context/pipe-catalog-card-context.mjs.map +1 -1
- package/dist/context/pipe-form-context.d.mts +17 -3
- package/dist/context/pipe-form-context.d.mts.map +1 -1
- package/dist/context/pipe-form-context.mjs.map +1 -1
- package/dist/context/search-catalog-card-context.d.mts +8 -0
- package/dist/context/search-catalog-card-context.d.mts.map +1 -1
- package/dist/context/search-catalog-card-context.mjs.map +1 -1
- package/dist/context/search-form-context.d.mts +17 -3
- package/dist/context/search-form-context.d.mts.map +1 -1
- package/dist/context/search-form-context.mjs.map +1 -1
- package/dist/context/searches-catalog-card-context.d.mts +8 -0
- package/dist/context/searches-catalog-card-context.d.mts.map +1 -1
- package/dist/context/searches-catalog-card-context.mjs.map +1 -1
- package/dist/hooks/use-field-error.d.mts +2 -2
- package/dist/hooks/use-field-error.d.mts.map +1 -1
- package/dist/hooks/use-field-error.mjs +7 -3
- package/dist/hooks/use-field-error.mjs.map +1 -1
- package/dist/hooks/use-form-core.d.mts +0 -3
- package/dist/hooks/use-form-core.d.mts.map +1 -1
- package/dist/hooks/use-form-core.mjs +36 -2
- package/dist/hooks/use-form-core.mjs.map +1 -1
- package/dist/hooks/use-pipe-catalog-table.d.mts +8 -8
- package/dist/hooks/use-pipe-form.d.mts +11 -0
- package/dist/hooks/use-pipe-form.d.mts.map +1 -1
- package/dist/hooks/use-pipe-form.mjs +35 -6
- package/dist/hooks/use-pipe-form.mjs.map +1 -1
- package/dist/hooks/use-search-catalog-table.d.mts +6 -6
- package/dist/hooks/use-search-form.d.mts +11 -0
- package/dist/hooks/use-search-form.d.mts.map +1 -1
- package/dist/hooks/use-search-form.mjs +35 -6
- package/dist/hooks/use-search-form.mjs.map +1 -1
- package/dist/index.d.mts +9 -8
- package/dist/index.mjs +3 -9
- package/dist/styles/pipe0-form.css +418 -38
- package/dist/types/adapters.d.mts +6 -5
- package/dist/types/adapters.d.mts.map +1 -1
- package/dist/types/catalog-adapters.d.mts +2 -2
- package/dist/types/field-props.d.mts +4 -16
- package/dist/types/field-props.d.mts.map +1 -1
- package/dist/types/form-handle.d.mts +81 -1
- package/dist/types/form-handle.d.mts.map +1 -1
- package/dist/utils/build-section-handlers.mjs +6 -2
- package/dist/utils/build-section-handlers.mjs.map +1 -1
- package/dist/utils/internal-form.mjs +28 -0
- package/dist/utils/internal-form.mjs.map +1 -0
- package/dist/widgets/avatar-group.d.mts +4 -7
- package/dist/widgets/avatar-group.d.mts.map +1 -1
- package/dist/widgets/avatar-group.mjs +13 -12
- package/dist/widgets/avatar-group.mjs.map +1 -1
- package/package.json +70 -18
- package/dist/components/compound/pipe-catalog/index.mjs +0 -15
- package/dist/components/compound/pipe-form/index.mjs +0 -11
- package/dist/components/compound/search-catalog/index.mjs +0 -14
- package/dist/components/compound/search-form/index.mjs +0 -11
- package/dist/components/compound/searches-catalog/index.mjs +0 -14
- package/dist/components/defaults/adapters/pipes-trigger-input.mjs.map +0 -1
- package/dist/components/defaults/layout/submit-button.d.mts +0 -9
- package/dist/components/defaults/layout/submit-button.d.mts.map +0 -1
- package/dist/components/defaults/layout/submit-button.mjs +0 -23
- package/dist/components/defaults/layout/submit-button.mjs.map +0 -1
- package/dist/components/defaults/toggle-advanced-button.mjs +0 -29
- package/dist/components/defaults/toggle-advanced-button.mjs.map +0 -1
- package/dist/components/ui/input-group.mjs +0 -30
- package/dist/components/ui/input-group.mjs.map +0 -1
- package/dist/context/form-customization-context.d.mts +0 -71
- package/dist/context/form-customization-context.d.mts.map +0 -1
- package/dist/context/form-customization-context.mjs +0 -114
- package/dist/context/form-customization-context.mjs.map +0 -1
- package/dist/hooks/use-disclosure.mjs +0 -35
- package/dist/hooks/use-disclosure.mjs.map +0 -1
- package/dist/utils/render-slot.d.mts +0 -44
- package/dist/utils/render-slot.d.mts.map +0 -1
- package/dist/utils/render-slot.mjs +0 -30
- package/dist/utils/render-slot.mjs.map +0 -1
- package/dist/widgets/index.mjs +0 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"section.mjs","names":[],"sources":["../../../../src/components/defaults/layout/section.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { useFormConfig } from \"../../../context/form-context.js\";\nimport { cn } from \"../../../lib/utils.js\";\nimport type {
|
|
1
|
+
{"version":3,"file":"section.mjs","names":[],"sources":["../../../../src/components/defaults/layout/section.tsx"],"sourcesContent":["import { mergeProps } from \"@base-ui/react/merge-props\";\nimport { useRender } from \"@base-ui/react/use-render\";\nimport { useFormConfig } from \"../../../context/form-context.js\";\nimport { cn } from \"../../../lib/utils.js\";\nimport type { FormSectionHandle } from \"../../../types/form-handle.js\";\n\nexport interface DefaultSectionState {\n hasErrors: boolean;\n}\n\nexport interface DefaultSectionProps extends useRender.ComponentProps<\"div\", DefaultSectionState> {\n section: FormSectionHandle;\n /**\n * Suppress the section's own header. Set when several consecutive sections\n * share an umbrella label so the label only renders above the first\n * section in the cluster (the renderer in `pipe-form/content.tsx` and\n * `search-form/content.tsx` handles this automatically).\n */\n hideLabel?: boolean;\n}\n\nexport function DefaultSection({\n section,\n children,\n className,\n render,\n hideLabel,\n ...props\n}: DefaultSectionProps) {\n const { classNames } = useFormConfig();\n const hasErrors = section.groups.some((g) => g.errorCount > 0);\n\n // Section descriptions are intentionally not rendered — the umbrella label\n // alone is enough signal, and per-section descriptions add noise once\n // multiple sections sit under one umbrella. Field-level descriptions cover\n // the cases where copy is actually load-bearing.\n const defaultContent = (\n <>\n {!hideLabel && section.label && (\n <div\n data-p0=\"section-header\"\n className={classNames?.sectionLabel ?? \"pz:flex pz:items-center pz:gap-2.5 pz:px-1\"}\n >\n <h2\n className={cn(\n \"pz:text-[10.5px] pz:font-medium pz:tracking-[0.12em] pz:uppercase pz:text-muted-foreground pz:m-0 pz:whitespace-nowrap\",\n )}\n >\n {section.label}\n </h2>\n <span aria-hidden className=\"pz:flex-1 pz:h-px pz:bg-border\" />\n </div>\n )}\n {children}\n </>\n );\n\n return useRender({\n defaultTagName: \"div\",\n render,\n state: { hasErrors },\n props: mergeProps<\"div\">(\n {\n className: cn(classNames?.section ?? \"pz:flex pz:flex-col pz:gap-2\", className),\n children: defaultContent,\n ...({\n \"data-p0\": \"section\",\n \"data-p0-section\": section.key,\n } as Record<string, string>),\n },\n props,\n ),\n });\n}\n"],"mappings":";;;;;;;AAqBA,SAAgB,eAAe,EAC7B,SACA,UACA,WACA,QACA,WACA,GAAG,SACmB;CACtB,MAAM,EAAE,eAAe,eAAe;CACtC,MAAM,YAAY,QAAQ,OAAO,MAAM,MAAM,EAAE,aAAa,EAAE;CAM9D,MAAM,iBACJ,4CACG,CAAC,aAAa,QAAQ,SACrB,qBAAC,OAAD;EACE,WAAQ;EACR,WAAW,YAAY,gBAAgB;YAFzC,CAIE,oBAAC,MAAD;GACE,WAAW,GACT,yHACD;aAEA,QAAQ;GACN,GACL,oBAAC,QAAD;GAAM;GAAY,WAAU;GAAmC,EAC3D;KAEP,SACA;AAGL,QAAO,UAAU;EACf,gBAAgB;EAChB;EACA,OAAO,EAAE,WAAW;EACpB,OAAO,WACL;GACE,WAAW,GAAG,YAAY,WAAW,gCAAgC,UAAU;GAC/E,UAAU;GAER,WAAW;GACX,mBAAmB,QAAQ;GAE9B,EACD,MACD;EACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-renderer.d.mts","names":[],"sources":["../../src/components/field-renderer.tsx"],"mappings":";;;;;iBAKS,kBAAA,CAAA;EAAqB;AAAA;EAAW,KAAA,EAAO,aAAA;AAAA,IAAmB,SAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"field-renderer.d.mts","names":[],"sources":["../../src/components/field-renderer.tsx"],"mappings":";;;;;iBAKS,kBAAA,CAAA;EAAqB;AAAA;EAAW,KAAA,EAAO,aAAA;AAAA,IAAmB,SAAA;AAAA,cA+BtD,aAAA,EAAa,OAAA,CAAA,mBAAA,QAAA,kBAAA"}
|
|
@@ -13,7 +13,7 @@ function FieldRendererInner({ field }) {
|
|
|
13
13
|
const FieldRenderer = memo(FieldRendererInner, (prev, next) => {
|
|
14
14
|
const a = prev.field;
|
|
15
15
|
const b = next.field;
|
|
16
|
-
return a.kind === b.kind && a.path === b.path && a.value === b.value && a.error === b.error && a.disabled === b.disabled && a.disabledReason === b.disabledReason && a.touched === b.touched && a.dirty === b.dirty;
|
|
16
|
+
return a.kind === b.kind && a.path === b.path && a.value === b.value && a.error === b.error && a.disabled === b.disabled && a.disabledReason === b.disabledReason && a.touched === b.touched && a.dirty === b.dirty && a.meta === b.meta;
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-renderer.mjs","names":[],"sources":["../../src/components/field-renderer.tsx"],"sourcesContent":["import { type ComponentType, memo, type ReactNode } from \"react\";\nimport { useFormConfig } from \"../context/form-context.js\";\nimport type { AnyFieldHandle } from \"../types/field-handle.js\";\nimport { defaultAdapters } from \"./defaults/adapters/index.js\";\n\nfunction FieldRendererInner({ field }: { field: AnyFieldHandle }): ReactNode {\n const { adapters } = useFormConfig();\n\n const adapter = adapters?.[field.kind] ?? defaultAdapters[field.kind];\n\n if (!adapter) {\n return null;\n }\n\n // Render as a component (not a direct call) so React Fast Refresh can track\n // the adapter's type and hot-swap it on edits.\n const Adapter = adapter as unknown as ComponentType<AnyFieldHandle>;\n return <Adapter {...field} />;\n}\n\n// `buildSectionHandles` rebuilds every field handle on every form-state\n// change, so a single keystroke causes every sibling adapter to receive a new\n// `field` reference. A custom comparator lets us skip re-rendering when the\n// load-bearing slice of the handle is identity-equal — primitive values short\n// out via `Object.is`, while object-valued kinds (include/exclude, ranges)\n// will miss and re-render, which is the acceptable tradeoff.\n//\n// Adapter swaps via `<FormProvider adapters={...}>` still propagate: context\n// changes re-render every consumer regardless of the memo decision.\nexport const FieldRenderer = memo(FieldRendererInner, (prev, next) => {\n const a = prev.field;\n const b = next.field;\n return (\n a.kind === b.kind &&\n a.path === b.path &&\n a.value === b.value &&\n a.error === b.error &&\n a.disabled === b.disabled &&\n a.disabledReason === b.disabledReason &&\n a.touched === b.touched &&\n a.dirty === b.dirty\n );\n});\n"],"mappings":";;;;;;AAKA,SAAS,mBAAmB,EAAE,SAA+C;CAC3E,MAAM,EAAE,aAAa,eAAe;CAEpC,MAAM,UAAU,WAAW,MAAM,SAAS,gBAAgB,MAAM;AAEhE,KAAI,CAAC,QACH,QAAO;AAMT,QAAO,oBADS,SACT,EAAS,GAAI,OAAS;;
|
|
1
|
+
{"version":3,"file":"field-renderer.mjs","names":[],"sources":["../../src/components/field-renderer.tsx"],"sourcesContent":["import { type ComponentType, memo, type ReactNode } from \"react\";\nimport { useFormConfig } from \"../context/form-context.js\";\nimport type { AnyFieldHandle } from \"../types/field-handle.js\";\nimport { defaultAdapters } from \"./defaults/adapters/index.js\";\n\nfunction FieldRendererInner({ field }: { field: AnyFieldHandle }): ReactNode {\n const { adapters } = useFormConfig();\n\n const adapter = adapters?.[field.kind] ?? defaultAdapters[field.kind];\n\n if (!adapter) {\n return null;\n }\n\n // Render as a component (not a direct call) so React Fast Refresh can track\n // the adapter's type and hot-swap it on edits.\n const Adapter = adapter as unknown as ComponentType<AnyFieldHandle>;\n return <Adapter {...field} />;\n}\n\n// `buildSectionHandles` rebuilds every field handle on every form-state\n// change, so a single keystroke causes every sibling adapter to receive a new\n// `field` reference. A custom comparator lets us skip re-rendering when the\n// load-bearing slice of the handle is identity-equal — primitive values short\n// out via `Object.is`, while object-valued kinds (include/exclude, ranges)\n// will miss and re-render, which is the acceptable tradeoff.\n//\n// `meta` is included so meta-only updates (e.g. `connector_input`'s\n// `filteredConnections` populating after the async `getConnections` resolver\n// resolves) actually re-render. `meta` is passed through from `formConfig`\n// which is memoized on `store` (not `watchedValues`), so its identity stays\n// stable across keystrokes and only flips when the form metadata actually\n// changes.\n//\n// Adapter swaps via `<FormProvider adapters={...}>` still propagate: context\n// changes re-render every consumer regardless of the memo decision.\nexport const FieldRenderer = memo(FieldRendererInner, (prev, next) => {\n const a = prev.field;\n const b = next.field;\n return (\n a.kind === b.kind &&\n a.path === b.path &&\n a.value === b.value &&\n a.error === b.error &&\n a.disabled === b.disabled &&\n a.disabledReason === b.disabledReason &&\n a.touched === b.touched &&\n a.dirty === b.dirty &&\n a.meta === b.meta\n );\n});\n"],"mappings":";;;;;;AAKA,SAAS,mBAAmB,EAAE,SAA+C;CAC3E,MAAM,EAAE,aAAa,eAAe;CAEpC,MAAM,UAAU,WAAW,MAAM,SAAS,gBAAgB,MAAM;AAEhE,KAAI,CAAC,QACH,QAAO;AAMT,QAAO,oBADS,SACT,EAAS,GAAI,OAAS;;AAmB/B,MAAa,gBAAgB,KAAK,qBAAqB,MAAM,SAAS;CACpE,MAAM,IAAI,KAAK;CACf,MAAM,IAAI,KAAK;AACf,QACE,EAAE,SAAS,EAAE,QACb,EAAE,SAAS,EAAE,QACb,EAAE,UAAU,EAAE,SACd,EAAE,UAAU,EAAE,SACd,EAAE,aAAa,EAAE,YACjB,EAAE,mBAAmB,EAAE,kBACvB,EAAE,YAAY,EAAE,WAChB,EAAE,UAAU,EAAE,SACd,EAAE,SAAS,EAAE;EAEf"}
|
|
@@ -4,12 +4,13 @@ import { Switch } from "../../ui/switch.mjs";
|
|
|
4
4
|
import { useFloatingElement } from "../../../hooks/use-floating-element.mjs";
|
|
5
5
|
import { useEffect, useId, useMemo, useRef, useState } from "react";
|
|
6
6
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
-
import {
|
|
7
|
+
import { Trash2 } from "lucide-react";
|
|
8
8
|
import { offset, shift } from "@floating-ui/react";
|
|
9
9
|
|
|
10
10
|
//#region src/components/internal/LiquidEditor/ChipEditPopover.tsx
|
|
11
11
|
const SIMPLE_FIELD_RE = /^\{\{\s*([a-zA-Z_][a-zA-Z0-9_.]*)\s*(\|\s*default:\s*"")?\s*\}\}$/;
|
|
12
12
|
const SECRET_RE = /^\{\{\s*SECRETS\.([A-Z][A-Z0-9_]*)\s*\}\}$/;
|
|
13
|
+
const CONSTANT_RE = /^\{\{\s*CONSTANTS\.([A-Z][A-Z0-9_]*)\s*\}\}$/;
|
|
13
14
|
const OUTPUT_BLOCK_RE = /^\{%\s*output\s+([A-Za-z_][A-Za-z0-9_]*)\s*,\s*type:\s*"(string|number|boolean|json|unknown)"\s*(?:,\s*schema:\s*"([^"]*)")?\s*(?:,\s*description:\s*"((?:[^"\\]|\\.)*)")?\s*%\}$/;
|
|
14
15
|
/**
|
|
15
16
|
* Contextual popover anchored to a chip's DOM rect. Different content per
|
|
@@ -79,6 +80,10 @@ function ChipEditPopover({ editor, target, onClose }) {
|
|
|
79
80
|
raw: target.raw,
|
|
80
81
|
remove
|
|
81
82
|
}),
|
|
83
|
+
target.kind === "constant" && /* @__PURE__ */ jsx(ConstantChipBody, {
|
|
84
|
+
raw: target.raw,
|
|
85
|
+
remove
|
|
86
|
+
}),
|
|
82
87
|
target.kind === "block" && /* @__PURE__ */ jsx(BlockChipBody, {
|
|
83
88
|
raw: target.raw,
|
|
84
89
|
replaceWith,
|
|
@@ -163,21 +168,31 @@ function SecretChipBody({ raw, remove }) {
|
|
|
163
168
|
className: "pz:text-xs pz:text-amber-700",
|
|
164
169
|
children: publicId ?? "(unknown)"
|
|
165
170
|
})]
|
|
166
|
-
}), /* @__PURE__ */ jsxs(
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
171
|
+
}), /* @__PURE__ */ jsxs(Button, {
|
|
172
|
+
type: "button",
|
|
173
|
+
variant: "outline",
|
|
174
|
+
size: "sm",
|
|
175
|
+
onClick: remove,
|
|
176
|
+
children: [/* @__PURE__ */ jsx(Trash2, { className: "pz:size-3.5 pz:mr-1" }), "Remove"]
|
|
177
|
+
})] });
|
|
178
|
+
}
|
|
179
|
+
function ConstantChipBody({ raw, remove }) {
|
|
180
|
+
const publicId = raw.match(CONSTANT_RE)?.[1];
|
|
181
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsxs("header", {
|
|
182
|
+
className: "pz:flex pz:items-center pz:justify-between pz:gap-2",
|
|
183
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
184
|
+
className: "pz:text-xs pz:font-medium pz:text-muted-foreground",
|
|
185
|
+
children: "Constant reference"
|
|
186
|
+
}), /* @__PURE__ */ jsx("code", {
|
|
187
|
+
className: "pz:text-xs pz:text-emerald-700",
|
|
188
|
+
children: publicId ?? "(unknown)"
|
|
180
189
|
})]
|
|
190
|
+
}), /* @__PURE__ */ jsxs(Button, {
|
|
191
|
+
type: "button",
|
|
192
|
+
variant: "outline",
|
|
193
|
+
size: "sm",
|
|
194
|
+
onClick: remove,
|
|
195
|
+
children: [/* @__PURE__ */ jsx(Trash2, { className: "pz:size-3.5 pz:mr-1" }), "Remove"]
|
|
181
196
|
})] });
|
|
182
197
|
}
|
|
183
198
|
function BlockChipBody({ raw, replaceWith, remove }) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChipEditPopover.mjs","names":[],"sources":["../../../../src/components/internal/LiquidEditor/ChipEditPopover.tsx"],"sourcesContent":["import { offset, shift } from \"@floating-ui/react\";\nimport type { Editor } from \"@tiptap/react\";\nimport { ExternalLink, Trash2 } from \"lucide-react\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { useFloatingElement } from \"../../../hooks/use-floating-element.js\";\nimport { Button } from \"../../ui/button.js\";\nimport { Input } from \"../../ui/input.js\";\nimport { Switch } from \"../../ui/switch.js\";\nimport type { ChipKind } from \"../tag-chip-decoration.js\";\n\nconst SIMPLE_FIELD_RE = /^\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_.]*)\\s*(\\|\\s*default:\\s*\"\")?\\s*\\}\\}$/;\nconst SECRET_RE = /^\\{\\{\\s*SECRETS\\.([A-Z][A-Z0-9_]*)\\s*\\}\\}$/;\n// Captures `name`, `type` (string|number|boolean|json|unknown), and `description`\n// from `{% output NAME, type: \"TYPE\", description: \"...\" %}` or with a `schema:`\n// arg between type and description for json. Tolerates whitespace and ordering.\nconst OUTPUT_BLOCK_RE =\n /^\\{%\\s*output\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*,\\s*type:\\s*\"(string|number|boolean|json|unknown)\"\\s*(?:,\\s*schema:\\s*\"([^\"]*)\")?\\s*(?:,\\s*description:\\s*\"((?:[^\"\\\\]|\\\\.)*)\")?\\s*%\\}$/;\n\nexport interface ChipEditTarget {\n kind: ChipKind;\n raw: string;\n from: number;\n to: number;\n rect: DOMRect;\n}\n\n/**\n * Contextual popover anchored to a chip's DOM rect. Different content per\n * chip kind:\n * - field: switch for `| default: \"\"` (simple cases only), remove.\n * - secret: publicId header, manage/remove buttons. Power users still\n * edit by hand.\n * - block (output declaration): name / type / description editors.\n *\n * On any mutation, the popover dispatches a single replaceWith transaction\n * over the chip's range, then closes itself. The Liquid serialization\n * stays identical to what would have been authored by hand.\n */\nexport function ChipEditPopover({\n editor,\n target,\n onClose,\n}: {\n editor: Editor;\n target: ChipEditTarget;\n onClose: () => void;\n}) {\n const { ref, style, isMounted, getFloatingProps } = useFloatingElement(true, target.rect, 1100, {\n placement: \"bottom-start\",\n middleware: [offset(6), shift()],\n onOpenChange(open) {\n if (!open) onClose();\n },\n dismissOptions: { outsidePress: true, outsidePressEvent: \"mousedown\" },\n });\n\n const popupRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") onClose();\n }\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n function replaceWith(next: string) {\n editor.chain().focus().insertContentAt({ from: target.from, to: target.to }, next).run();\n onClose();\n }\n\n function remove() {\n editor.chain().focus().deleteRange({ from: target.from, to: target.to }).run();\n onClose();\n }\n\n if (!isMounted) return null;\n\n return (\n <div\n ref={(el) => {\n popupRef.current = el;\n ref(el);\n }}\n style={style}\n {...getFloatingProps()}\n onMouseDown={(e) => e.stopPropagation()}\n className=\"pz:flex pz:flex-col pz:gap-2 pz:rounded-md pz:border pz:border-input pz:bg-popover pz:p-3 pz:text-popover-foreground pz:shadow-md pz:min-w-72\"\n role=\"dialog\"\n aria-label={`Edit ${target.kind} chip`}\n >\n {target.kind === \"field\" && (\n <FieldChipBody raw={target.raw} replaceWith={replaceWith} remove={remove} />\n )}\n {target.kind === \"secret\" && <SecretChipBody raw={target.raw} remove={remove} />}\n {target.kind === \"block\" && (\n <BlockChipBody raw={target.raw} replaceWith={replaceWith} remove={remove} />\n )}\n </div>\n );\n}\n\nfunction FieldChipBody({\n raw,\n replaceWith,\n remove,\n}: {\n raw: string;\n replaceWith: (next: string) => void;\n remove: () => void;\n}) {\n const match = raw.match(SIMPLE_FIELD_RE);\n const name = match?.[1];\n const allowEmpty = !!match?.[2];\n const isSimple = !!match;\n\n if (!isSimple || !name) {\n return (\n <>\n <header className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">\n Field reference (advanced)\n </header>\n <p className=\"pz:text-xs pz:text-muted-foreground\">\n This chip uses a custom Liquid filter chain. Edit the raw text in the editor to change it.\n </p>\n <pre className=\"pz:overflow-x-auto pz:rounded-sm pz:bg-muted pz:px-2 pz:py-1 pz:text-xs\">\n {raw}\n </pre>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n </>\n );\n }\n\n function toggleAllowEmpty() {\n replaceWith(allowEmpty ? `{{ ${name} }}` : `{{ ${name} | default: \"\" }}`);\n }\n\n return (\n <>\n <header className=\"pz:flex pz:items-center pz:justify-between pz:gap-2\">\n <span className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">Field reference</span>\n <code className=\"pz:text-xs pz:text-sky-700\">{name}</code>\n </header>\n <div className=\"pz:flex pz:items-center pz:justify-between pz:gap-3 pz:text-sm\">\n <span className=\"pz:flex pz:flex-col\">\n <span>Allow empty</span>\n <span className=\"pz:text-xs pz:text-muted-foreground\">\n Inserts <code>| default: \"\"</code> so missing values render as empty.\n </span>\n </span>\n <Switch checked={allowEmpty} onCheckedChange={toggleAllowEmpty} />\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n </>\n );\n}\n\nfunction SecretChipBody({ raw, remove }: { raw: string; remove: () => void }) {\n const publicId = raw.match(SECRET_RE)?.[1];\n\n return (\n <>\n <header className=\"pz:flex pz:items-center pz:justify-between pz:gap-2\">\n <span className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">Secret reference</span>\n <code className=\"pz:text-xs pz:text-amber-700\">{publicId ?? \"(unknown)\"}</code>\n </header>\n <div className=\"pz:flex pz:items-center pz:gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => window.open(\"/secrets\", \"_blank\", \"noopener\")}\n >\n <ExternalLink className=\"pz:size-3.5 pz:mr-1\" />\n Manage secrets\n </Button>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n </div>\n </>\n );\n}\n\nfunction BlockChipBody({\n raw,\n replaceWith,\n remove,\n}: {\n raw: string;\n replaceWith: (next: string) => void;\n remove: () => void;\n}) {\n const initial = useMemo(() => {\n const m = raw.match(OUTPUT_BLOCK_RE);\n if (!m) return null;\n const [, name, type, schema, description] = m;\n return {\n name,\n type: type as \"string\" | \"number\" | \"boolean\" | \"json\" | \"unknown\",\n schema: schema ?? \"\",\n description: description ? description.replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\") : \"\",\n };\n }, [raw]);\n\n const [name, setName] = useState(initial?.name ?? \"\");\n const [type, setType] = useState<\"string\" | \"number\" | \"boolean\" | \"json\" | \"unknown\">(\n initial?.type ?? \"string\",\n );\n const [schema, setSchema] = useState(initial?.schema ?? \"\");\n const [description, setDescription] = useState(initial?.description ?? \"\");\n const idPrefix = useId();\n const nameId = `${idPrefix}-name`;\n const typeId = `${idPrefix}-type`;\n const schemaId = `${idPrefix}-schema`;\n const descId = `${idPrefix}-desc`;\n\n if (!initial) {\n return (\n <>\n <header className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">\n Block (advanced)\n </header>\n <p className=\"pz:text-xs pz:text-muted-foreground\">\n This block uses a non-standard form. Edit the raw text in the editor.\n </p>\n <pre className=\"pz:overflow-x-auto pz:rounded-sm pz:bg-muted pz:px-2 pz:py-1 pz:text-xs\">\n {raw}\n </pre>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n </>\n );\n }\n\n function save() {\n if (!name.trim()) return;\n const escaped = description.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n const parts = [`{% output ${name.trim()}`, `type: \"${type}\"`];\n if (type === \"json\" && schema.trim()) parts.push(`schema: \"${schema.trim()}\"`);\n parts.push(`description: \"${escaped}\"`);\n replaceWith(`${parts.join(\", \")} %}`);\n }\n\n return (\n <>\n <header className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">\n Output declaration\n </header>\n <label htmlFor={nameId} className=\"pz:flex pz:flex-col pz:gap-1 pz:text-xs\">\n <span>Name</span>\n <Input\n id={nameId}\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"FIELD_NAME\"\n />\n </label>\n <label htmlFor={typeId} className=\"pz:flex pz:flex-col pz:gap-1 pz:text-xs\">\n <span>Type</span>\n <select\n id={typeId}\n value={type}\n onChange={(e) =>\n setType(e.target.value as \"string\" | \"number\" | \"boolean\" | \"json\" | \"unknown\")\n }\n className=\"pz:rounded-sm pz:border pz:border-input pz:bg-transparent pz:px-2 pz:py-1 pz:text-sm\"\n >\n <option value=\"string\">string</option>\n <option value=\"number\">number</option>\n <option value=\"boolean\">boolean</option>\n <option value=\"json\">json</option>\n <option value=\"unknown\">unknown</option>\n </select>\n </label>\n {type === \"json\" && (\n <label htmlFor={schemaId} className=\"pz:flex pz:flex-col pz:gap-1 pz:text-xs\">\n <span>Schema</span>\n <Input\n id={schemaId}\n value={schema}\n onChange={(e) => setSchema(e.target.value)}\n placeholder=\"SCHEMA_NAME\"\n />\n </label>\n )}\n <label htmlFor={descId} className=\"pz:flex pz:flex-col pz:gap-1 pz:text-xs\">\n <span>Description</span>\n <Input id={descId} value={description} onChange={(e) => setDescription(e.target.value)} />\n </label>\n <div className=\"pz:flex pz:items-center pz:justify-between pz:gap-2 pz:pt-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n Save\n </Button>\n </div>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;AAUA,MAAM,kBAAkB;AACxB,MAAM,YAAY;AAIlB,MAAM,kBACJ;;;;;;;;;;;;;AAsBF,SAAgB,gBAAgB,EAC9B,QACA,QACA,WAKC;CACD,MAAM,EAAE,KAAK,OAAO,WAAW,qBAAqB,mBAAmB,MAAM,OAAO,MAAM,MAAM;EAC9F,WAAW;EACX,YAAY,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC;EAChC,aAAa,MAAM;AACjB,OAAI,CAAC,KAAM,UAAS;;EAEtB,gBAAgB;GAAE,cAAc;GAAM,mBAAmB;GAAa;EACvE,CAAC;CAEF,MAAM,WAAW,OAA8B,KAAK;AAEpD,iBAAgB;EACd,SAAS,MAAM,GAAkB;AAC/B,OAAI,EAAE,QAAQ,SAAU,UAAS;;AAEnC,SAAO,iBAAiB,WAAW,MAAM;AACzC,eAAa,OAAO,oBAAoB,WAAW,MAAM;IACxD,CAAC,QAAQ,CAAC;CAEb,SAAS,YAAY,MAAc;AACjC,SAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB;GAAE,MAAM,OAAO;GAAM,IAAI,OAAO;GAAI,EAAE,KAAK,CAAC,KAAK;AACxF,WAAS;;CAGX,SAAS,SAAS;AAChB,SAAO,OAAO,CAAC,OAAO,CAAC,YAAY;GAAE,MAAM,OAAO;GAAM,IAAI,OAAO;GAAI,CAAC,CAAC,KAAK;AAC9E,WAAS;;AAGX,KAAI,CAAC,UAAW,QAAO;AAEvB,QACE,qBAAC,OAAD;EACE,MAAM,OAAO;AACX,YAAS,UAAU;AACnB,OAAI,GAAG;;EAEF;EACP,GAAI,kBAAkB;EACtB,cAAc,MAAM,EAAE,iBAAiB;EACvC,WAAU;EACV,MAAK;EACL,cAAY,QAAQ,OAAO,KAAK;YAVlC;GAYG,OAAO,SAAS,WACf,oBAAC,eAAD;IAAe,KAAK,OAAO;IAAkB;IAAqB;IAAU;GAE7E,OAAO,SAAS,YAAY,oBAAC,gBAAD;IAAgB,KAAK,OAAO;IAAa;IAAU;GAC/E,OAAO,SAAS,WACf,oBAAC,eAAD;IAAe,KAAK,OAAO;IAAkB;IAAqB;IAAU;GAE1E;;;AAIV,SAAS,cAAc,EACrB,KACA,aACA,UAKC;CACD,MAAM,QAAQ,IAAI,MAAM,gBAAgB;CACxC,MAAM,OAAO,QAAQ;CACrB,MAAM,aAAa,CAAC,CAAC,QAAQ;AAG7B,KAAI,CAFa,CAAC,CAAC,SAEF,CAAC,KAChB,QACE;EACE,oBAAC,UAAD;GAAQ,WAAU;aAAqD;GAE9D;EACT,oBAAC,KAAD;GAAG,WAAU;aAAsC;GAE/C;EACJ,oBAAC,OAAD;GAAK,WAAU;aACZ;GACG;EACN,qBAAC,QAAD;GAAQ,MAAK;GAAS,SAAQ;GAAU,MAAK;GAAK,SAAS;aAA3D,CACE,oBAAC,QAAD,EAAQ,WAAU,uBAAwB,YAEnC;;EACR;CAIP,SAAS,mBAAmB;AAC1B,cAAY,aAAa,MAAM,KAAK,OAAO,MAAM,KAAK,mBAAmB;;AAG3E,QACE;EACE,qBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,oBAAC,QAAD;IAAM,WAAU;cAAqD;IAAsB,GAC3F,oBAAC,QAAD;IAAM,WAAU;cAA8B;IAAY,EACnD;;EACT,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,qBAAC,QAAD;IAAM,WAAU;cAAhB,CACE,oBAAC,QAAD,YAAM,eAAkB,GACxB,qBAAC,QAAD;KAAM,WAAU;eAAhB;MAAsD;MAC5C,oBAAC,QAAD,YAAM,mBAAoB;;MAC7B;OACF;OACP,oBAAC,QAAD;IAAQ,SAAS;IAAY,iBAAiB;IAAoB,EAC9D;;EACN,qBAAC,QAAD;GAAQ,MAAK;GAAS,SAAQ;GAAU,MAAK;GAAK,SAAS;aAA3D,CACE,oBAAC,QAAD,EAAQ,WAAU,uBAAwB,YAEnC;;EACR;;AAIP,SAAS,eAAe,EAAE,KAAK,UAA+C;CAC5E,MAAM,WAAW,IAAI,MAAM,UAAU,GAAG;AAExC,QACE,8CACE,qBAAC,UAAD;EAAQ,WAAU;YAAlB,CACE,oBAAC,QAAD;GAAM,WAAU;aAAqD;GAAuB,GAC5F,oBAAC,QAAD;GAAM,WAAU;aAAgC,YAAY;GAAmB,EACxE;KACT,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,qBAAC,QAAD;GACE,MAAK;GACL,SAAQ;GACR,MAAK;GACL,eAAe,OAAO,KAAK,YAAY,UAAU,WAAW;aAJ9D,CAME,oBAAC,cAAD,EAAc,WAAU,uBAAwB,oBAEzC;MACT,qBAAC,QAAD;GAAQ,MAAK;GAAS,SAAQ;GAAU,MAAK;GAAK,SAAS;aAA3D,CACE,oBAAC,QAAD,EAAQ,WAAU,uBAAwB,YAEnC;KACL;IACL;;AAIP,SAAS,cAAc,EACrB,KACA,aACA,UAKC;CACD,MAAM,UAAU,cAAc;EAC5B,MAAM,IAAI,IAAI,MAAM,gBAAgB;AACpC,MAAI,CAAC,EAAG,QAAO;EACf,MAAM,GAAG,MAAM,MAAM,QAAQ,eAAe;AAC5C,SAAO;GACL;GACM;GACN,QAAQ,UAAU;GAClB,aAAa,cAAc,YAAY,QAAQ,QAAQ,KAAI,CAAC,QAAQ,SAAS,KAAK,GAAG;GACtF;IACA,CAAC,IAAI,CAAC;CAET,MAAM,CAAC,MAAM,WAAW,SAAS,SAAS,QAAQ,GAAG;CACrD,MAAM,CAAC,MAAM,WAAW,SACtB,SAAS,QAAQ,SAClB;CACD,MAAM,CAAC,QAAQ,aAAa,SAAS,SAAS,UAAU,GAAG;CAC3D,MAAM,CAAC,aAAa,kBAAkB,SAAS,SAAS,eAAe,GAAG;CAC1E,MAAM,WAAW,OAAO;CACxB,MAAM,SAAS,GAAG,SAAS;CAC3B,MAAM,SAAS,GAAG,SAAS;CAC3B,MAAM,WAAW,GAAG,SAAS;CAC7B,MAAM,SAAS,GAAG,SAAS;AAE3B,KAAI,CAAC,QACH,QACE;EACE,oBAAC,UAAD;GAAQ,WAAU;aAAqD;GAE9D;EACT,oBAAC,KAAD;GAAG,WAAU;aAAsC;GAE/C;EACJ,oBAAC,OAAD;GAAK,WAAU;aACZ;GACG;EACN,qBAAC,QAAD;GAAQ,MAAK;GAAS,SAAQ;GAAU,MAAK;GAAK,SAAS;aAA3D,CACE,oBAAC,QAAD,EAAQ,WAAU,uBAAwB,YAEnC;;EACR;CAIP,SAAS,OAAO;AACd,MAAI,CAAC,KAAK,MAAM,CAAE;EAClB,MAAM,UAAU,YAAY,QAAQ,OAAO,OAAO,CAAC,QAAQ,MAAM,OAAM;EACvE,MAAM,QAAQ,CAAC,aAAa,KAAK,MAAM,IAAI,UAAU,KAAK,GAAG;AAC7D,MAAI,SAAS,UAAU,OAAO,MAAM,CAAE,OAAM,KAAK,YAAY,OAAO,MAAM,CAAC,GAAG;AAC9E,QAAM,KAAK,iBAAiB,QAAQ,GAAG;AACvC,cAAY,GAAG,MAAM,KAAK,KAAK,CAAC,KAAK;;AAGvC,QACE;EACE,oBAAC,UAAD;GAAQ,WAAU;aAAqD;GAE9D;EACT,qBAAC,SAAD;GAAO,SAAS;GAAQ,WAAU;aAAlC,CACE,oBAAC,QAAD,YAAM,QAAW,GACjB,oBAAC,OAAD;IACE,IAAI;IACJ,OAAO;IACP,WAAW,MAAM,QAAQ,EAAE,OAAO,MAAM;IACxC,aAAY;IACZ,EACI;;EACR,qBAAC,SAAD;GAAO,SAAS;GAAQ,WAAU;aAAlC,CACE,oBAAC,QAAD,YAAM,QAAW,GACjB,qBAAC,UAAD;IACE,IAAI;IACJ,OAAO;IACP,WAAW,MACT,QAAQ,EAAE,OAAO,MAA8D;IAEjF,WAAU;cANZ;KAQE,oBAAC,UAAD;MAAQ,OAAM;gBAAS;MAAe;KACtC,oBAAC,UAAD;MAAQ,OAAM;gBAAS;MAAe;KACtC,oBAAC,UAAD;MAAQ,OAAM;gBAAU;MAAgB;KACxC,oBAAC,UAAD;MAAQ,OAAM;gBAAO;MAAa;KAClC,oBAAC,UAAD;MAAQ,OAAM;gBAAU;MAAgB;KACjC;MACH;;EACP,SAAS,UACR,qBAAC,SAAD;GAAO,SAAS;GAAU,WAAU;aAApC,CACE,oBAAC,QAAD,YAAM,UAAa,GACnB,oBAAC,OAAD;IACE,IAAI;IACJ,OAAO;IACP,WAAW,MAAM,UAAU,EAAE,OAAO,MAAM;IAC1C,aAAY;IACZ,EACI;;EAEV,qBAAC,SAAD;GAAO,SAAS;GAAQ,WAAU;aAAlC,CACE,oBAAC,QAAD,YAAM,eAAkB,GACxB,oBAAC,OAAD;IAAO,IAAI;IAAQ,OAAO;IAAa,WAAW,MAAM,eAAe,EAAE,OAAO,MAAM;IAAI,EACpF;;EACR,qBAAC,OAAD;GAAK,WAAU;aAAf,CACE,qBAAC,QAAD;IAAQ,MAAK;IAAS,SAAQ;IAAQ,MAAK;IAAK,SAAS;cAAzD,CACE,oBAAC,QAAD,EAAQ,WAAU,uBAAwB,YAEnC;OACT,oBAAC,QAAD;IAAQ,MAAK;IAAS,MAAK;IAAK,SAAS;cAAM;IAEtC,EACL;;EACL"}
|
|
1
|
+
{"version":3,"file":"ChipEditPopover.mjs","names":[],"sources":["../../../../src/components/internal/LiquidEditor/ChipEditPopover.tsx"],"sourcesContent":["import { offset, shift } from \"@floating-ui/react\";\nimport type { Editor } from \"@tiptap/react\";\nimport { Trash2 } from \"lucide-react\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\nimport { useFloatingElement } from \"../../../hooks/use-floating-element.js\";\nimport { Button } from \"../../ui/button.js\";\nimport { Input } from \"../../ui/input.js\";\nimport { Switch } from \"../../ui/switch.js\";\nimport type { ChipKind } from \"../tag-chip-decoration.js\";\n\nconst SIMPLE_FIELD_RE = /^\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_.]*)\\s*(\\|\\s*default:\\s*\"\")?\\s*\\}\\}$/;\nconst SECRET_RE = /^\\{\\{\\s*SECRETS\\.([A-Z][A-Z0-9_]*)\\s*\\}\\}$/;\nconst CONSTANT_RE = /^\\{\\{\\s*CONSTANTS\\.([A-Z][A-Z0-9_]*)\\s*\\}\\}$/;\n// Captures `name`, `type` (string|number|boolean|json|unknown), and `description`\n// from `{% output NAME, type: \"TYPE\", description: \"...\" %}` or with a `schema:`\n// arg between type and description for json. Tolerates whitespace and ordering.\nconst OUTPUT_BLOCK_RE =\n /^\\{%\\s*output\\s+([A-Za-z_][A-Za-z0-9_]*)\\s*,\\s*type:\\s*\"(string|number|boolean|json|unknown)\"\\s*(?:,\\s*schema:\\s*\"([^\"]*)\")?\\s*(?:,\\s*description:\\s*\"((?:[^\"\\\\]|\\\\.)*)\")?\\s*%\\}$/;\n\nexport interface ChipEditTarget {\n kind: ChipKind;\n raw: string;\n from: number;\n to: number;\n rect: DOMRect;\n}\n\n/**\n * Contextual popover anchored to a chip's DOM rect. Different content per\n * chip kind:\n * - field: switch for `| default: \"\"` (simple cases only), remove.\n * - secret: publicId header, manage/remove buttons. Power users still\n * edit by hand.\n * - block (output declaration): name / type / description editors.\n *\n * On any mutation, the popover dispatches a single replaceWith transaction\n * over the chip's range, then closes itself. The Liquid serialization\n * stays identical to what would have been authored by hand.\n */\nexport function ChipEditPopover({\n editor,\n target,\n onClose,\n}: {\n editor: Editor;\n target: ChipEditTarget;\n onClose: () => void;\n}) {\n const { ref, style, isMounted, getFloatingProps } = useFloatingElement(true, target.rect, 1100, {\n placement: \"bottom-start\",\n middleware: [offset(6), shift()],\n onOpenChange(open) {\n if (!open) onClose();\n },\n dismissOptions: { outsidePress: true, outsidePressEvent: \"mousedown\" },\n });\n\n const popupRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") onClose();\n }\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n }, [onClose]);\n\n function replaceWith(next: string) {\n editor.chain().focus().insertContentAt({ from: target.from, to: target.to }, next).run();\n onClose();\n }\n\n function remove() {\n editor.chain().focus().deleteRange({ from: target.from, to: target.to }).run();\n onClose();\n }\n\n if (!isMounted) return null;\n\n return (\n <div\n ref={(el) => {\n popupRef.current = el;\n ref(el);\n }}\n style={style}\n {...getFloatingProps()}\n onMouseDown={(e) => e.stopPropagation()}\n className=\"pz:flex pz:flex-col pz:gap-2 pz:rounded-md pz:border pz:border-input pz:bg-popover pz:p-3 pz:text-popover-foreground pz:shadow-md pz:min-w-72\"\n role=\"dialog\"\n aria-label={`Edit ${target.kind} chip`}\n >\n {target.kind === \"field\" && (\n <FieldChipBody raw={target.raw} replaceWith={replaceWith} remove={remove} />\n )}\n {target.kind === \"secret\" && <SecretChipBody raw={target.raw} remove={remove} />}\n {target.kind === \"constant\" && <ConstantChipBody raw={target.raw} remove={remove} />}\n {target.kind === \"block\" && (\n <BlockChipBody raw={target.raw} replaceWith={replaceWith} remove={remove} />\n )}\n </div>\n );\n}\n\nfunction FieldChipBody({\n raw,\n replaceWith,\n remove,\n}: {\n raw: string;\n replaceWith: (next: string) => void;\n remove: () => void;\n}) {\n const match = raw.match(SIMPLE_FIELD_RE);\n const name = match?.[1];\n const allowEmpty = !!match?.[2];\n const isSimple = !!match;\n\n if (!isSimple || !name) {\n return (\n <>\n <header className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">\n Field reference (advanced)\n </header>\n <p className=\"pz:text-xs pz:text-muted-foreground\">\n This chip uses a custom Liquid filter chain. Edit the raw text in the editor to change it.\n </p>\n <pre className=\"pz:overflow-x-auto pz:rounded-sm pz:bg-muted pz:px-2 pz:py-1 pz:text-xs\">\n {raw}\n </pre>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n </>\n );\n }\n\n function toggleAllowEmpty() {\n replaceWith(allowEmpty ? `{{ ${name} }}` : `{{ ${name} | default: \"\" }}`);\n }\n\n return (\n <>\n <header className=\"pz:flex pz:items-center pz:justify-between pz:gap-2\">\n <span className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">Field reference</span>\n <code className=\"pz:text-xs pz:text-sky-700\">{name}</code>\n </header>\n <div className=\"pz:flex pz:items-center pz:justify-between pz:gap-3 pz:text-sm\">\n <span className=\"pz:flex pz:flex-col\">\n <span>Allow empty</span>\n <span className=\"pz:text-xs pz:text-muted-foreground\">\n Inserts <code>| default: \"\"</code> so missing values render as empty.\n </span>\n </span>\n <Switch checked={allowEmpty} onCheckedChange={toggleAllowEmpty} />\n </div>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n </>\n );\n}\n\nfunction SecretChipBody({ raw, remove }: { raw: string; remove: () => void }) {\n const publicId = raw.match(SECRET_RE)?.[1];\n\n return (\n <>\n <header className=\"pz:flex pz:items-center pz:justify-between pz:gap-2\">\n <span className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">Secret reference</span>\n <code className=\"pz:text-xs pz:text-amber-700\">{publicId ?? \"(unknown)\"}</code>\n </header>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n </>\n );\n}\n\nfunction ConstantChipBody({ raw, remove }: { raw: string; remove: () => void }) {\n const publicId = raw.match(CONSTANT_RE)?.[1];\n\n return (\n <>\n <header className=\"pz:flex pz:items-center pz:justify-between pz:gap-2\">\n <span className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">\n Constant reference\n </span>\n <code className=\"pz:text-xs pz:text-emerald-700\">{publicId ?? \"(unknown)\"}</code>\n </header>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n </>\n );\n}\n\nfunction BlockChipBody({\n raw,\n replaceWith,\n remove,\n}: {\n raw: string;\n replaceWith: (next: string) => void;\n remove: () => void;\n}) {\n const initial = useMemo(() => {\n const m = raw.match(OUTPUT_BLOCK_RE);\n if (!m) return null;\n const [, name, type, schema, description] = m;\n return {\n name,\n type: type as \"string\" | \"number\" | \"boolean\" | \"json\" | \"unknown\",\n schema: schema ?? \"\",\n description: description ? description.replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, \"\\\\\") : \"\",\n };\n }, [raw]);\n\n const [name, setName] = useState(initial?.name ?? \"\");\n const [type, setType] = useState<\"string\" | \"number\" | \"boolean\" | \"json\" | \"unknown\">(\n initial?.type ?? \"string\",\n );\n const [schema, setSchema] = useState(initial?.schema ?? \"\");\n const [description, setDescription] = useState(initial?.description ?? \"\");\n const idPrefix = useId();\n const nameId = `${idPrefix}-name`;\n const typeId = `${idPrefix}-type`;\n const schemaId = `${idPrefix}-schema`;\n const descId = `${idPrefix}-desc`;\n\n if (!initial) {\n return (\n <>\n <header className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">\n Block (advanced)\n </header>\n <p className=\"pz:text-xs pz:text-muted-foreground\">\n This block uses a non-standard form. Edit the raw text in the editor.\n </p>\n <pre className=\"pz:overflow-x-auto pz:rounded-sm pz:bg-muted pz:px-2 pz:py-1 pz:text-xs\">\n {raw}\n </pre>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n </>\n );\n }\n\n function save() {\n if (!name.trim()) return;\n const escaped = description.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n const parts = [`{% output ${name.trim()}`, `type: \"${type}\"`];\n if (type === \"json\" && schema.trim()) parts.push(`schema: \"${schema.trim()}\"`);\n parts.push(`description: \"${escaped}\"`);\n replaceWith(`${parts.join(\", \")} %}`);\n }\n\n return (\n <>\n <header className=\"pz:text-xs pz:font-medium pz:text-muted-foreground\">\n Output declaration\n </header>\n <label htmlFor={nameId} className=\"pz:flex pz:flex-col pz:gap-1 pz:text-xs\">\n <span>Name</span>\n <Input\n id={nameId}\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"FIELD_NAME\"\n />\n </label>\n <label htmlFor={typeId} className=\"pz:flex pz:flex-col pz:gap-1 pz:text-xs\">\n <span>Type</span>\n <select\n id={typeId}\n value={type}\n onChange={(e) =>\n setType(e.target.value as \"string\" | \"number\" | \"boolean\" | \"json\" | \"unknown\")\n }\n className=\"pz:rounded-sm pz:border pz:border-input pz:bg-transparent pz:px-2 pz:py-1 pz:text-sm\"\n >\n <option value=\"string\">string</option>\n <option value=\"number\">number</option>\n <option value=\"boolean\">boolean</option>\n <option value=\"json\">json</option>\n <option value=\"unknown\">unknown</option>\n </select>\n </label>\n {type === \"json\" && (\n <label htmlFor={schemaId} className=\"pz:flex pz:flex-col pz:gap-1 pz:text-xs\">\n <span>Schema</span>\n <Input\n id={schemaId}\n value={schema}\n onChange={(e) => setSchema(e.target.value)}\n placeholder=\"SCHEMA_NAME\"\n />\n </label>\n )}\n <label htmlFor={descId} className=\"pz:flex pz:flex-col pz:gap-1 pz:text-xs\">\n <span>Description</span>\n <Input id={descId} value={description} onChange={(e) => setDescription(e.target.value)} />\n </label>\n <div className=\"pz:flex pz:items-center pz:justify-between pz:gap-2 pz:pt-1\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={remove}>\n <Trash2 className=\"pz:size-3.5 pz:mr-1\" />\n Remove\n </Button>\n <Button type=\"button\" size=\"sm\" onClick={save}>\n Save\n </Button>\n </div>\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -125,7 +125,42 @@ function IconCheck(props) {
|
|
|
125
125
|
children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" })
|
|
126
126
|
});
|
|
127
127
|
}
|
|
128
|
+
function IconEye(props) {
|
|
129
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
130
|
+
...defaults,
|
|
131
|
+
...props,
|
|
132
|
+
children: [/* @__PURE__ */ jsx("path", { d: "M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0" }), /* @__PURE__ */ jsx("circle", {
|
|
133
|
+
cx: "12",
|
|
134
|
+
cy: "12",
|
|
135
|
+
r: "3"
|
|
136
|
+
})]
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
function IconEyeOff(props) {
|
|
140
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
141
|
+
...defaults,
|
|
142
|
+
...props,
|
|
143
|
+
children: [
|
|
144
|
+
/* @__PURE__ */ jsx("path", { d: "M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49" }),
|
|
145
|
+
/* @__PURE__ */ jsx("path", { d: "M14.084 14.158a3 3 0 0 1-4.242-4.242" }),
|
|
146
|
+
/* @__PURE__ */ jsx("path", { d: "M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143" }),
|
|
147
|
+
/* @__PURE__ */ jsx("path", { d: "m2 2 20 20" })
|
|
148
|
+
]
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
function IconRefresh(props) {
|
|
152
|
+
return /* @__PURE__ */ jsxs("svg", {
|
|
153
|
+
...defaults,
|
|
154
|
+
...props,
|
|
155
|
+
children: [
|
|
156
|
+
/* @__PURE__ */ jsx("path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8" }),
|
|
157
|
+
/* @__PURE__ */ jsx("path", { d: "M21 3v5h-5" }),
|
|
158
|
+
/* @__PURE__ */ jsx("path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16" }),
|
|
159
|
+
/* @__PURE__ */ jsx("path", { d: "M8 16H3v5" })
|
|
160
|
+
]
|
|
161
|
+
});
|
|
162
|
+
}
|
|
128
163
|
|
|
129
164
|
//#endregion
|
|
130
|
-
export { IconCheck, IconChevronDown, IconGripVertical, IconInfo, IconLock, IconMinus, IconPencil, IconPlus, IconTrash };
|
|
165
|
+
export { IconCheck, IconChevronDown, IconEye, IconEyeOff, IconGripVertical, IconInfo, IconLock, IconMinus, IconPencil, IconPlus, IconRefresh, IconTrash };
|
|
131
166
|
//# sourceMappingURL=icons.mjs.map
|
|
@@ -1 +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"}
|
|
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\nexport function IconChevronRight(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\nexport function IconEye(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function IconEyeOff(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n\nexport function IconRefresh(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </svg>\n );\n}\n\nexport function IconBraces(props: IconProps) {\n return (\n <svg {...defaults} {...props}>\n <path d=\"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5a2 2 0 0 0 2 2h1\" />\n <path d=\"M16 21h1a2 2 0 0 0 2-2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\" />\n </svg>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-select-popover-trigger.mjs","names":[],"sources":["../../../src/components/internal/multi-select-popover-trigger.tsx"],"sourcesContent":["import type { WidgetsByKind } from \"@pipe0/base\";\nimport { type RankingInfo, rankItem } from \"@tanstack/match-sorter-utils\";\nimport type { KeyboardEvent, ReactNode, Ref } from \"react\";\nimport { cn } from \"../../lib/utils.js\";\n\nexport interface PayloadOption {\n value: string;\n label: string;\n widgets?: WidgetsByKind;\n}\n\nexport type RankedOption = PayloadOption & { ranking: RankingInfo };\n\n/**\n * Rank-filter an option list using match-sorter-utils.\n * Returns options sorted by descending rank, empty `input` returns all options\n * (match-sorter assigns all passing).\n */\nexport function filterOptions(options: PayloadOption[], input: string): PayloadOption[] {\n if (!input) return options;\n return options\n .map((option) => {\n const labelRank = rankItem(option.label, input);\n const valueRank = rankItem(option.value, input);\n const ranking = labelRank.rank > valueRank.rank ? labelRank : valueRank;\n return ranking.passed ? { ...option, ranking } : null;\n })\n .filter((o): o is RankedOption => o !== null)\n .sort((a, b) => b.ranking.rank - a.ranking.rank);\n}\n\ninterface MultiSelectPopoverTriggerProps {\n createdValues: string[];\n labelFor?: (value: string) => string;\n onRemove: (item: string) => void;\n onAdd?: (item: string) => void;\n onFocus?: () => void;\n inputValue: string;\n onInputValueChange: (v: string) => void;\n placeholder?: string;\n inputRef: Ref<HTMLInputElement>;\n disableSearch?: boolean;\n ariaInvalid?: boolean;\n disabled?: boolean;\n allowCreate?: boolean;\n /**\n * When provided the trigger renders the chip row only and delegates the\n * search input to the caller (used when embedding inside `<Command>`).\n */\n children?: ReactNode;\n}\n\n/**\n * Chip row + embedded search input that triggers a Popover/Command.\n *\n * - Click anywhere to focus the embedded input and open the popover.\n * - Backspace on empty input removes the last chip.\n * - Enter adds the trimmed input (when `allowCreate` + `onAdd` provided).\n */\nexport function MultiSelectPopoverTrigger({\n createdValues,\n labelFor,\n onRemove,\n onAdd,\n onFocus,\n inputValue,\n onInputValueChange,\n placeholder,\n inputRef,\n disableSearch = false,\n ariaInvalid,\n disabled,\n allowCreate = false,\n}: MultiSelectPopoverTriggerProps) {\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\" && createdValues.length > 0 && inputValue === \"\") {\n e.preventDefault();\n onRemove(createdValues[createdValues.length - 1]);\n return;\n }\n if (e.key === \"Enter\" && allowCreate && onAdd) {\n const trimmed = inputValue.trim();\n if (trimmed) {\n e.preventDefault();\n onAdd(trimmed);\n }\n }\n };\n\n return (\n <div\n role=\"combobox\"\n aria-invalid={ariaInvalid || undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n \"pz:flex pz:flex-wrap pz:items-center pz:gap-1 pz:rounded-md pz:border pz:border-input pz:bg-transparent pz:min-h-9 pz:px-2 pz:py-1 pz:shadow-xs pz:cursor-text\",\n \"pz:focus-within:ring-4 pz:focus-within:ring-ring/10 pz:focus-within:outline-1 pz:focus-within:outline-ring/50\",\n \"pz:aria-invalid:border-destructive/60 pz:aria-invalid:ring-destructive/20\",\n disabled && \"pz:opacity-60 pz:cursor-not-allowed\",\n )}\n onMouseDown={(e) => {\n // avoid stealing focus from child remove buttons\n if ((e.target as HTMLElement).closest(\"button\")) return;\n if (disabled) return;\n onFocus?.();\n // Defer to the next tick so popover trigger registers the click first.\n setTimeout(() => {\n if (inputRef && \"current\" in inputRef && inputRef.current !== null) {\n inputRef.current.focus();\n }\n }, 0);\n }}\n >\n {createdValues.map((item) => (\n <span\n key={item}\n className=\"pz:inline-flex pz:items-center pz:gap-1 pz:rounded-sm pz:bg-secondary pz:text-secondary-foreground pz:px-2 pz:py-0.5 pz:text-xs\"\n >\n {labelFor ? labelFor(item) : item}\n <button\n type=\"button\"\n className=\"pz:opacity-60 pz:hover:opacity-100 pz:cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove(item);\n }}\n aria-label={`Remove ${labelFor ? labelFor(item) : item}`}\n >\n ×\n </button>\n </span>\n ))}\n {!disableSearch && (\n <input\n ref={inputRef}\n type=\"text\"\n className=\"pz:flex-1 pz:min-w-[80px] pz:bg-transparent pz:text-sm pz:outline-none pz:placeholder:text-muted-foreground\"\n value={inputValue}\n onChange={(e) => onInputValueChange(e.target.value)}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n placeholder={createdValues.length === 0 ? placeholder : undefined}\n disabled={disabled}\n />\n )}\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"multi-select-popover-trigger.mjs","names":[],"sources":["../../../src/components/internal/multi-select-popover-trigger.tsx"],"sourcesContent":["import type { WidgetsByKind } from \"@pipe0/base\";\nimport { type RankingInfo, rankItem } from \"@tanstack/match-sorter-utils\";\nimport type { KeyboardEvent, ReactNode, Ref } from \"react\";\nimport { cn } from \"../../lib/utils.js\";\n\nexport interface PayloadOption {\n value: string;\n label: string;\n widgets?: WidgetsByKind;\n}\n\nexport type RankedOption = PayloadOption & { ranking: RankingInfo };\n\n/**\n * Rank-filter an option list using match-sorter-utils.\n * Returns options sorted by descending rank, empty `input` returns all options\n * (match-sorter assigns all passing).\n */\nexport function filterOptions(options: PayloadOption[], input: string): PayloadOption[] {\n if (!input) return options;\n return options\n .map((option) => {\n const labelRank = rankItem(option.label, input);\n const valueRank = rankItem(option.value, input);\n const ranking = labelRank.rank > valueRank.rank ? labelRank : valueRank;\n return ranking.passed ? { ...option, ranking } : null;\n })\n .filter((o): o is RankedOption => o !== null)\n .sort((a, b) => b.ranking.rank - a.ranking.rank);\n}\n\ninterface MultiSelectPopoverTriggerProps {\n createdValues: string[];\n labelFor?: (value: string) => string;\n onRemove: (item: string) => void;\n onAdd?: (item: string) => void;\n onFocus?: () => void;\n inputValue: string;\n onInputValueChange: (v: string) => void;\n placeholder?: string;\n inputRef: Ref<HTMLInputElement>;\n disableSearch?: boolean;\n ariaInvalid?: boolean;\n disabled?: boolean;\n allowCreate?: boolean;\n /**\n * When provided the trigger renders the chip row only and delegates the\n * search input to the caller (used when embedding inside `<Command>`).\n */\n children?: ReactNode;\n}\n\n/**\n * Chip row + embedded search input that triggers a Popover/Command.\n *\n * - Click anywhere to focus the embedded input and open the popover.\n * - Backspace on empty input removes the last chip.\n * - Enter adds the trimmed input (when `allowCreate` + `onAdd` provided).\n */\nexport function MultiSelectPopoverTrigger({\n createdValues,\n labelFor,\n onRemove,\n onAdd,\n onFocus,\n inputValue,\n onInputValueChange,\n placeholder,\n inputRef,\n disableSearch = false,\n ariaInvalid,\n disabled,\n allowCreate = false,\n}: MultiSelectPopoverTriggerProps) {\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Backspace\" && createdValues.length > 0 && inputValue === \"\") {\n e.preventDefault();\n onRemove(createdValues[createdValues.length - 1]);\n return;\n }\n if (e.key === \"Enter\" && allowCreate && onAdd) {\n const trimmed = inputValue.trim();\n if (trimmed) {\n e.preventDefault();\n onAdd(trimmed);\n }\n }\n };\n\n return (\n <div\n role=\"combobox\"\n aria-invalid={ariaInvalid || undefined}\n aria-disabled={disabled || undefined}\n className={cn(\n \"pz:flex pz:flex-wrap pz:items-center pz:gap-1 pz:rounded-md pz:border pz:border-input pz:bg-transparent pz:min-h-9 pz:px-2 pz:py-1 pz:shadow-xs pz:cursor-text\",\n \"pz:focus-within:ring-4 pz:focus-within:ring-ring/10 pz:focus-within:outline-1 pz:focus-within:outline-ring/50\",\n \"pz:aria-invalid:border-destructive/60 pz:aria-invalid:ring-destructive/20\",\n disabled && \"pz:opacity-60 pz:cursor-not-allowed\",\n )}\n onMouseDown={(e) => {\n // avoid stealing focus from child remove buttons\n if ((e.target as HTMLElement).closest(\"button\")) return;\n if (disabled) return;\n onFocus?.();\n // Defer to the next tick so popover trigger registers the click first.\n setTimeout(() => {\n if (inputRef && \"current\" in inputRef && inputRef.current !== null) {\n inputRef.current.focus();\n }\n }, 0);\n }}\n >\n {createdValues.map((item) => (\n <span\n key={item}\n className=\"pz:inline-flex pz:items-center pz:gap-1 pz:rounded-sm pz:bg-secondary pz:text-secondary-foreground pz:px-2 pz:py-0.5 pz:text-xs\"\n >\n {labelFor ? labelFor(item) : item}\n <button\n type=\"button\"\n className=\"pz:opacity-60 pz:hover:opacity-100 pz:cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove(item);\n }}\n aria-label={`Remove ${labelFor ? labelFor(item) : item}`}\n >\n ×\n </button>\n </span>\n ))}\n {!disableSearch && (\n <input\n ref={inputRef}\n type=\"text\"\n className=\"pz:flex-1 pz:min-w-[80px] pz:bg-transparent pz:text-sm pz:outline-none pz:placeholder:text-muted-foreground\"\n value={inputValue}\n onChange={(e) => onInputValueChange(e.target.value)}\n onFocus={onFocus}\n onKeyDown={handleKeyDown}\n placeholder={createdValues.length === 0 ? placeholder : undefined}\n disabled={disabled}\n />\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAgB,cAAc,SAA0B,OAAgC;AACtF,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO,QACJ,KAAK,WAAW;EACf,MAAM,YAAY,SAAS,OAAO,OAAO,MAAM;EAC/C,MAAM,YAAY,SAAS,OAAO,OAAO,MAAM;EAC/C,MAAM,UAAU,UAAU,OAAO,UAAU,OAAO,YAAY;AAC9D,SAAO,QAAQ,SAAS;GAAE,GAAG;GAAQ;GAAS,GAAG;GACjD,CACD,QAAQ,MAAyB,MAAM,KAAK,CAC5C,MAAM,GAAG,MAAM,EAAE,QAAQ,OAAO,EAAE,QAAQ,KAAK"}
|
|
@@ -4,10 +4,12 @@ import { Decoration, DecorationSet } from "@tiptap/pm/view";
|
|
|
4
4
|
|
|
5
5
|
//#region src/components/internal/tag-chip-decoration.ts
|
|
6
6
|
const SECRET_REGEX = /\{\{\s*SECRETS\.([A-Z][A-Z0-9_]*)\s*\}\}/g;
|
|
7
|
+
const CONSTANT_REGEX = /\{\{\s*CONSTANTS\.([A-Z][A-Z0-9_]*)\s*\}\}/g;
|
|
7
8
|
const FIELD_REGEX = /\{\{\s*([a-zA-Z_][a-zA-Z0-9_.]*(?:\s*\|\s*[^}]+)?)\s*\}\}/g;
|
|
8
9
|
const BLOCK_REGEX = /\{%[\s\S]*?%\}/g;
|
|
9
10
|
const FIELD_CLASS = "pz-tag-chip-field pz:inline-flex pz:items-center pz:rounded-sm pz:bg-sky-100 pz:px-1 pz:text-sky-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring";
|
|
10
11
|
const SECRET_CLASS = "pz-tag-chip-secret pz:inline-flex pz:items-center pz:rounded-sm pz:bg-amber-100 pz:px-1 pz:text-amber-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring";
|
|
12
|
+
const CONSTANT_CLASS = "pz-tag-chip-constant pz:inline-flex pz:items-center pz:rounded-sm pz:bg-emerald-100 pz:px-1 pz:text-emerald-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring";
|
|
11
13
|
const BLOCK_CLASS = "pz-tag-chip-block pz:inline-flex pz:items-center pz:rounded-sm pz:bg-violet-100 pz:px-1 pz:text-violet-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring";
|
|
12
14
|
/**
|
|
13
15
|
* Builds the DecorationSet for a given ProseMirror document. Walks every
|
|
@@ -52,6 +54,19 @@ function buildDecorations(doc) {
|
|
|
52
54
|
tabindex: "0"
|
|
53
55
|
}));
|
|
54
56
|
}
|
|
57
|
+
CONSTANT_REGEX.lastIndex = 0;
|
|
58
|
+
for (const m of text.matchAll(CONSTANT_REGEX)) {
|
|
59
|
+
const start = pos + (m.index ?? 0);
|
|
60
|
+
const end = start + m[0].length;
|
|
61
|
+
claimed.push([start, end]);
|
|
62
|
+
decorations.push(Decoration.inline(start, end, {
|
|
63
|
+
class: CONSTANT_CLASS,
|
|
64
|
+
"data-tag-chip": "constant",
|
|
65
|
+
"data-tag-chip-text": m[0],
|
|
66
|
+
role: "button",
|
|
67
|
+
tabindex: "0"
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
55
70
|
FIELD_REGEX.lastIndex = 0;
|
|
56
71
|
for (const m of text.matchAll(FIELD_REGEX)) {
|
|
57
72
|
const start = pos + (m.index ?? 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag-chip-decoration.mjs","names":[],"sources":["../../../src/components/internal/tag-chip-decoration.ts"],"sourcesContent":["import { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport { Extension } from \"@tiptap/react\";\n\nconst SECRET_REGEX = /\\{\\{\\s*SECRETS\\.([A-Z][A-Z0-9_]*)\\s*\\}\\}/g;\nconst FIELD_REGEX = /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_.]*(?:\\s*\\|\\s*[^}]+)?)\\s*\\}\\}/g;\nconst BLOCK_REGEX = /\\{%[\\s\\S]*?%\\}/g;\n\nconst FIELD_CLASS =\n \"pz-tag-chip-field pz:inline-flex pz:items-center pz:rounded-sm pz:bg-sky-100 pz:px-1 pz:text-sky-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring\";\nconst SECRET_CLASS =\n \"pz-tag-chip-secret pz:inline-flex pz:items-center pz:rounded-sm pz:bg-amber-100 pz:px-1 pz:text-amber-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring\";\nconst BLOCK_CLASS =\n \"pz-tag-chip-block pz:inline-flex pz:items-center pz:rounded-sm pz:bg-violet-100 pz:px-1 pz:text-violet-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring\";\n\nexport type ChipKind = \"field\" | \"secret\" | \"block\";\n\nexport interface ChipHit {\n kind: ChipKind;\n raw: string;\n from: number;\n to: number;\n}\n\nexport interface TagChipDecorationOptions {\n /**\n * Fired when the user clicks a chip (or activates it via Enter/Space).\n * `LiquidEditor` mounts the contextual edit popover from this callback.\n */\n onChipClick?: (hit: ChipHit, target: HTMLElement) => void;\n /**\n * Fired when the user hovers a chip. Debounced upstream is the caller's\n * responsibility — the plugin emits the raw event.\n */\n onChipHover?: (hit: ChipHit | null, target: HTMLElement | null) => void;\n}\n\n/**\n * Builds the DecorationSet for a given ProseMirror document. Walks every\n * text node, then in order:\n * 1. `{% … %}` Liquid block tags (e.g. `{% output %}`, `{% if %}`).\n * 2. `{{ SECRETS.<ID> }}` secret references.\n * 3. `{{ … }}` Liquid Outputs (fields, with optional dotted access and\n * filter chains) over positions not already claimed by a secret match.\n * Each match becomes an inline Decoration that styles the substring as a\n * chip without touching the underlying text — copy/paste, cursor\n * navigation, and `editor.getText` keep their flat-text behavior.\n */\nfunction buildDecorations(doc: import(\"@tiptap/pm/model\").Node): DecorationSet {\n const decorations: Decoration[] = [];\n\n doc.descendants((node, pos) => {\n if (!node.isText || node.text == null) return;\n const text = node.text;\n const claimed: Array<[number, number]> = [];\n\n // Block tags `{% … %}` use distinct delimiters so they never overlap\n // with `{{ … }}` matches; we still record the ranges for symmetry.\n BLOCK_REGEX.lastIndex = 0;\n for (const m of text.matchAll(BLOCK_REGEX)) {\n const start = pos + (m.index ?? 0);\n const end = start + m[0].length;\n claimed.push([start, end]);\n decorations.push(\n Decoration.inline(start, end, {\n class: BLOCK_CLASS,\n \"data-tag-chip\": \"block\",\n \"data-tag-chip-text\": m[0],\n role: \"button\",\n tabindex: \"0\",\n }),\n );\n }\n\n // Secrets next — `{{ SECRETS.<ID> }}` would also match the field regex\n // via its dotted-access branch, so we claim those ranges first and skip\n // overlaps in the field pass below.\n SECRET_REGEX.lastIndex = 0;\n for (const m of text.matchAll(SECRET_REGEX)) {\n const start = pos + (m.index ?? 0);\n const end = start + m[0].length;\n claimed.push([start, end]);\n decorations.push(\n Decoration.inline(start, end, {\n class: SECRET_CLASS,\n \"data-tag-chip\": \"secret\",\n \"data-tag-chip-text\": m[0],\n role: \"button\",\n tabindex: \"0\",\n }),\n );\n }\n\n FIELD_REGEX.lastIndex = 0;\n for (const m of text.matchAll(FIELD_REGEX)) {\n const start = pos + (m.index ?? 0);\n const end = start + m[0].length;\n // Skip if this overlaps a previously claimed range.\n if (claimed.some(([s, e]) => start < e && end > s)) continue;\n decorations.push(\n Decoration.inline(start, end, {\n class: FIELD_CLASS,\n \"data-tag-chip\": \"field\",\n \"data-tag-chip-text\": m[0],\n role: \"button\",\n tabindex: \"0\",\n }),\n );\n }\n });\n\n return DecorationSet.create(doc, decorations);\n}\n\nconst tagChipPluginKey = new PluginKey(\"tagChipDecoration\");\nconst tagChipInteractionKey = new PluginKey(\"tagChipInteraction\");\n\nfunction chipHitFromTarget(target: EventTarget | null): {\n hit: ChipHit;\n el: HTMLElement;\n} | null {\n if (!(target instanceof Element)) return null;\n const el = target.closest(\"[data-tag-chip]\") as HTMLElement | null;\n if (!el) return null;\n const kind = el.getAttribute(\"data-tag-chip\") as ChipKind | null;\n const raw = el.getAttribute(\"data-tag-chip-text\");\n if (!kind || raw == null) return null;\n return {\n el,\n hit: { kind, raw, from: -1, to: -1 },\n };\n}\n\n/**\n * Tiptap extension that renders Liquid syntax as inline pills:\n * `{{ <name> }}` (fields, with optional dotted access and filter chains),\n * `{{ SECRETS.<ID> }}`, and `{% … %}` block tags (e.g. `{% output %}`).\n * Purely visual — the underlying text is unchanged so the persisted value\n * is identical to what the user typed.\n *\n * Configure with `onChipClick` / `onChipHover` to wire interactive\n * popovers and tooltips in the host editor without converting the\n * decorations to widgets (which would break the flat-text invariant).\n */\nexport const TagChipDecoration = Extension.create<TagChipDecorationOptions>({\n name: \"tagChipDecoration\",\n\n addOptions() {\n return {\n onChipClick: undefined,\n onChipHover: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n\n return [\n new Plugin({\n key: tagChipPluginKey,\n state: {\n init: (_, { doc }) => buildDecorations(doc),\n apply: (tr, old) => (tr.docChanged ? buildDecorations(tr.doc) : old),\n },\n props: {\n decorations(state) {\n return this.getState(state) ?? null;\n },\n },\n }),\n new Plugin({\n key: tagChipInteractionKey,\n props: {\n handleDOMEvents: {\n mousedown(view, event) {\n if (!options.onChipClick) return false;\n const found = chipHitFromTarget(event.target);\n if (!found) return false;\n const pos = view.posAtDOM(found.el, 0);\n const raw = found.hit.raw;\n const from = pos;\n const to = pos + raw.length;\n event.preventDefault();\n options.onChipClick({ ...found.hit, from, to }, found.el);\n return true;\n },\n keydown(view, event) {\n if (!options.onChipClick) return false;\n if (event.key !== \"Enter\" && event.key !== \" \") return false;\n const active = document.activeElement;\n if (!(active instanceof HTMLElement)) return false;\n if (!active.matches(\"[data-tag-chip]\")) return false;\n const kind = active.getAttribute(\"data-tag-chip\") as ChipKind | null;\n const raw = active.getAttribute(\"data-tag-chip-text\");\n if (!kind || raw == null) return false;\n const pos = view.posAtDOM(active, 0);\n event.preventDefault();\n options.onChipClick({ kind, raw, from: pos, to: pos + raw.length }, active);\n return true;\n },\n mouseover(_view, event) {\n if (!options.onChipHover) return false;\n const found = chipHitFromTarget(event.target);\n if (!found) {\n options.onChipHover(null, null);\n return false;\n }\n options.onChipHover(found.hit, found.el);\n return false;\n },\n mouseout(_view, event) {\n if (!options.onChipHover) return false;\n const found = chipHitFromTarget(event.target);\n if (found) options.onChipHover(null, null);\n return false;\n },\n },\n },\n }),\n ];\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tag-chip-decoration.mjs","names":[],"sources":["../../../src/components/internal/tag-chip-decoration.ts"],"sourcesContent":["import { Plugin, PluginKey } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport { Extension } from \"@tiptap/react\";\n\nconst SECRET_REGEX = /\\{\\{\\s*SECRETS\\.([A-Z][A-Z0-9_]*)\\s*\\}\\}/g;\nconst CONSTANT_REGEX = /\\{\\{\\s*CONSTANTS\\.([A-Z][A-Z0-9_]*)\\s*\\}\\}/g;\nconst FIELD_REGEX = /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_.]*(?:\\s*\\|\\s*[^}]+)?)\\s*\\}\\}/g;\nconst BLOCK_REGEX = /\\{%[\\s\\S]*?%\\}/g;\n\nconst FIELD_CLASS =\n \"pz-tag-chip-field pz:inline-flex pz:items-center pz:rounded-sm pz:bg-sky-100 pz:px-1 pz:text-sky-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring\";\nconst SECRET_CLASS =\n \"pz-tag-chip-secret pz:inline-flex pz:items-center pz:rounded-sm pz:bg-amber-100 pz:px-1 pz:text-amber-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring\";\nconst CONSTANT_CLASS =\n \"pz-tag-chip-constant pz:inline-flex pz:items-center pz:rounded-sm pz:bg-emerald-100 pz:px-1 pz:text-emerald-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring\";\nconst BLOCK_CLASS =\n \"pz-tag-chip-block pz:inline-flex pz:items-center pz:rounded-sm pz:bg-violet-100 pz:px-1 pz:text-violet-900 pz:cursor-pointer pz:focus-visible:outline-none pz:focus-visible:ring-2 pz:focus-visible:ring-ring\";\n\nexport type ChipKind = \"field\" | \"secret\" | \"constant\" | \"block\";\n\nexport interface ChipHit {\n kind: ChipKind;\n raw: string;\n from: number;\n to: number;\n}\n\nexport interface TagChipDecorationOptions {\n /**\n * Fired when the user clicks a chip (or activates it via Enter/Space).\n * `LiquidEditor` mounts the contextual edit popover from this callback.\n */\n onChipClick?: (hit: ChipHit, target: HTMLElement) => void;\n /**\n * Fired when the user hovers a chip. Debounced upstream is the caller's\n * responsibility — the plugin emits the raw event.\n */\n onChipHover?: (hit: ChipHit | null, target: HTMLElement | null) => void;\n}\n\n/**\n * Builds the DecorationSet for a given ProseMirror document. Walks every\n * text node, then in order:\n * 1. `{% … %}` Liquid block tags (e.g. `{% output %}`, `{% if %}`).\n * 2. `{{ SECRETS.<ID> }}` secret references.\n * 3. `{{ … }}` Liquid Outputs (fields, with optional dotted access and\n * filter chains) over positions not already claimed by a secret match.\n * Each match becomes an inline Decoration that styles the substring as a\n * chip without touching the underlying text — copy/paste, cursor\n * navigation, and `editor.getText` keep their flat-text behavior.\n */\nfunction buildDecorations(doc: import(\"@tiptap/pm/model\").Node): DecorationSet {\n const decorations: Decoration[] = [];\n\n doc.descendants((node, pos) => {\n if (!node.isText || node.text == null) return;\n const text = node.text;\n const claimed: Array<[number, number]> = [];\n\n // Block tags `{% … %}` use distinct delimiters so they never overlap\n // with `{{ … }}` matches; we still record the ranges for symmetry.\n BLOCK_REGEX.lastIndex = 0;\n for (const m of text.matchAll(BLOCK_REGEX)) {\n const start = pos + (m.index ?? 0);\n const end = start + m[0].length;\n claimed.push([start, end]);\n decorations.push(\n Decoration.inline(start, end, {\n class: BLOCK_CLASS,\n \"data-tag-chip\": \"block\",\n \"data-tag-chip-text\": m[0],\n role: \"button\",\n tabindex: \"0\",\n }),\n );\n }\n\n // Secrets and constants next — `{{ SECRETS.<ID> }}` / `{{ CONSTANTS.<ID> }}`\n // would also match the field regex via its dotted-access branch, so we\n // claim those ranges first and skip overlaps in the field pass below.\n SECRET_REGEX.lastIndex = 0;\n for (const m of text.matchAll(SECRET_REGEX)) {\n const start = pos + (m.index ?? 0);\n const end = start + m[0].length;\n claimed.push([start, end]);\n decorations.push(\n Decoration.inline(start, end, {\n class: SECRET_CLASS,\n \"data-tag-chip\": \"secret\",\n \"data-tag-chip-text\": m[0],\n role: \"button\",\n tabindex: \"0\",\n }),\n );\n }\n\n CONSTANT_REGEX.lastIndex = 0;\n for (const m of text.matchAll(CONSTANT_REGEX)) {\n const start = pos + (m.index ?? 0);\n const end = start + m[0].length;\n claimed.push([start, end]);\n decorations.push(\n Decoration.inline(start, end, {\n class: CONSTANT_CLASS,\n \"data-tag-chip\": \"constant\",\n \"data-tag-chip-text\": m[0],\n role: \"button\",\n tabindex: \"0\",\n }),\n );\n }\n\n FIELD_REGEX.lastIndex = 0;\n for (const m of text.matchAll(FIELD_REGEX)) {\n const start = pos + (m.index ?? 0);\n const end = start + m[0].length;\n // Skip if this overlaps a previously claimed range.\n if (claimed.some(([s, e]) => start < e && end > s)) continue;\n decorations.push(\n Decoration.inline(start, end, {\n class: FIELD_CLASS,\n \"data-tag-chip\": \"field\",\n \"data-tag-chip-text\": m[0],\n role: \"button\",\n tabindex: \"0\",\n }),\n );\n }\n });\n\n return DecorationSet.create(doc, decorations);\n}\n\nconst tagChipPluginKey = new PluginKey(\"tagChipDecoration\");\nconst tagChipInteractionKey = new PluginKey(\"tagChipInteraction\");\n\nfunction chipHitFromTarget(target: EventTarget | null): {\n hit: ChipHit;\n el: HTMLElement;\n} | null {\n if (!(target instanceof Element)) return null;\n const el = target.closest(\"[data-tag-chip]\") as HTMLElement | null;\n if (!el) return null;\n const kind = el.getAttribute(\"data-tag-chip\") as ChipKind | null;\n const raw = el.getAttribute(\"data-tag-chip-text\");\n if (!kind || raw == null) return null;\n return {\n el,\n hit: { kind, raw, from: -1, to: -1 },\n };\n}\n\n/**\n * Tiptap extension that renders Liquid syntax as inline pills:\n * `{{ <name> }}` (fields, with optional dotted access and filter chains),\n * `{{ SECRETS.<ID> }}`, and `{% … %}` block tags (e.g. `{% output %}`).\n * Purely visual — the underlying text is unchanged so the persisted value\n * is identical to what the user typed.\n *\n * Configure with `onChipClick` / `onChipHover` to wire interactive\n * popovers and tooltips in the host editor without converting the\n * decorations to widgets (which would break the flat-text invariant).\n */\nexport const TagChipDecoration = Extension.create<TagChipDecorationOptions>({\n name: \"tagChipDecoration\",\n\n addOptions() {\n return {\n onChipClick: undefined,\n onChipHover: undefined,\n };\n },\n\n addProseMirrorPlugins() {\n const options = this.options;\n\n return [\n new Plugin({\n key: tagChipPluginKey,\n state: {\n init: (_, { doc }) => buildDecorations(doc),\n apply: (tr, old) => (tr.docChanged ? buildDecorations(tr.doc) : old),\n },\n props: {\n decorations(state) {\n return this.getState(state) ?? null;\n },\n },\n }),\n new Plugin({\n key: tagChipInteractionKey,\n props: {\n handleDOMEvents: {\n mousedown(view, event) {\n if (!options.onChipClick) return false;\n const found = chipHitFromTarget(event.target);\n if (!found) return false;\n const pos = view.posAtDOM(found.el, 0);\n const raw = found.hit.raw;\n const from = pos;\n const to = pos + raw.length;\n event.preventDefault();\n options.onChipClick({ ...found.hit, from, to }, found.el);\n return true;\n },\n keydown(view, event) {\n if (!options.onChipClick) return false;\n if (event.key !== \"Enter\" && event.key !== \" \") return false;\n const active = document.activeElement;\n if (!(active instanceof HTMLElement)) return false;\n if (!active.matches(\"[data-tag-chip]\")) return false;\n const kind = active.getAttribute(\"data-tag-chip\") as ChipKind | null;\n const raw = active.getAttribute(\"data-tag-chip-text\");\n if (!kind || raw == null) return false;\n const pos = view.posAtDOM(active, 0);\n event.preventDefault();\n options.onChipClick({ kind, raw, from: pos, to: pos + raw.length }, active);\n return true;\n },\n mouseover(_view, event) {\n if (!options.onChipHover) return false;\n const found = chipHitFromTarget(event.target);\n if (!found) {\n options.onChipHover(null, null);\n return false;\n }\n options.onChipHover(found.hit, found.el);\n return false;\n },\n mouseout(_view, event) {\n if (!options.onChipHover) return false;\n const found = chipHitFromTarget(event.target);\n if (found) options.onChipHover(null, null);\n return false;\n },\n },\n },\n }),\n ];\n },\n});\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { cn } from "../../lib/utils.mjs";
|
|
2
2
|
import { mergeProps } from "@base-ui/react/merge-props";
|
|
3
|
-
import { cva } from "class-variance-authority";
|
|
4
3
|
import { useRender } from "@base-ui/react/use-render";
|
|
4
|
+
import { cva } from "class-variance-authority";
|
|
5
5
|
|
|
6
6
|
//#region src/components/ui/badge.tsx
|
|
7
7
|
const badgeVariants = cva("pz:group/badge pz:inline-flex pz:h-5 pz:w-fit pz:shrink-0 pz:items-center pz:justify-center pz:gap-1 pz:overflow-hidden pz:rounded-4xl pz:border pz:border-transparent pz:px-2 pz:py-0.5 pz:text-xs pz:font-medium pz:whitespace-nowrap pz:transition-all pz:focus-visible:border-ring pz:focus-visible:ring-[3px] pz:focus-visible:ring-ring/50 pz:has-data-[icon=inline-end]:pr-1.5 pz:has-data-[icon=inline-start]:pl-1.5 pz:aria-invalid:border-destructive pz:aria-invalid:ring-destructive/20 pz:dark:aria-invalid:ring-destructive/40 pz:[&>svg]:pointer-events-none pz:[&>svg]:size-3!", {
|
|
@@ -5,8 +5,8 @@ import * as _$class_variance_authority_types0 from "class-variance-authority/typ
|
|
|
5
5
|
|
|
6
6
|
//#region src/components/ui/button.d.ts
|
|
7
7
|
declare const buttonVariants: (props?: ({
|
|
8
|
-
variant?: "
|
|
9
|
-
size?: "default" | "icon" | "
|
|
8
|
+
variant?: "default" | "link" | "outline" | "secondary" | "ghost" | "destructive" | null | undefined;
|
|
9
|
+
size?: "default" | "icon" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
|
|
10
10
|
} & _$class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
11
11
|
declare function Button$1({
|
|
12
12
|
className,
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import { usePortalContainer } from "../../context/portal-container-context.mjs";
|
|
4
4
|
import { cn } from "../../lib/utils.mjs";
|
|
5
5
|
import { Button } from "./button.mjs";
|
|
6
|
-
import "./input-group.mjs";
|
|
7
6
|
import * as React from "react";
|
|
8
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
8
|
import { CheckIcon, ChevronDownIcon, XIcon } from "lucide-react";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.mjs","names":["Combobox","ComboboxPrimitive"],"sources":["../../../src/components/ui/combobox.tsx"],"sourcesContent":["\"use client\";\n\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\";\nimport { CheckIcon, ChevronDownIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport { usePortalContainer } from \"../../context/portal-container-context\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from \"./input-group\";\n\nconst Combobox = ComboboxPrimitive.Root;\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />;\n}\n\nfunction ComboboxTrigger({ className, children, ...props }: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"pz:[&_svg:not([class*=size-])]:size-4\", className)}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"pz:pointer-events-none pz:size-4 pz:text-muted-foreground\" />\n </ComboboxPrimitive.Trigger>\n );\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <XIcon className=\"pz:pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n );\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n showTrigger = true,\n showClear = false,\n ...props\n}: ComboboxPrimitive.Input.Props & {\n showTrigger?: boolean;\n showClear?: boolean;\n}) {\n return (\n <InputGroup className={cn(\"pz:w-auto\", className)}>\n <ComboboxPrimitive.Input render={<InputGroupInput disabled={disabled} />} {...props} />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n render={<ComboboxTrigger />}\n data-slot=\"input-group-button\"\n className=\"pz:group-has-data-[slot=combobox-clear]/input-group:hidden pz:data-pressed:bg-transparent\"\n disabled={disabled}\n />\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n );\n}\n\nfunction ComboboxContent({\n className,\n side = \"bottom\",\n sideOffset = 6,\n align = \"start\",\n alignOffset = 0,\n anchor,\n ...props\n}: ComboboxPrimitive.Popup.Props &\n Pick<\n ComboboxPrimitive.Positioner.Props,\n \"side\" | \"align\" | \"sideOffset\" | \"alignOffset\" | \"anchor\"\n >) {\n const container = usePortalContainer();\n return (\n <ComboboxPrimitive.Portal container={container}>\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"pz:isolate pz:z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\n \"pz: pz: pz:group/combobox-content pz:relative pz:max-h-(--available-height) pz:w-(--anchor-width) pz:max-w-(--available-width) pz:min-w-[calc(var(--anchor-width)+--spacing(7))] pz:origin-(--transform-origin) pz:overflow-hidden pz:rounded-lg pz:bg-popover pz:text-popover-foreground pz:shadow-md pz:ring-1 pz:ring-foreground/10 pz:duration-100 pz:data-[chips=true]:min-w-(--anchor-width) pz:data-[side=bottom]:slide-in-from-top-2 pz:data-[side=inline-end]:slide-in-from-left-2 pz:data-[side=inline-start]:slide-in-from-right-2 pz:data-[side=left]:slide-in-from-right-2 pz:data-[side=right]:slide-in-from-left-2 pz:data-[side=top]:slide-in-from-bottom-2 pz:*:data-[slot=input-group]:m-1 pz:*:data-[slot=input-group]:mb-0 pz:*:data-[slot=input-group]:h-8 pz:*:data-[slot=input-group]:border-input/30 pz:*:data-[slot=input-group]:bg-input/30 pz:*:data-[slot=input-group]:shadow-none pz:data-open:animate-in pz:data-open:fade-in-0 pz:data-open:zoom-in-95 pz:data-closed:animate-out pz:data-closed:fade-out-0 pz:data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n );\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n \"pz:no-scrollbar pz:max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] pz:scroll-py-1 pz:overflow-y-auto pz:overscroll-contain pz:p-1 pz:data-empty:p-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxItem({ className, children, ...props }: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"pz:relative pz:flex pz:w-full pz:cursor-default pz:items-center pz:gap-2 pz:rounded-md pz:py-1 pz:pr-8 pz:pl-1.5 pz:text-sm pz:outline-hidden pz:select-none pz:data-highlighted:bg-accent pz:data-highlighted:text-accent-foreground pz:not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground pz:data-disabled:pointer-events-none pz:data-disabled:opacity-50 pz:[&_svg]:pointer-events-none pz:[&_svg]:shrink-0 pz:[&_svg:not([class*=size-])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={\n <span className=\"pz:pointer-events-none pz:absolute pz:right-2 pz:flex pz:size-4 pz:items-center pz:justify-center\" />\n }\n >\n <CheckIcon className=\"pz:pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n );\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group data-slot=\"combobox-group\" className={cn(className)} {...props} />\n );\n}\n\nfunction ComboboxLabel({ className, ...props }: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn(\"pz:px-2 pz:py-1.5 pz:text-xs pz:text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {\n return <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />;\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"pz:hidden pz:w-full pz:justify-center pz:py-2 pz:text-center pz:text-sm pz:text-muted-foreground pz:group-data-empty/combobox-content:flex\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxSeparator({ className, ...props }: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"pz:-mx-1 pz:my-1 pz:h-px pz:bg-border\", className)}\n {...props}\n />\n );\n}\n\nfunction ComboboxChips({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> & ComboboxPrimitive.Chips.Props) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n \"pz:flex pz:min-h-8 pz:flex-wrap pz:items-center pz:gap-1 pz:rounded-lg pz:border pz:border-input pz:bg-transparent pz:bg-clip-padding pz:px-2.5 pz:py-1 pz:text-sm pz:transition-colors pz:focus-within:border-ring pz:focus-within:ring-3 pz:focus-within:ring-ring/50 pz:has-aria-invalid:border-destructive pz:has-aria-invalid:ring-3 pz:has-aria-invalid:ring-destructive/20 pz:has-data-[slot=combobox-chip]:px-1 pz:dark:bg-input/30 pz:dark:has-aria-invalid:border-destructive/50 pz:dark:has-aria-invalid:ring-destructive/40\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxChip({\n className,\n children,\n showRemove = true,\n ...props\n}: ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean;\n}) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"pz:flex pz:h-[calc(--spacing(5.25))] pz:w-fit pz:items-center pz:justify-center pz:gap-1 pz:rounded-sm pz:bg-muted pz:px-1.5 pz:text-xs pz:font-medium pz:whitespace-nowrap pz:text-foreground pz:has-disabled:pointer-events-none pz:has-disabled:cursor-not-allowed pz:has-disabled:opacity-50 pz:has-data-[slot=combobox-chip-remove]:pr-0\",\n className,\n )}\n {...props}\n >\n {children}\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" size=\"icon-xs\" />}\n className=\"pz:-ml-1 pz:opacity-50 pz:hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <XIcon className=\"pz:pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n );\n}\n\nfunction ComboboxChipsInput({ className, ...props }: ComboboxPrimitive.Input.Props) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-chip-input\"\n className={cn(\"pz:min-w-16 pz:flex-1 pz:outline-none\", className)}\n {...props}\n />\n );\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null);\n}\n\nexport {\n Combobox,\n ComboboxChip,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxCollection,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxGroup,\n ComboboxInput,\n ComboboxItem,\n ComboboxLabel,\n ComboboxList,\n ComboboxSeparator,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor,\n};\n"],"mappings":";;;;;;;;;;;;AAUA,MAAMA,aAAWC,SAAkB;AAMnC,SAAS,gBAAgB,EAAE,WAAW,UAAU,GAAG,SAA0C;AAC3F,QACE,qBAACA,SAAkB,SAAnB;EACE,aAAU;EACV,WAAW,GAAG,yCAAyC,UAAU;EACjE,GAAI;YAHN,CAKG,UACD,oBAAC,iBAAD,EAAiB,WAAU,6DAA8D,EAC/D;;;AAiDhC,SAAS,gBAAgB,EACvB,WACA,OAAO,UACP,aAAa,GACb,QAAQ,SACR,cAAc,GACd,QACA,GAAG,SAKA;CACH,MAAM,YAAY,oBAAoB;AACtC,QACE,oBAACA,SAAkB,QAAnB;EAAqC;YACnC,oBAACA,SAAkB,YAAnB;GACQ;GACM;GACL;GACM;GACL;GACR,WAAU;aAEV,oBAACA,SAAkB,OAAnB;IACE,aAAU;IACV,cAAY,CAAC,CAAC;IACd,WAAW,GACT,ygCACA,UACD;IACD,GAAI;IACJ;GAC2B;EACN;;AAI/B,SAAS,aAAa,EAAE,WAAW,GAAG,SAAuC;AAC3E,QACE,oBAACA,SAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,gMACA,UACD;EACD,GAAI;EACJ;;AAIN,SAAS,aAAa,EAAE,WAAW,UAAU,GAAG,SAAuC;AACrF,QACE,qBAACA,SAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,gdACA,UACD;EACD,GAAI;YANN,CAQG,UACD,oBAACA,SAAkB,eAAnB;GACE,QACE,oBAAC,QAAD,EAAM,WAAU,qGAAsG;aAGxH,oBAAC,WAAD,EAAW,WAAU,0BAA2B;GAChB,EACX;;;AAwB7B,SAAS,cAAc,EAAE,WAAW,GAAG,SAAwC;AAC7E,QACE,oBAACA,SAAkB,OAAnB;EACE,aAAU;EACV,WAAW,GACT,8IACA,UACD;EACD,GAAI;EACJ;;AAcN,SAAS,cAAc,EACrB,WACA,GAAG,SAC2F;AAC9F,QACE,oBAACA,SAAkB,OAAnB;EACE,aAAU;EACV,WAAW,GACT,2gBACA,UACD;EACD,GAAI;EACJ;;AAIN,SAAS,aAAa,EACpB,WACA,UACA,aAAa,MACb,GAAG,SAGF;AACD,QACE,qBAACA,SAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,iVACA,UACD;EACD,GAAI;YANN,CAQG,UACA,cACC,oBAACA,SAAkB,YAAnB;GACE,QAAQ,oBAAC,QAAD;IAAQ,SAAQ;IAAQ,MAAK;IAAY;GACjD,WAAU;GACV,aAAU;aAEV,oBAAC,OAAD,EAAO,WAAU,0BAA2B;GACf,EAEV;;;AAI7B,SAAS,mBAAmB,EAAE,WAAW,GAAG,SAAwC;AAClF,QACE,oBAACA,SAAkB,OAAnB;EACE,aAAU;EACV,WAAW,GAAG,yCAAyC,UAAU;EACjE,GAAI;EACJ;;AAIN,SAAS,oBAAoB;AAC3B,QAAO,MAAM,OAA8B,KAAK"}
|
|
1
|
+
{"version":3,"file":"combobox.mjs","names":["Combobox","ComboboxPrimitive"],"sources":["../../../src/components/ui/combobox.tsx"],"sourcesContent":["\"use client\";\n\nimport { Combobox as ComboboxPrimitive } from \"@base-ui/react\";\nimport { CheckIcon, ChevronDownIcon, XIcon } from \"lucide-react\";\nimport * as React from \"react\";\nimport { usePortalContainer } from \"../../context/portal-container-context\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"./button\";\nimport { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput } from \"./input-group\";\n\nconst Combobox = ComboboxPrimitive.Root;\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />;\n}\n\nfunction ComboboxTrigger({ className, children, ...props }: ComboboxPrimitive.Trigger.Props) {\n return (\n <ComboboxPrimitive.Trigger\n data-slot=\"combobox-trigger\"\n className={cn(\"pz:[&_svg:not([class*=size-])]:size-4\", className)}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"pz:pointer-events-none pz:size-4 pz:text-muted-foreground\" />\n </ComboboxPrimitive.Trigger>\n );\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n return (\n <ComboboxPrimitive.Clear\n data-slot=\"combobox-clear\"\n render={<InputGroupButton variant=\"ghost\" size=\"icon-xs\" />}\n className={cn(className)}\n {...props}\n >\n <XIcon className=\"pz:pointer-events-none\" />\n </ComboboxPrimitive.Clear>\n );\n}\n\nfunction ComboboxInput({\n className,\n children,\n disabled = false,\n showTrigger = true,\n showClear = false,\n ...props\n}: ComboboxPrimitive.Input.Props & {\n showTrigger?: boolean;\n showClear?: boolean;\n}) {\n return (\n <InputGroup className={cn(\"pz:w-auto\", className)}>\n <ComboboxPrimitive.Input render={<InputGroupInput disabled={disabled} />} {...props} />\n <InputGroupAddon align=\"inline-end\">\n {showTrigger && (\n <InputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n render={<ComboboxTrigger />}\n data-slot=\"input-group-button\"\n className=\"pz:group-has-data-[slot=combobox-clear]/input-group:hidden pz:data-pressed:bg-transparent\"\n disabled={disabled}\n />\n )}\n {showClear && <ComboboxClear disabled={disabled} />}\n </InputGroupAddon>\n {children}\n </InputGroup>\n );\n}\n\nfunction ComboboxContent({\n className,\n side = \"bottom\",\n sideOffset = 6,\n align = \"start\",\n alignOffset = 0,\n anchor,\n ...props\n}: ComboboxPrimitive.Popup.Props &\n Pick<\n ComboboxPrimitive.Positioner.Props,\n \"side\" | \"align\" | \"sideOffset\" | \"alignOffset\" | \"anchor\"\n >) {\n const container = usePortalContainer();\n return (\n <ComboboxPrimitive.Portal container={container}>\n <ComboboxPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n anchor={anchor}\n className=\"pz:isolate pz:z-50\"\n >\n <ComboboxPrimitive.Popup\n data-slot=\"combobox-content\"\n data-chips={!!anchor}\n className={cn(\n \"pz: pz: pz:group/combobox-content pz:relative pz:max-h-(--available-height) pz:w-(--anchor-width) pz:max-w-(--available-width) pz:min-w-[calc(var(--anchor-width)+--spacing(7))] pz:origin-(--transform-origin) pz:overflow-hidden pz:rounded-lg pz:bg-popover pz:text-popover-foreground pz:shadow-md pz:ring-1 pz:ring-foreground/10 pz:duration-100 pz:data-[chips=true]:min-w-(--anchor-width) pz:data-[side=bottom]:slide-in-from-top-2 pz:data-[side=inline-end]:slide-in-from-left-2 pz:data-[side=inline-start]:slide-in-from-right-2 pz:data-[side=left]:slide-in-from-right-2 pz:data-[side=right]:slide-in-from-left-2 pz:data-[side=top]:slide-in-from-bottom-2 pz:*:data-[slot=input-group]:m-1 pz:*:data-[slot=input-group]:mb-0 pz:*:data-[slot=input-group]:h-8 pz:*:data-[slot=input-group]:border-input/30 pz:*:data-[slot=input-group]:bg-input/30 pz:*:data-[slot=input-group]:shadow-none pz:data-open:animate-in pz:data-open:fade-in-0 pz:data-open:zoom-in-95 pz:data-closed:animate-out pz:data-closed:fade-out-0 pz:data-closed:zoom-out-95\",\n className,\n )}\n {...props}\n />\n </ComboboxPrimitive.Positioner>\n </ComboboxPrimitive.Portal>\n );\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n return (\n <ComboboxPrimitive.List\n data-slot=\"combobox-list\"\n className={cn(\n \"pz:no-scrollbar pz:max-h-[min(calc(--spacing(72)---spacing(9)),calc(var(--available-height)---spacing(9)))] pz:scroll-py-1 pz:overflow-y-auto pz:overscroll-contain pz:p-1 pz:data-empty:p-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxItem({ className, children, ...props }: ComboboxPrimitive.Item.Props) {\n return (\n <ComboboxPrimitive.Item\n data-slot=\"combobox-item\"\n className={cn(\n \"pz:relative pz:flex pz:w-full pz:cursor-default pz:items-center pz:gap-2 pz:rounded-md pz:py-1 pz:pr-8 pz:pl-1.5 pz:text-sm pz:outline-hidden pz:select-none pz:data-highlighted:bg-accent pz:data-highlighted:text-accent-foreground pz:not-data-[variant=destructive]:data-highlighted:**:text-accent-foreground pz:data-disabled:pointer-events-none pz:data-disabled:opacity-50 pz:[&_svg]:pointer-events-none pz:[&_svg]:shrink-0 pz:[&_svg:not([class*=size-])]:size-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ComboboxPrimitive.ItemIndicator\n render={\n <span className=\"pz:pointer-events-none pz:absolute pz:right-2 pz:flex pz:size-4 pz:items-center pz:justify-center\" />\n }\n >\n <CheckIcon className=\"pz:pointer-events-none\" />\n </ComboboxPrimitive.ItemIndicator>\n </ComboboxPrimitive.Item>\n );\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n return (\n <ComboboxPrimitive.Group data-slot=\"combobox-group\" className={cn(className)} {...props} />\n );\n}\n\nfunction ComboboxLabel({ className, ...props }: ComboboxPrimitive.GroupLabel.Props) {\n return (\n <ComboboxPrimitive.GroupLabel\n data-slot=\"combobox-label\"\n className={cn(\"pz:px-2 pz:py-1.5 pz:text-xs pz:text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction ComboboxCollection({ ...props }: ComboboxPrimitive.Collection.Props) {\n return <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />;\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n return (\n <ComboboxPrimitive.Empty\n data-slot=\"combobox-empty\"\n className={cn(\n \"pz:hidden pz:w-full pz:justify-center pz:py-2 pz:text-center pz:text-sm pz:text-muted-foreground pz:group-data-empty/combobox-content:flex\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxSeparator({ className, ...props }: ComboboxPrimitive.Separator.Props) {\n return (\n <ComboboxPrimitive.Separator\n data-slot=\"combobox-separator\"\n className={cn(\"pz:-mx-1 pz:my-1 pz:h-px pz:bg-border\", className)}\n {...props}\n />\n );\n}\n\nfunction ComboboxChips({\n className,\n ...props\n}: React.ComponentPropsWithRef<typeof ComboboxPrimitive.Chips> & ComboboxPrimitive.Chips.Props) {\n return (\n <ComboboxPrimitive.Chips\n data-slot=\"combobox-chips\"\n className={cn(\n \"pz:flex pz:min-h-8 pz:flex-wrap pz:items-center pz:gap-1 pz:rounded-lg pz:border pz:border-input pz:bg-transparent pz:bg-clip-padding pz:px-2.5 pz:py-1 pz:text-sm pz:transition-colors pz:focus-within:border-ring pz:focus-within:ring-3 pz:focus-within:ring-ring/50 pz:has-aria-invalid:border-destructive pz:has-aria-invalid:ring-3 pz:has-aria-invalid:ring-destructive/20 pz:has-data-[slot=combobox-chip]:px-1 pz:dark:bg-input/30 pz:dark:has-aria-invalid:border-destructive/50 pz:dark:has-aria-invalid:ring-destructive/40\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction ComboboxChip({\n className,\n children,\n showRemove = true,\n ...props\n}: ComboboxPrimitive.Chip.Props & {\n showRemove?: boolean;\n}) {\n return (\n <ComboboxPrimitive.Chip\n data-slot=\"combobox-chip\"\n className={cn(\n \"pz:flex pz:h-[calc(--spacing(5.25))] pz:w-fit pz:items-center pz:justify-center pz:gap-1 pz:rounded-sm pz:bg-muted pz:px-1.5 pz:text-xs pz:font-medium pz:whitespace-nowrap pz:text-foreground pz:has-disabled:pointer-events-none pz:has-disabled:cursor-not-allowed pz:has-disabled:opacity-50 pz:has-data-[slot=combobox-chip-remove]:pr-0\",\n className,\n )}\n {...props}\n >\n {children}\n {showRemove && (\n <ComboboxPrimitive.ChipRemove\n render={<Button variant=\"ghost\" size=\"icon-xs\" />}\n className=\"pz:-ml-1 pz:opacity-50 pz:hover:opacity-100\"\n data-slot=\"combobox-chip-remove\"\n >\n <XIcon className=\"pz:pointer-events-none\" />\n </ComboboxPrimitive.ChipRemove>\n )}\n </ComboboxPrimitive.Chip>\n );\n}\n\nfunction ComboboxChipsInput({ className, ...props }: ComboboxPrimitive.Input.Props) {\n return (\n <ComboboxPrimitive.Input\n data-slot=\"combobox-chip-input\"\n className={cn(\"pz:min-w-16 pz:flex-1 pz:outline-none\", className)}\n {...props}\n />\n );\n}\n\nfunction useComboboxAnchor() {\n return React.useRef<HTMLDivElement | null>(null);\n}\n\nexport {\n Combobox,\n ComboboxChip,\n ComboboxChips,\n ComboboxChipsInput,\n ComboboxCollection,\n ComboboxContent,\n ComboboxEmpty,\n ComboboxGroup,\n ComboboxInput,\n ComboboxItem,\n ComboboxLabel,\n ComboboxList,\n ComboboxSeparator,\n ComboboxTrigger,\n ComboboxValue,\n useComboboxAnchor,\n};\n"],"mappings":";;;;;;;;;;;AAUA,MAAMA,aAAWC,SAAkB;AAMnC,SAAS,gBAAgB,EAAE,WAAW,UAAU,GAAG,SAA0C;AAC3F,QACE,qBAACA,SAAkB,SAAnB;EACE,aAAU;EACV,WAAW,GAAG,yCAAyC,UAAU;EACjE,GAAI;YAHN,CAKG,UACD,oBAAC,iBAAD,EAAiB,WAAU,6DAA8D,EAC/D;;;AAiDhC,SAAS,gBAAgB,EACvB,WACA,OAAO,UACP,aAAa,GACb,QAAQ,SACR,cAAc,GACd,QACA,GAAG,SAKA;CACH,MAAM,YAAY,oBAAoB;AACtC,QACE,oBAACA,SAAkB,QAAnB;EAAqC;YACnC,oBAACA,SAAkB,YAAnB;GACQ;GACM;GACL;GACM;GACL;GACR,WAAU;aAEV,oBAACA,SAAkB,OAAnB;IACE,aAAU;IACV,cAAY,CAAC,CAAC;IACd,WAAW,GACT,ygCACA,UACD;IACD,GAAI;IACJ;GAC2B;EACN;;AAI/B,SAAS,aAAa,EAAE,WAAW,GAAG,SAAuC;AAC3E,QACE,oBAACA,SAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,gMACA,UACD;EACD,GAAI;EACJ;;AAIN,SAAS,aAAa,EAAE,WAAW,UAAU,GAAG,SAAuC;AACrF,QACE,qBAACA,SAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,gdACA,UACD;EACD,GAAI;YANN,CAQG,UACD,oBAACA,SAAkB,eAAnB;GACE,QACE,oBAAC,QAAD,EAAM,WAAU,qGAAsG;aAGxH,oBAAC,WAAD,EAAW,WAAU,0BAA2B;GAChB,EACX;;;AAwB7B,SAAS,cAAc,EAAE,WAAW,GAAG,SAAwC;AAC7E,QACE,oBAACA,SAAkB,OAAnB;EACE,aAAU;EACV,WAAW,GACT,8IACA,UACD;EACD,GAAI;EACJ;;AAcN,SAAS,cAAc,EACrB,WACA,GAAG,SAC2F;AAC9F,QACE,oBAACA,SAAkB,OAAnB;EACE,aAAU;EACV,WAAW,GACT,2gBACA,UACD;EACD,GAAI;EACJ;;AAIN,SAAS,aAAa,EACpB,WACA,UACA,aAAa,MACb,GAAG,SAGF;AACD,QACE,qBAACA,SAAkB,MAAnB;EACE,aAAU;EACV,WAAW,GACT,iVACA,UACD;EACD,GAAI;YANN,CAQG,UACA,cACC,oBAACA,SAAkB,YAAnB;GACE,QAAQ,oBAAC,QAAD;IAAQ,SAAQ;IAAQ,MAAK;IAAY;GACjD,WAAU;GACV,aAAU;aAEV,oBAAC,OAAD,EAAO,WAAU,0BAA2B;GACf,EAEV;;;AAI7B,SAAS,mBAAmB,EAAE,WAAW,GAAG,SAAwC;AAClF,QACE,oBAACA,SAAkB,OAAnB;EACE,aAAU;EACV,WAAW,GAAG,yCAAyC,UAAU;EACjE,GAAI;EACJ;;AAIN,SAAS,oBAAoB;AAC3B,QAAO,MAAM,OAA8B,KAAK"}
|
|
@@ -7,8 +7,15 @@ interface PipeCatalogCardContextValue {
|
|
|
7
7
|
card: PipeCardData;
|
|
8
8
|
index: number;
|
|
9
9
|
selected: boolean;
|
|
10
|
+
expanded: boolean;
|
|
10
11
|
/** Selection handler — fires the catalog root's `onSelectCard`. */
|
|
11
12
|
onSelect: (e: SyntheticEvent) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Open or close this card's expansion drawer. Only a single card inside a
|
|
15
|
+
* `<PipeCatalog>` can be expanded at any time — opening one closes the
|
|
16
|
+
* previously expanded card.
|
|
17
|
+
*/
|
|
18
|
+
setExpanded: (open: boolean) => void;
|
|
12
19
|
}
|
|
13
20
|
declare const PipeCatalogCardContext: _$react.Context<PipeCatalogCardContextValue | null>;
|
|
14
21
|
declare function usePipeCatalogCard(): PipeCatalogCardContextValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipe-catalog-card-context.d.mts","names":[],"sources":["../../src/context/pipe-catalog-card-context.ts"],"mappings":";;;;;UAIiB,2BAAA;EACf,IAAA,EAAM,YAAA;EACN,KAAA;EACA,QAAA;
|
|
1
|
+
{"version":3,"file":"pipe-catalog-card-context.d.mts","names":[],"sources":["../../src/context/pipe-catalog-card-context.ts"],"mappings":";;;;;UAIiB,2BAAA;EACf,IAAA,EAAM,YAAA;EACN,KAAA;EACA,QAAA;EACA,QAAA;;EAEA,QAAA,GAAW,CAAA,EAAG,cAAA;EALd;;;;;EAWA,WAAA,GAAc,IAAA;AAAA;AAAA,cAGH,sBAAA,EAAsB,OAAA,CAAA,OAAA,CAAA,2BAAA;AAAA,iBAEnB,kBAAA,CAAA,GAAsB,2BAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipe-catalog-card-context.mjs","names":[],"sources":["../../src/context/pipe-catalog-card-context.ts"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { PipeCardData } from \"../types/catalog-adapters.js\";\n\nexport interface PipeCatalogCardContextValue {\n card: PipeCardData;\n index: number;\n selected: boolean;\n /** Selection handler — fires the catalog root's `onSelectCard`. */\n onSelect: (e: SyntheticEvent) => void;\n}\n\nexport const PipeCatalogCardContext = createContext<PipeCatalogCardContextValue | null>(null);\n\nexport function usePipeCatalogCard(): PipeCatalogCardContextValue {\n const value = useContext(PipeCatalogCardContext);\n if (value == null) {\n throw new Error(\"usePipeCatalogCard must be used inside <PipeCatalogCard>.\");\n }\n return value;\n}\n"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"pipe-catalog-card-context.mjs","names":[],"sources":["../../src/context/pipe-catalog-card-context.ts"],"sourcesContent":["import type { SyntheticEvent } from \"react\";\nimport { createContext, useContext } from \"react\";\nimport type { PipeCardData } from \"../types/catalog-adapters.js\";\n\nexport interface PipeCatalogCardContextValue {\n card: PipeCardData;\n index: number;\n selected: boolean;\n expanded: boolean;\n /** Selection handler — fires the catalog root's `onSelectCard`. */\n onSelect: (e: SyntheticEvent) => void;\n /**\n * Open or close this card's expansion drawer. Only a single card inside a\n * `<PipeCatalog>` can be expanded at any time — opening one closes the\n * previously expanded card.\n */\n setExpanded: (open: boolean) => void;\n}\n\nexport const PipeCatalogCardContext = createContext<PipeCatalogCardContextValue | null>(null);\n\nexport function usePipeCatalogCard(): PipeCatalogCardContextValue {\n const value = useContext(PipeCatalogCardContext);\n if (value == null) {\n throw new Error(\"usePipeCatalogCard must be used inside <PipeCatalogCard>.\");\n }\n return value;\n}\n"],"mappings":";;;AAmBA,MAAa,yBAAyB,cAAkD,KAAK;AAE7F,SAAgB,qBAAkD;CAChE,MAAM,QAAQ,WAAW,uBAAuB;AAChD,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,4DAA4D;AAE9E,QAAO"}
|
|
@@ -1,19 +1,33 @@
|
|
|
1
1
|
import { AnyFieldProps } from "../types/field-props.mjs";
|
|
2
|
-
import { FormSectionHandle } from "../types/form-handle.mjs";
|
|
2
|
+
import { FormHandle, FormSectionHandle } from "../types/form-handle.mjs";
|
|
3
3
|
import { FieldLoadState, ResourceStatus } from "../hooks/use-form-core.mjs";
|
|
4
4
|
import * as _$react from "react";
|
|
5
5
|
import { FormResolvers, FormStore, PipeId, PipePayload } from "@pipe0/base";
|
|
6
|
-
import { UseFormReturn } from "react-hook-form";
|
|
7
6
|
|
|
8
7
|
//#region src/context/pipe-form-context.d.ts
|
|
9
8
|
interface PipeFormContext {
|
|
10
9
|
id: PipeId;
|
|
11
10
|
publicKey: string;
|
|
12
|
-
form:
|
|
11
|
+
form: FormHandle<PipePayload>;
|
|
12
|
+
/**
|
|
13
|
+
* Sections to render, after applying any active form customization
|
|
14
|
+
* (hide/relabel section/group/field). Iterate this directly when
|
|
15
|
+
* building a custom form body — it matches what the default body renders.
|
|
16
|
+
*/
|
|
13
17
|
sections: FormSectionHandle[];
|
|
14
18
|
fields: AnyFieldProps[];
|
|
19
|
+
/**
|
|
20
|
+
* The set of field paths actually rendered by `sections`, after
|
|
21
|
+
* customization. Used by form-level error rendering to decide which
|
|
22
|
+
* errors are owned by a visible field vs. need surfacing separately.
|
|
23
|
+
*/
|
|
24
|
+
fieldPaths: Set<string>;
|
|
15
25
|
connectionsStatus: ResourceStatus;
|
|
16
26
|
fieldLoadStates: Record<string, FieldLoadState>;
|
|
27
|
+
fieldLoaderErrors: Record<string, FieldLoadState>;
|
|
28
|
+
loadingFieldLoaders: Record<string, FieldLoadState>;
|
|
29
|
+
hasFieldLoaderError: boolean;
|
|
30
|
+
isFieldLoaderLoading: boolean;
|
|
17
31
|
resolvers?: FormResolvers;
|
|
18
32
|
store: FormStore;
|
|
19
33
|
reset: (values?: PipePayload) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipe-form-context.d.mts","names":[],"sources":["../../src/context/pipe-form-context.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipe-form-context.d.mts","names":[],"sources":["../../src/context/pipe-form-context.ts"],"mappings":";;;;;;;UAMiB,eAAA;EACf,EAAA,EAAI,MAAA;EACJ,SAAA;EAEA,IAAA,EAAM,UAAA,CAAW,WAAA;EAJa;;;;;EAU9B,QAAA,EAAU,iBAAA;EACV,MAAA,EAAQ,aAAA;EAMI;;;;;EAAZ,UAAA,EAAY,GAAA;EAEZ,iBAAA,EAAmB,cAAA;EACnB,eAAA,EAAiB,MAAA,SAAe,cAAA;EAChC,iBAAA,EAAmB,MAAA,SAAe,cAAA;EAClC,mBAAA,EAAqB,MAAA,SAAe,cAAA;EACpC,mBAAA;EACA,oBAAA;EAEA,SAAA,GAAY,aAAA;EACZ,KAAA,EAAO,SAAA;EAEP,KAAA,GAAQ,MAAA,GAAS,WAAA;AAAA;AAAA,cAGN,eAAA,EAAe,OAAA,CAAA,OAAA,CAAA,eAAA;AAAA,iBAEZ,kBAAA,CAAA,GAAsB,eAAA"}
|