@cellarnode/ui 0.17.4 → 0.19.1
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/dist/chat/unified-timeline.d.ts +15 -0
- package/dist/chat/unified-timeline.d.ts.map +1 -1
- package/dist/chat/unified-timeline.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/offer/attachments-card.d.ts +9 -0
- package/dist/offer/attachments-card.d.ts.map +1 -0
- package/dist/offer/attachments-card.js +16 -0
- package/dist/offer/attachments-card.js.map +1 -0
- package/dist/offer/attachments-card.stories.d.ts +17 -0
- package/dist/offer/attachments-card.stories.d.ts.map +1 -0
- package/dist/offer/attachments-card.stories.js +24 -0
- package/dist/offer/attachments-card.stories.js.map +1 -0
- package/dist/offer/buyer-notes-card.d.ts +7 -0
- package/dist/offer/buyer-notes-card.d.ts.map +1 -0
- package/dist/offer/buyer-notes-card.js +6 -0
- package/dist/offer/buyer-notes-card.js.map +1 -0
- package/dist/offer/buyer-notes-card.stories.d.ts +16 -0
- package/dist/offer/buyer-notes-card.stories.d.ts.map +1 -0
- package/dist/offer/buyer-notes-card.stories.js +25 -0
- package/dist/offer/buyer-notes-card.stories.js.map +1 -0
- package/dist/offer/counter-slide-over.d.ts +44 -0
- package/dist/offer/counter-slide-over.d.ts.map +1 -0
- package/dist/offer/counter-slide-over.js +81 -0
- package/dist/offer/counter-slide-over.js.map +1 -0
- package/dist/offer/counter-slide-over.stories.d.ts +23 -0
- package/dist/offer/counter-slide-over.stories.d.ts.map +1 -0
- package/dist/offer/counter-slide-over.stories.js +235 -0
- package/dist/offer/counter-slide-over.stories.js.map +1 -0
- package/dist/offer/facts-card.d.ts +32 -0
- package/dist/offer/facts-card.d.ts.map +1 -0
- package/dist/offer/facts-card.js +87 -0
- package/dist/offer/facts-card.js.map +1 -0
- package/dist/offer/facts-card.stories.d.ts +25 -0
- package/dist/offer/facts-card.stories.d.ts.map +1 -0
- package/dist/offer/facts-card.stories.js +177 -0
- package/dist/offer/facts-card.stories.js.map +1 -0
- package/dist/offer/index.d.ts +39 -0
- package/dist/offer/index.d.ts.map +1 -1
- package/dist/offer/index.js +21 -0
- package/dist/offer/index.js.map +1 -1
- package/dist/offer/inline-counter-form.d.ts +16 -0
- package/dist/offer/inline-counter-form.d.ts.map +1 -1
- package/dist/offer/inline-counter-form.js +8 -0
- package/dist/offer/inline-counter-form.js.map +1 -1
- package/dist/offer/match-compatibility-card.d.ts +16 -0
- package/dist/offer/match-compatibility-card.d.ts.map +1 -0
- package/dist/offer/match-compatibility-card.js +27 -0
- package/dist/offer/match-compatibility-card.js.map +1 -0
- package/dist/offer/match-compatibility-card.stories.d.ts +19 -0
- package/dist/offer/match-compatibility-card.stories.d.ts.map +1 -0
- package/dist/offer/match-compatibility-card.stories.js +111 -0
- package/dist/offer/match-compatibility-card.stories.js.map +1 -0
- package/dist/offer/match-glyph.d.ts +14 -0
- package/dist/offer/match-glyph.d.ts.map +1 -0
- package/dist/offer/match-glyph.js +40 -0
- package/dist/offer/match-glyph.js.map +1 -0
- package/dist/offer/match-glyph.stories.d.ts +26 -0
- package/dist/offer/match-glyph.stories.d.ts.map +1 -0
- package/dist/offer/match-glyph.stories.js +26 -0
- package/dist/offer/match-glyph.stories.js.map +1 -0
- package/dist/offer/match-headline-bar.d.ts +11 -0
- package/dist/offer/match-headline-bar.d.ts.map +1 -0
- package/dist/offer/match-headline-bar.js +28 -0
- package/dist/offer/match-headline-bar.js.map +1 -0
- package/dist/offer/match-headline-bar.stories.d.ts +17 -0
- package/dist/offer/match-headline-bar.stories.d.ts.map +1 -0
- package/dist/offer/match-headline-bar.stories.js +39 -0
- package/dist/offer/match-headline-bar.stories.js.map +1 -0
- package/dist/offer/match-preview.d.ts +18 -0
- package/dist/offer/match-preview.d.ts.map +1 -0
- package/dist/offer/match-preview.js +13 -0
- package/dist/offer/match-preview.js.map +1 -0
- package/dist/offer/match-preview.stories.d.ts +18 -0
- package/dist/offer/match-preview.stories.d.ts.map +1 -0
- package/dist/offer/match-preview.stories.js +103 -0
- package/dist/offer/match-preview.stories.js.map +1 -0
- package/dist/offer/negotiation-section.d.ts +11 -0
- package/dist/offer/negotiation-section.d.ts.map +1 -0
- package/dist/offer/negotiation-section.js +99 -0
- package/dist/offer/negotiation-section.js.map +1 -0
- package/dist/offer/negotiation-section.stories.d.ts +18 -0
- package/dist/offer/negotiation-section.stories.d.ts.map +1 -0
- package/dist/offer/negotiation-section.stories.js +156 -0
- package/dist/offer/negotiation-section.stories.js.map +1 -0
- package/dist/offer/new-activity-pill.d.ts +7 -0
- package/dist/offer/new-activity-pill.d.ts.map +1 -0
- package/dist/offer/new-activity-pill.js +8 -0
- package/dist/offer/new-activity-pill.js.map +1 -0
- package/dist/offer/new-activity-pill.stories.d.ts +17 -0
- package/dist/offer/new-activity-pill.stories.d.ts.map +1 -0
- package/dist/offer/new-activity-pill.stories.js +22 -0
- package/dist/offer/new-activity-pill.stories.js.map +1 -0
- package/dist/offer/offer-document.d.ts +33 -0
- package/dist/offer/offer-document.d.ts.map +1 -0
- package/dist/offer/offer-document.js +125 -0
- package/dist/offer/offer-document.js.map +1 -0
- package/dist/offer/offer-document.stories.d.ts +25 -0
- package/dist/offer/offer-document.stories.d.ts.map +1 -0
- package/dist/offer/offer-document.stories.js +168 -0
- package/dist/offer/offer-document.stories.js.map +1 -0
- package/dist/offer/offer-export-button.d.ts +8 -0
- package/dist/offer/offer-export-button.d.ts.map +1 -0
- package/dist/offer/offer-export-button.js +11 -0
- package/dist/offer/offer-export-button.js.map +1 -0
- package/dist/offer/offer-export-button.stories.d.ts +15 -0
- package/dist/offer/offer-export-button.stories.d.ts.map +1 -0
- package/dist/offer/offer-export-button.stories.js +11 -0
- package/dist/offer/offer-export-button.stories.js.map +1 -0
- package/dist/offer/offer-product-card.d.ts +32 -0
- package/dist/offer/offer-product-card.d.ts.map +1 -0
- package/dist/offer/offer-product-card.js +10 -0
- package/dist/offer/offer-product-card.js.map +1 -0
- package/dist/offer/offer-product-card.stories.d.ts +16 -0
- package/dist/offer/offer-product-card.stories.d.ts.map +1 -0
- package/dist/offer/offer-product-card.stories.js +40 -0
- package/dist/offer/offer-product-card.stories.js.map +1 -0
- package/dist/offer/opportunity-card.d.ts +16 -0
- package/dist/offer/opportunity-card.d.ts.map +1 -0
- package/dist/offer/opportunity-card.js +9 -0
- package/dist/offer/opportunity-card.js.map +1 -0
- package/dist/offer/opportunity-card.stories.d.ts +16 -0
- package/dist/offer/opportunity-card.stories.d.ts.map +1 -0
- package/dist/offer/opportunity-card.stories.js +33 -0
- package/dist/offer/opportunity-card.stories.js.map +1 -0
- package/dist/offer/parties-card.d.ts +11 -0
- package/dist/offer/parties-card.d.ts.map +1 -0
- package/dist/offer/parties-card.js +14 -0
- package/dist/offer/parties-card.js.map +1 -0
- package/dist/offer/parties-card.stories.d.ts +17 -0
- package/dist/offer/parties-card.stories.d.ts.map +1 -0
- package/dist/offer/parties-card.stories.js +37 -0
- package/dist/offer/parties-card.stories.js.map +1 -0
- package/dist/offer/terms-card.d.ts +17 -0
- package/dist/offer/terms-card.d.ts.map +1 -0
- package/dist/offer/terms-card.js +50 -0
- package/dist/offer/terms-card.js.map +1 -0
- package/dist/offer/terms-card.stories.d.ts +17 -0
- package/dist/offer/terms-card.stories.d.ts.map +1 -0
- package/dist/offer/terms-card.stories.js +42 -0
- package/dist/offer/terms-card.stories.js.map +1 -0
- package/dist/offer/timeline-event.d.ts +12 -0
- package/dist/offer/timeline-event.d.ts.map +1 -0
- package/dist/offer/timeline-event.js +57 -0
- package/dist/offer/timeline-event.js.map +1 -0
- package/dist/offer/timeline-event.stories.d.ts +21 -0
- package/dist/offer/timeline-event.stories.d.ts.map +1 -0
- package/dist/offer/timeline-event.stories.js +57 -0
- package/dist/offer/timeline-event.stories.js.map +1 -0
- package/dist/offer/types.d.ts +118 -0
- package/dist/offer/types.d.ts.map +1 -1
- package/dist/opportunities/__a11y__/opportunity-card-actions-menu.a11y.test.d.ts +2 -0
- package/dist/opportunities/__a11y__/opportunity-card-actions-menu.a11y.test.d.ts.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-card-actions-menu.a11y.test.js +40 -0
- package/dist/opportunities/__a11y__/opportunity-card-actions-menu.a11y.test.js.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-celebration.a11y.test.d.ts +2 -0
- package/dist/opportunities/__a11y__/opportunity-celebration.a11y.test.d.ts.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-celebration.a11y.test.js +31 -0
- package/dist/opportunities/__a11y__/opportunity-celebration.a11y.test.js.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-detail-panel.a11y.test.d.ts +2 -0
- package/dist/opportunities/__a11y__/opportunity-detail-panel.a11y.test.d.ts.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-detail-panel.a11y.test.js +42 -0
- package/dist/opportunities/__a11y__/opportunity-detail-panel.a11y.test.js.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-filter-bar.a11y.test.d.ts +2 -0
- package/dist/opportunities/__a11y__/opportunity-filter-bar.a11y.test.d.ts.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-filter-bar.a11y.test.js +59 -0
- package/dist/opportunities/__a11y__/opportunity-filter-bar.a11y.test.js.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-stacked-card.a11y.test.d.ts +2 -0
- package/dist/opportunities/__a11y__/opportunity-stacked-card.a11y.test.d.ts.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-stacked-card.a11y.test.js +54 -0
- package/dist/opportunities/__a11y__/opportunity-stacked-card.a11y.test.js.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-stacked-list.a11y.test.d.ts +2 -0
- package/dist/opportunities/__a11y__/opportunity-stacked-list.a11y.test.d.ts.map +1 -0
- package/dist/opportunities/__a11y__/opportunity-stacked-list.a11y.test.js +40 -0
- package/dist/opportunities/__a11y__/opportunity-stacked-list.a11y.test.js.map +1 -0
- package/dist/opportunities/__tests__/opportunity-add-to-journey-button.test.d.ts +2 -0
- package/dist/opportunities/__tests__/opportunity-add-to-journey-button.test.d.ts.map +1 -0
- package/dist/opportunities/__tests__/opportunity-add-to-journey-button.test.js +40 -0
- package/dist/opportunities/__tests__/opportunity-add-to-journey-button.test.js.map +1 -0
- package/dist/opportunities/__tests__/opportunity-card-actions-menu.test.d.ts +2 -0
- package/dist/opportunities/__tests__/opportunity-card-actions-menu.test.d.ts.map +1 -0
- package/dist/opportunities/__tests__/opportunity-card-actions-menu.test.js +74 -0
- package/dist/opportunities/__tests__/opportunity-card-actions-menu.test.js.map +1 -0
- package/dist/opportunities/__tests__/opportunity-celebration.test.d.ts +2 -0
- package/dist/opportunities/__tests__/opportunity-celebration.test.d.ts.map +1 -0
- package/dist/opportunities/__tests__/opportunity-celebration.test.js +46 -0
- package/dist/opportunities/__tests__/opportunity-celebration.test.js.map +1 -0
- package/dist/opportunities/__tests__/opportunity-filter-bar-drawer.test.d.ts +2 -0
- package/dist/opportunities/__tests__/opportunity-filter-bar-drawer.test.d.ts.map +1 -0
- package/dist/opportunities/__tests__/opportunity-filter-bar-drawer.test.js +77 -0
- package/dist/opportunities/__tests__/opportunity-filter-bar-drawer.test.js.map +1 -0
- package/dist/opportunities/__tests__/opportunity-filter-bar.test.d.ts +2 -0
- package/dist/opportunities/__tests__/opportunity-filter-bar.test.d.ts.map +1 -0
- package/dist/opportunities/__tests__/opportunity-filter-bar.test.js +107 -0
- package/dist/opportunities/__tests__/opportunity-filter-bar.test.js.map +1 -0
- package/dist/opportunities/__tests__/opportunity-reopen-button.test.d.ts +2 -0
- package/dist/opportunities/__tests__/opportunity-reopen-button.test.d.ts.map +1 -0
- package/dist/opportunities/__tests__/opportunity-reopen-button.test.js +29 -0
- package/dist/opportunities/__tests__/opportunity-reopen-button.test.js.map +1 -0
- package/dist/opportunities/__tests__/opportunity-republish-button.test.d.ts +2 -0
- package/dist/opportunities/__tests__/opportunity-republish-button.test.d.ts.map +1 -0
- package/dist/opportunities/__tests__/opportunity-republish-button.test.js +29 -0
- package/dist/opportunities/__tests__/opportunity-republish-button.test.js.map +1 -0
- package/dist/opportunities/__tests__/opportunity-resume-draft-button.test.d.ts +2 -0
- package/dist/opportunities/__tests__/opportunity-resume-draft-button.test.d.ts.map +1 -0
- package/dist/opportunities/__tests__/opportunity-resume-draft-button.test.js +19 -0
- package/dist/opportunities/__tests__/opportunity-resume-draft-button.test.js.map +1 -0
- package/dist/opportunities/__tests__/opportunity-view-offers-button.test.d.ts +2 -0
- package/dist/opportunities/__tests__/opportunity-view-offers-button.test.d.ts.map +1 -0
- package/dist/opportunities/__tests__/opportunity-view-offers-button.test.js +23 -0
- package/dist/opportunities/__tests__/opportunity-view-offers-button.test.js.map +1 -0
- package/dist/opportunities/index.d.ts +51 -1
- package/dist/opportunities/index.d.ts.map +1 -1
- package/dist/opportunities/index.js +35 -0
- package/dist/opportunities/index.js.map +1 -1
- package/dist/opportunities/opportunities-table.d.ts +4 -0
- package/dist/opportunities/opportunities-table.d.ts.map +1 -1
- package/dist/opportunities/opportunities-table.js +4 -0
- package/dist/opportunities/opportunities-table.js.map +1 -1
- package/dist/opportunities/opportunity-add-to-journey-button.d.ts +12 -0
- package/dist/opportunities/opportunity-add-to-journey-button.d.ts.map +1 -0
- package/dist/opportunities/opportunity-add-to-journey-button.js +42 -0
- package/dist/opportunities/opportunity-add-to-journey-button.js.map +1 -0
- package/dist/opportunities/opportunity-card-actions-menu.d.ts +9 -0
- package/dist/opportunities/opportunity-card-actions-menu.d.ts.map +1 -0
- package/dist/opportunities/opportunity-card-actions-menu.js +33 -0
- package/dist/opportunities/opportunity-card-actions-menu.js.map +1 -0
- package/dist/opportunities/opportunity-card-actions-menu.stories.d.ts +14 -0
- package/dist/opportunities/opportunity-card-actions-menu.stories.d.ts.map +1 -0
- package/dist/opportunities/opportunity-card-actions-menu.stories.js +12 -0
- package/dist/opportunities/opportunity-card-actions-menu.stories.js.map +1 -0
- package/dist/opportunities/opportunity-celebration.d.ts +8 -0
- package/dist/opportunities/opportunity-celebration.d.ts.map +1 -0
- package/dist/opportunities/opportunity-celebration.js +17 -0
- package/dist/opportunities/opportunity-celebration.js.map +1 -0
- package/dist/opportunities/opportunity-celebration.stories.d.ts +17 -0
- package/dist/opportunities/opportunity-celebration.stories.d.ts.map +1 -0
- package/dist/opportunities/opportunity-celebration.stories.js +30 -0
- package/dist/opportunities/opportunity-celebration.stories.js.map +1 -0
- package/dist/opportunities/opportunity-filter-bar-drawer.d.ts +10 -0
- package/dist/opportunities/opportunity-filter-bar-drawer.d.ts.map +1 -0
- package/dist/opportunities/opportunity-filter-bar-drawer.js +54 -0
- package/dist/opportunities/opportunity-filter-bar-drawer.js.map +1 -0
- package/dist/opportunities/opportunity-filter-bar.d.ts +14 -0
- package/dist/opportunities/opportunity-filter-bar.d.ts.map +1 -0
- package/dist/opportunities/opportunity-filter-bar.js +65 -0
- package/dist/opportunities/opportunity-filter-bar.js.map +1 -0
- package/dist/opportunities/opportunity-filter-bar.stories.d.ts +25 -0
- package/dist/opportunities/opportunity-filter-bar.stories.d.ts.map +1 -0
- package/dist/opportunities/opportunity-filter-bar.stories.js +63 -0
- package/dist/opportunities/opportunity-filter-bar.stories.js.map +1 -0
- package/dist/opportunities/opportunity-reopen-button.d.ts +11 -0
- package/dist/opportunities/opportunity-reopen-button.d.ts.map +1 -0
- package/dist/opportunities/opportunity-reopen-button.js +20 -0
- package/dist/opportunities/opportunity-reopen-button.js.map +1 -0
- package/dist/opportunities/opportunity-republish-button.d.ts +7 -0
- package/dist/opportunities/opportunity-republish-button.d.ts.map +1 -0
- package/dist/opportunities/opportunity-republish-button.js +14 -0
- package/dist/opportunities/opportunity-republish-button.js.map +1 -0
- package/dist/opportunities/opportunity-resume-draft-button.d.ts +7 -0
- package/dist/opportunities/opportunity-resume-draft-button.d.ts.map +1 -0
- package/dist/opportunities/opportunity-resume-draft-button.js +7 -0
- package/dist/opportunities/opportunity-resume-draft-button.js.map +1 -0
- package/dist/opportunities/opportunity-stacked-list.d.ts.map +1 -1
- package/dist/opportunities/opportunity-stacked-list.js +3 -1
- package/dist/opportunities/opportunity-stacked-list.js.map +1 -1
- package/dist/opportunities/opportunity-view-offers-button.d.ts +7 -0
- package/dist/opportunities/opportunity-view-offers-button.d.ts.map +1 -0
- package/dist/opportunities/opportunity-view-offers-button.js +8 -0
- package/dist/opportunities/opportunity-view-offers-button.js.map +1 -0
- package/dist/opportunities/two-column-section.d.ts.map +1 -1
- package/dist/opportunities/two-column-section.js +4 -3
- package/dist/opportunities/two-column-section.js.map +1 -1
- package/dist/opportunities/wizard/__a11y__/opportunity-wizard.a11y.test.d.ts +2 -0
- package/dist/opportunities/wizard/__a11y__/opportunity-wizard.a11y.test.d.ts.map +1 -0
- package/dist/opportunities/wizard/__a11y__/opportunity-wizard.a11y.test.js +53 -0
- package/dist/opportunities/wizard/__a11y__/opportunity-wizard.a11y.test.js.map +1 -0
- package/dist/opportunities/wizard/__a11y__/wizard-stepper.a11y.test.d.ts +2 -0
- package/dist/opportunities/wizard/__a11y__/wizard-stepper.a11y.test.d.ts.map +1 -0
- package/dist/opportunities/wizard/__a11y__/wizard-stepper.a11y.test.js +32 -0
- package/dist/opportunities/wizard/__a11y__/wizard-stepper.a11y.test.js.map +1 -0
- package/dist/opportunities/wizard/__tests__/opportunity-wizard.test.d.ts +2 -0
- package/dist/opportunities/wizard/__tests__/opportunity-wizard.test.d.ts.map +1 -0
- package/dist/opportunities/wizard/__tests__/opportunity-wizard.test.js +127 -0
- package/dist/opportunities/wizard/__tests__/opportunity-wizard.test.js.map +1 -0
- package/dist/opportunities/wizard/__tests__/step-opportunities.test.d.ts +2 -0
- package/dist/opportunities/wizard/__tests__/step-opportunities.test.d.ts.map +1 -0
- package/dist/opportunities/wizard/__tests__/step-opportunities.test.js +93 -0
- package/dist/opportunities/wizard/__tests__/step-opportunities.test.js.map +1 -0
- package/dist/opportunities/wizard/__tests__/step-pricing-timeline.test.d.ts +2 -0
- package/dist/opportunities/wizard/__tests__/step-pricing-timeline.test.d.ts.map +1 -0
- package/dist/opportunities/wizard/__tests__/step-pricing-timeline.test.js +141 -0
- package/dist/opportunities/wizard/__tests__/step-pricing-timeline.test.js.map +1 -0
- package/dist/opportunities/wizard/__tests__/step-review.test.d.ts +2 -0
- package/dist/opportunities/wizard/__tests__/step-review.test.d.ts.map +1 -0
- package/dist/opportunities/wizard/__tests__/step-review.test.js +80 -0
- package/dist/opportunities/wizard/__tests__/step-review.test.js.map +1 -0
- package/dist/opportunities/wizard/__tests__/step-tender-basics.test.d.ts +2 -0
- package/dist/opportunities/wizard/__tests__/step-tender-basics.test.d.ts.map +1 -0
- package/dist/opportunities/wizard/__tests__/step-tender-basics.test.js +76 -0
- package/dist/opportunities/wizard/__tests__/step-tender-basics.test.js.map +1 -0
- package/dist/opportunities/wizard/__tests__/use-wizard-draft.test.d.ts +2 -0
- package/dist/opportunities/wizard/__tests__/use-wizard-draft.test.d.ts.map +1 -0
- package/dist/opportunities/wizard/__tests__/use-wizard-draft.test.js +192 -0
- package/dist/opportunities/wizard/__tests__/use-wizard-draft.test.js.map +1 -0
- package/dist/opportunities/wizard/__tests__/wizard-stepper.test.d.ts +2 -0
- package/dist/opportunities/wizard/__tests__/wizard-stepper.test.d.ts.map +1 -0
- package/dist/opportunities/wizard/__tests__/wizard-stepper.test.js +61 -0
- package/dist/opportunities/wizard/__tests__/wizard-stepper.test.js.map +1 -0
- package/dist/opportunities/wizard/opportunity-wizard.d.ts +29 -0
- package/dist/opportunities/wizard/opportunity-wizard.d.ts.map +1 -0
- package/dist/opportunities/wizard/opportunity-wizard.js +196 -0
- package/dist/opportunities/wizard/opportunity-wizard.js.map +1 -0
- package/dist/opportunities/wizard/opportunity-wizard.stories.d.ts +12 -0
- package/dist/opportunities/wizard/opportunity-wizard.stories.d.ts.map +1 -0
- package/dist/opportunities/wizard/opportunity-wizard.stories.js +49 -0
- package/dist/opportunities/wizard/opportunity-wizard.stories.js.map +1 -0
- package/dist/opportunities/wizard/step-opportunities.d.ts +9 -0
- package/dist/opportunities/wizard/step-opportunities.d.ts.map +1 -0
- package/dist/opportunities/wizard/step-opportunities.js +80 -0
- package/dist/opportunities/wizard/step-opportunities.js.map +1 -0
- package/dist/opportunities/wizard/step-pricing-timeline.d.ts +9 -0
- package/dist/opportunities/wizard/step-pricing-timeline.d.ts.map +1 -0
- package/dist/opportunities/wizard/step-pricing-timeline.js +64 -0
- package/dist/opportunities/wizard/step-pricing-timeline.js.map +1 -0
- package/dist/opportunities/wizard/step-review.d.ts +9 -0
- package/dist/opportunities/wizard/step-review.d.ts.map +1 -0
- package/dist/opportunities/wizard/step-review.js +34 -0
- package/dist/opportunities/wizard/step-review.js.map +1 -0
- package/dist/opportunities/wizard/step-tender-basics.d.ts +16 -0
- package/dist/opportunities/wizard/step-tender-basics.d.ts.map +1 -0
- package/dist/opportunities/wizard/step-tender-basics.js +39 -0
- package/dist/opportunities/wizard/step-tender-basics.js.map +1 -0
- package/dist/opportunities/wizard/use-wizard-draft.d.ts +41 -0
- package/dist/opportunities/wizard/use-wizard-draft.d.ts.map +1 -0
- package/dist/opportunities/wizard/use-wizard-draft.js +214 -0
- package/dist/opportunities/wizard/use-wizard-draft.js.map +1 -0
- package/dist/opportunities/wizard/wizard-stepper.d.ts +20 -0
- package/dist/opportunities/wizard/wizard-stepper.d.ts.map +1 -0
- package/dist/opportunities/wizard/wizard-stepper.js +26 -0
- package/dist/opportunities/wizard/wizard-stepper.js.map +1 -0
- package/dist/opportunities/wizard/wizard-stepper.stories.d.ts +22 -0
- package/dist/opportunities/wizard/wizard-stepper.stories.d.ts.map +1 -0
- package/dist/opportunities/wizard/wizard-stepper.stories.js +47 -0
- package/dist/opportunities/wizard/wizard-stepper.stories.js.map +1 -0
- package/dist/opportunities/wizard/wizard.types.d.ts +176 -0
- package/dist/opportunities/wizard/wizard.types.d.ts.map +1 -0
- package/dist/opportunities/wizard/wizard.types.js +62 -0
- package/dist/opportunities/wizard/wizard.types.js.map +1 -0
- package/package.json +13 -4
- package/src/offer/offer-document.print.css +72 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { CounterSlideOver } from "./counter-slide-over";
|
|
4
|
+
import { ShadcnButton as Button } from "../components/shadcn-button";
|
|
5
|
+
const meta = {
|
|
6
|
+
title: "Offer/CounterSlideOver",
|
|
7
|
+
component: CounterSlideOver,
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
parameters: { layout: "fullscreen" },
|
|
10
|
+
};
|
|
11
|
+
export default meta;
|
|
12
|
+
const baseTerms = {
|
|
13
|
+
price: 4.1,
|
|
14
|
+
currency: "EUR",
|
|
15
|
+
volume: 20000,
|
|
16
|
+
volumeUnit: "L",
|
|
17
|
+
incoterms: "FOB",
|
|
18
|
+
paymentTerms: "Net 30",
|
|
19
|
+
deliveryDate: "2026-08-15",
|
|
20
|
+
validUntil: "2026-05-22",
|
|
21
|
+
};
|
|
22
|
+
const strong = {
|
|
23
|
+
headline: "strong",
|
|
24
|
+
headlineSummary: "All requirements met",
|
|
25
|
+
criteria: [
|
|
26
|
+
{ id: "price", label: "Price", state: "ok", offered: 4.1, required: 4.2, viewerAdvantage: "improved" },
|
|
27
|
+
],
|
|
28
|
+
freeTextFields: [],
|
|
29
|
+
hiddenReasons: [],
|
|
30
|
+
};
|
|
31
|
+
function Wrapper(props) {
|
|
32
|
+
const [open, setOpen] = useState(true);
|
|
33
|
+
return (_jsxs("div", { className: "relative min-h-screen bg-muted/20 p-8", children: [_jsx(Button, { onClick: () => setOpen(true), children: "Open counter composer" }), _jsx(CounterSlideOver, { open: open, onClose: () => setOpen(false), offerId: "offer-1", round: props.round, allowedIncoterms: ["FOB", "CIF", "EXW"], baselineTerms: props.previousTerms, initialMatchEvaluation: strong, onSubmit: async () => { }, onEvaluateDraft: (_draft) => strong, banner: props.bannerKind === "incoming_counter"
|
|
34
|
+
? { kind: "incoming_counter", roundN: props.round + 1, headline: "R3: €4.15", onReset: () => { }, onDismiss: () => { } }
|
|
35
|
+
: props.bannerKind === "round_cap"
|
|
36
|
+
? { kind: "round_cap" }
|
|
37
|
+
: props.bannerKind === "version_conflict"
|
|
38
|
+
? { kind: "version_conflict", onReload: () => { } }
|
|
39
|
+
: props.bannerKind === "rate_limit"
|
|
40
|
+
? { kind: "rate_limit", retryAfterSeconds: 28 }
|
|
41
|
+
: props.bannerKind === "validation"
|
|
42
|
+
? { kind: "validation", message: "Price must be a positive number." }
|
|
43
|
+
: undefined })] }));
|
|
44
|
+
}
|
|
45
|
+
export const Round1PreFill = {
|
|
46
|
+
args: { open: true, onClose: () => { }, offerId: "o", round: 1, allowedIncoterms: [], baselineTerms: baseTerms, initialMatchEvaluation: strong, onSubmit: async () => { }, onEvaluateDraft: () => strong },
|
|
47
|
+
render: () => _jsx(Wrapper, { round: 1, previousTerms: baseTerms }),
|
|
48
|
+
};
|
|
49
|
+
export const Round2PreFill = {
|
|
50
|
+
args: { open: true, onClose: () => { }, offerId: "o", round: 2, allowedIncoterms: [], baselineTerms: baseTerms, initialMatchEvaluation: strong, onSubmit: async () => { }, onEvaluateDraft: () => strong },
|
|
51
|
+
render: () => _jsx(Wrapper, { round: 2, previousTerms: { ...baseTerms, price: 3.95 } }),
|
|
52
|
+
};
|
|
53
|
+
export const MidComposeDiffBanner = {
|
|
54
|
+
args: { open: true, onClose: () => { }, offerId: "o", round: 2, allowedIncoterms: [], baselineTerms: baseTerms, initialMatchEvaluation: strong, onSubmit: async () => { }, onEvaluateDraft: () => strong },
|
|
55
|
+
render: () => _jsx(Wrapper, { round: 2, previousTerms: baseTerms, bannerKind: "incoming_counter" }),
|
|
56
|
+
};
|
|
57
|
+
export const RoundCap409 = {
|
|
58
|
+
args: { open: true, onClose: () => { }, offerId: "o", round: 4, allowedIncoterms: [], baselineTerms: baseTerms, initialMatchEvaluation: strong, onSubmit: async () => { }, onEvaluateDraft: () => strong },
|
|
59
|
+
render: () => _jsx(Wrapper, { round: 4, previousTerms: baseTerms, bannerKind: "round_cap" }),
|
|
60
|
+
};
|
|
61
|
+
export const VersionConflict409 = {
|
|
62
|
+
args: { open: true, onClose: () => { }, offerId: "o", round: 2, allowedIncoterms: [], baselineTerms: baseTerms, initialMatchEvaluation: strong, onSubmit: async () => { }, onEvaluateDraft: () => strong },
|
|
63
|
+
render: () => _jsx(Wrapper, { round: 2, previousTerms: baseTerms, bannerKind: "version_conflict" }),
|
|
64
|
+
};
|
|
65
|
+
export const RateLimit429 = {
|
|
66
|
+
args: { open: true, onClose: () => { }, offerId: "o", round: 2, allowedIncoterms: [], baselineTerms: baseTerms, initialMatchEvaluation: strong, onSubmit: async () => { }, onEvaluateDraft: () => strong },
|
|
67
|
+
render: () => _jsx(Wrapper, { round: 2, previousTerms: baseTerms, bannerKind: "rate_limit" }),
|
|
68
|
+
};
|
|
69
|
+
export const ValidationError = {
|
|
70
|
+
args: { open: true, onClose: () => { }, offerId: "o", round: 2, allowedIncoterms: [], baselineTerms: baseTerms, initialMatchEvaluation: strong, onSubmit: async () => { }, onEvaluateDraft: () => strong },
|
|
71
|
+
render: () => _jsx(Wrapper, { round: 2, previousTerms: baseTerms, bannerKind: "validation" }),
|
|
72
|
+
};
|
|
73
|
+
function FocusTrapAndReturnDemo() {
|
|
74
|
+
const [open, setOpen] = useState(false);
|
|
75
|
+
return (_jsxs("div", { className: "relative min-h-screen bg-muted/20 p-8", children: [_jsx(Button, { "data-testid": "opener", onClick: () => setOpen(true), children: "Open counter composer" }), _jsx(CounterSlideOver, { open: open, onClose: () => setOpen(false), offerId: "offer-1", round: 2, allowedIncoterms: ["FOB", "CIF", "EXW"], baselineTerms: baseTerms, initialMatchEvaluation: strong, onSubmit: async () => { }, onEvaluateDraft: (draft) => ({
|
|
76
|
+
...strong,
|
|
77
|
+
// Regrade headline based on draft.price so aria-live has
|
|
78
|
+
// something new to announce.
|
|
79
|
+
headline: draft.price > baseTerms.price ? "partial" : "strong",
|
|
80
|
+
headlineSummary: draft.price > baseTerms.price
|
|
81
|
+
? `Price now ${draft.price.toFixed(2)} — above baseline`
|
|
82
|
+
: "All requirements met",
|
|
83
|
+
}) })] }));
|
|
84
|
+
}
|
|
85
|
+
// Blocker B2 — focus-trap + focus-return + aria-live announcement. Prose
|
|
86
|
+
// claims in the plan are not enforceable — a play function is. Verifies:
|
|
87
|
+
// (a) on open, document.activeElement === priceInputRef.current,
|
|
88
|
+
// (b) Tab cycles through dialog-internal focusable controls only (stays in),
|
|
89
|
+
// (c) close returns focus to the opener button,
|
|
90
|
+
// (d) typing into the price input updates MatchPreview's aria-live region.
|
|
91
|
+
export const FocusTrapAndReturn = {
|
|
92
|
+
name: "Focus trap + return + aria-live",
|
|
93
|
+
args: {
|
|
94
|
+
open: false, // start closed so we can test open/close transitions
|
|
95
|
+
onClose: () => { },
|
|
96
|
+
offerId: "o",
|
|
97
|
+
round: 2,
|
|
98
|
+
allowedIncoterms: ["FOB", "CIF", "EXW"],
|
|
99
|
+
baselineTerms: baseTerms,
|
|
100
|
+
initialMatchEvaluation: strong,
|
|
101
|
+
onSubmit: async () => { },
|
|
102
|
+
onEvaluateDraft: () => strong,
|
|
103
|
+
},
|
|
104
|
+
render: () => _jsx(FocusTrapAndReturnDemo, {}),
|
|
105
|
+
play: async ({ canvasElement, step }) => {
|
|
106
|
+
const { within, userEvent } = await import("storybook/test");
|
|
107
|
+
const { expect } = await import("vitest");
|
|
108
|
+
const canvas = within(canvasElement);
|
|
109
|
+
let opener;
|
|
110
|
+
await step("(a) Open dialog; initial focus lands on the price input", async () => {
|
|
111
|
+
opener = canvas.getByTestId("opener");
|
|
112
|
+
await userEvent.click(opener);
|
|
113
|
+
// Headless UI renders into a portal — query the whole document.
|
|
114
|
+
const priceInput = await within(document.body).findByLabelText(/Price \(/);
|
|
115
|
+
await expect(document.activeElement).toBe(priceInput);
|
|
116
|
+
});
|
|
117
|
+
await step("(b) Tab cycles through dialog-internal focusable controls only", async () => {
|
|
118
|
+
const initial = document.activeElement;
|
|
119
|
+
const dialogRoot = initial.closest('[role="dialog"]');
|
|
120
|
+
// Cycle Tab several times; after each press, the active element must
|
|
121
|
+
// still be inside the dialog root (focus trap honours).
|
|
122
|
+
for (let i = 0; i < 12; i++) {
|
|
123
|
+
await userEvent.tab();
|
|
124
|
+
const active = document.activeElement;
|
|
125
|
+
await expect(dialogRoot.contains(active)).toBe(true);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
await step("(d) Typing into price input updates MatchPreview aria-live", async () => {
|
|
129
|
+
// MatchPreview has role="status" + aria-live="polite" in Task 3.7.
|
|
130
|
+
// Its text should include the new headline summary after regrade.
|
|
131
|
+
const priceInput = within(document.body).getByLabelText(/Price \(/);
|
|
132
|
+
await userEvent.clear(priceInput);
|
|
133
|
+
await userEvent.type(priceInput, "5.00");
|
|
134
|
+
const status = await within(document.body).findByRole("status");
|
|
135
|
+
await expect(status).toHaveTextContent(/Price now 5\.00/i);
|
|
136
|
+
});
|
|
137
|
+
await step("(c) Close dialog; focus returns to the opener button", async () => {
|
|
138
|
+
await userEvent.keyboard("{Escape}");
|
|
139
|
+
await expect(document.activeElement).toBe(opener);
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
// The fixture that the backend evaluator MUST emit for the `draft` below.
|
|
144
|
+
// Keep this literal — do not derive from live data. Update deliberately.
|
|
145
|
+
const CONTRACT_EXPECTED_EVALUATION = {
|
|
146
|
+
headline: "partial",
|
|
147
|
+
headlineSummary: "Price is 4.7% over ceiling",
|
|
148
|
+
criteria: [
|
|
149
|
+
{
|
|
150
|
+
id: "price",
|
|
151
|
+
label: "Price",
|
|
152
|
+
state: "partial",
|
|
153
|
+
offered: 4.4,
|
|
154
|
+
required: 4.2,
|
|
155
|
+
reason: "4.7% above ceiling",
|
|
156
|
+
viewerAdvantage: "improved",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
id: "volume",
|
|
160
|
+
label: "Volume",
|
|
161
|
+
state: "ok",
|
|
162
|
+
offered: 20000,
|
|
163
|
+
required: 20000,
|
|
164
|
+
viewerAdvantage: "neutral",
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
freeTextFields: [],
|
|
168
|
+
hiddenReasons: [],
|
|
169
|
+
};
|
|
170
|
+
function MatchEvaluatorContractFixtureDemo() {
|
|
171
|
+
const [open, setOpen] = useState(true);
|
|
172
|
+
const [lastDraft, setLastDraft] = useState(null);
|
|
173
|
+
const [lastEvaluation, setLastEvaluation] = useState(null);
|
|
174
|
+
return (_jsxs("div", { className: "relative min-h-screen bg-muted/20 p-8", children: [_jsx(CounterSlideOver, { open: open, onClose: () => setOpen(false), offerId: "offer-fixture", round: 2, allowedIncoterms: ["FOB", "CIF", "EXW"], baselineTerms: { ...baseTerms, price: 4.4 }, initialMatchEvaluation: CONTRACT_EXPECTED_EVALUATION, onSubmit: async () => { }, onEvaluateDraft: (draft) => {
|
|
175
|
+
setLastDraft({ ...baseTerms, price: draft.price, volume: draft.volume });
|
|
176
|
+
setLastEvaluation(CONTRACT_EXPECTED_EVALUATION);
|
|
177
|
+
return CONTRACT_EXPECTED_EVALUATION;
|
|
178
|
+
} }), _jsx("pre", { "data-testid": "contract-fixture-json", className: "mt-4 rounded-lg border border-border/60 bg-card p-3 text-xs", children: JSON.stringify({ draft: lastDraft, evaluation: lastEvaluation, expected: CONTRACT_EXPECTED_EVALUATION }, null, 2) })] }));
|
|
179
|
+
}
|
|
180
|
+
// Blocker B4 — contract test: the prop `onEvaluateDraft(draft)` passed into
|
|
181
|
+
// CounterSlideOver must produce a MatchEvaluation structurally identical to
|
|
182
|
+
// the real backend evaluator's response. This story pins a fixture so any
|
|
183
|
+
// drift in the shape (field names, nullability, viewerAdvantage per
|
|
184
|
+
// criterion) breaks the story. When Plan 2 ships the real evaluator, a CI
|
|
185
|
+
// contract test should import THIS fixture and assert the backend emits the
|
|
186
|
+
// same JSON for the same input. Until then, the fixture is the contract.
|
|
187
|
+
export const MatchEvaluatorContractFixture = {
|
|
188
|
+
name: "Contract fixture — onEvaluateDraft shape",
|
|
189
|
+
args: {
|
|
190
|
+
open: true,
|
|
191
|
+
onClose: () => { },
|
|
192
|
+
offerId: "offer-fixture",
|
|
193
|
+
round: 2,
|
|
194
|
+
allowedIncoterms: ["FOB", "CIF", "EXW"],
|
|
195
|
+
baselineTerms: baseTerms,
|
|
196
|
+
initialMatchEvaluation: strong,
|
|
197
|
+
onSubmit: async () => { },
|
|
198
|
+
onEvaluateDraft: () => strong,
|
|
199
|
+
},
|
|
200
|
+
render: () => _jsx(MatchEvaluatorContractFixtureDemo, {}),
|
|
201
|
+
play: async ({ canvasElement, step }) => {
|
|
202
|
+
const { within } = await import("storybook/test");
|
|
203
|
+
const { expect } = await import("vitest");
|
|
204
|
+
const canvas = within(canvasElement);
|
|
205
|
+
await step("evaluation is structurally identical to the expected fixture", async () => {
|
|
206
|
+
// The JSON blob contains both `evaluation` (what onEvaluateDraft
|
|
207
|
+
// returned) and `expected` (the hard-coded backend response). If the
|
|
208
|
+
// two diverge, the story fails — flagging drift the moment the consumer
|
|
209
|
+
// wires the real backend.
|
|
210
|
+
const pre = canvas.getByTestId("contract-fixture-json");
|
|
211
|
+
const parsed = JSON.parse(pre.textContent ?? "{}");
|
|
212
|
+
await expect(parsed.evaluation).toEqual(parsed.expected);
|
|
213
|
+
});
|
|
214
|
+
},
|
|
215
|
+
};
|
|
216
|
+
// Responsive coverage per spec §5.5 — CounterSlideOver ships a bottom-
|
|
217
|
+
// sheet variant below 768px. Rendering at `mobile1` (360×640) catches
|
|
218
|
+
// layout-shift + focus-trap regressions on narrow viewports.
|
|
219
|
+
export const MobileBottomSheet = {
|
|
220
|
+
name: "Responsive — mobile bottom sheet",
|
|
221
|
+
args: {
|
|
222
|
+
open: true,
|
|
223
|
+
onClose: () => { },
|
|
224
|
+
offerId: "o",
|
|
225
|
+
round: 2,
|
|
226
|
+
allowedIncoterms: ["FOB", "CIF", "EXW"],
|
|
227
|
+
baselineTerms: baseTerms,
|
|
228
|
+
initialMatchEvaluation: strong,
|
|
229
|
+
onSubmit: async () => { },
|
|
230
|
+
onEvaluateDraft: () => strong,
|
|
231
|
+
},
|
|
232
|
+
parameters: { viewport: { defaultViewport: "mobile1" } },
|
|
233
|
+
render: () => _jsx(Wrapper, { round: 2, previousTerms: baseTerms }),
|
|
234
|
+
};
|
|
235
|
+
//# sourceMappingURL=counter-slide-over.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter-slide-over.stories.js","sourceRoot":"","sources":["../../src/offer/counter-slide-over.stories.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAGrE,MAAM,IAAI,GAAG;IACX,KAAK,EAAE,wBAAwB;IAC/B,SAAS,EAAE,gBAAgB;IAC3B,IAAI,EAAE,CAAC,UAAU,CAAC;IAClB,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE;CACG,CAAC;AAE1C,eAAe,IAAI,CAAC;AAGpB,MAAM,SAAS,GAAe;IAC5B,KAAK,EAAE,GAAG;IACV,QAAQ,EAAE,KAAK;IACf,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,GAAG;IACf,SAAS,EAAE,KAAK;IAChB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,YAAY;IAC1B,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF,MAAM,MAAM,GAAoB;IAC9B,QAAQ,EAAE,QAAQ;IAClB,eAAe,EAAE,sBAAsB;IACvC,QAAQ,EAAE;QACR,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,EAAE,UAAU,EAAE;KACvG;IACD,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,SAAS,OAAO,CAAC,KAIhB;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,OAAO,CACL,eAAK,SAAS,EAAC,uCAAuC,aACpD,KAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,sCAAgC,EACpE,KAAC,gBAAgB,IACf,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAC7B,OAAO,EAAC,SAAS,EACjB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EACvC,aAAa,EAAE,KAAK,CAAC,aAAa,EAClC,sBAAsB,EAAE,MAAM,EAC9B,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EACxB,eAAe,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EACnC,MAAM,EACJ,KAAK,CAAC,UAAU,KAAK,kBAAkB;oBACrC,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;oBACtH,CAAC,CAAC,KAAK,CAAC,UAAU,KAAK,WAAW;wBAChC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE;wBACvB,CAAC,CAAC,KAAK,CAAC,UAAU,KAAK,kBAAkB;4BACvC,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE;4BAClD,CAAC,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY;gCACjC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,iBAAiB,EAAE,EAAE,EAAE;gCAC/C,CAAC,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY;oCACjC,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,kCAAkC,EAAE;oCACrE,CAAC,CAAC,SAAS,GAEvB,IACE,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAU;IAClC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;IACxM,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,GAAI;CAC9D,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAU;IAClC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;IACxM,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,GAAI;CAClF,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAU;IACzC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;IACxM,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAC,kBAAkB,GAAG;CAC5F,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAU;IAChC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;IACxM,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAC,WAAW,GAAG;CACrF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAU;IACvC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;IACxM,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAC,kBAAkB,GAAG;CAC5F,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAU;IACjC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;IACxM,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAC,YAAY,GAAG;CACtF,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAU;IACpC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE;IACxM,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAC,YAAY,GAAG;CACtF,CAAC;AAEF,SAAS,sBAAsB;IAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,CACL,eAAK,SAAS,EAAC,uCAAuC,aACpD,KAAC,MAAM,mBAAa,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,sCAEhD,EACT,KAAC,gBAAgB,IACf,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAC7B,OAAO,EAAC,SAAS,EACjB,KAAK,EAAE,CAAC,EACR,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EACvC,aAAa,EAAE,SAAS,EACxB,sBAAsB,EAAE,MAAM,EAC9B,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EACxB,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC3B,GAAG,MAAM;oBACT,yDAAyD;oBACzD,6BAA6B;oBAC7B,QAAQ,EAAE,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ;oBAC9D,eAAe,EACb,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK;wBAC3B,CAAC,CAAC,aAAa,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB;wBACxD,CAAC,CAAC,sBAAsB;iBAC7B,CAAC,GACF,IACE,CACP,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,yEAAyE;AACzE,iEAAiE;AACjE,6EAA6E;AAC7E,gDAAgD;AAChD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,kBAAkB,GAAU;IACvC,IAAI,EAAE,iCAAiC;IACvC,IAAI,EAAE;QACJ,IAAI,EAAE,KAAK,EAAE,qDAAqD;QAClE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,CAAC;QACR,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACvC,aAAa,EAAE,SAAS;QACxB,sBAAsB,EAAE,MAAM;QAC9B,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACxB,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM;KAC9B;IACD,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,sBAAsB,KAAG;IACxC,IAAI,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE;QACtC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QAErC,IAAI,MAAoB,CAAC;QACzB,MAAM,IAAI,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC9B,gEAAgE;YAChE,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YAC3E,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YACtF,MAAM,OAAO,GAAG,QAAQ,CAAC,aAA4B,CAAC;YACtD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAgB,CAAC;YACrE,qEAAqE;YACrE,wDAAwD;YACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC;gBACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAA4B,CAAC;gBACrD,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAClF,mEAAmE;YACnE,kEAAkE;YAClE,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YACpE,MAAM,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAClC,MAAM,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAChE,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YACrC,MAAM,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,0EAA0E;AAC1E,yEAAyE;AACzE,MAAM,4BAA4B,GAAoB;IACpD,QAAQ,EAAE,SAAS;IACnB,eAAe,EAAE,4BAA4B;IAC7C,QAAQ,EAAE;QACR;YACE,EAAE,EAAE,OAAO;YACX,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,oBAAoB;YAC5B,eAAe,EAAE,UAAU;SAC5B;QACD;YACE,EAAE,EAAE,QAAQ;YACZ,KAAK,EAAE,QAAQ;YACf,KAAK,EAAE,IAAI;YACX,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,KAAK;YACf,eAAe,EAAE,SAAS;SAC3B;KACF;IACD,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,EAAE;CAClB,CAAC;AAEF,SAAS,iCAAiC;IACxC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAoB,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAyB,IAAI,CAAC,CAAC;IAEnF,OAAO,CACL,eAAK,SAAS,EAAC,uCAAuC,aACpD,KAAC,gBAAgB,IACf,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAC7B,OAAO,EAAC,eAAe,EACvB,KAAK,EAAE,CAAC,EACR,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EACvC,aAAa,EAAE,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,EAC3C,sBAAsB,EAAE,4BAA4B,EACpD,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,EACxB,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;oBACzB,YAAY,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBACzE,iBAAiB,CAAC,4BAA4B,CAAC,CAAC;oBAChD,OAAO,4BAA4B,CAAC;gBACtC,CAAC,GACD,EACF,6BAAiB,uBAAuB,EAAC,SAAS,EAAC,6DAA6D,YAC7G,IAAI,CAAC,SAAS,CACb,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,4BAA4B,EAAE,EACxF,IAAI,EACJ,CAAC,CACF,GACG,IACF,CACP,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,oEAAoE;AACpE,0EAA0E;AAC1E,4EAA4E;AAC5E,yEAAyE;AACzE,MAAM,CAAC,MAAM,6BAA6B,GAAU;IAClD,IAAI,EAAE,0CAA0C;IAChD,IAAI,EAAE;QACJ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,OAAO,EAAE,eAAe;QACxB,KAAK,EAAE,CAAC;QACR,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACvC,aAAa,EAAE,SAAS;QACxB,sBAAsB,EAAE,MAAM;QAC9B,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACxB,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM;KAC9B;IACD,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,iCAAiC,KAAG;IACnD,IAAI,EAAE,KAAK,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,EAAE;QACtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAClD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;QAErC,MAAM,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YACpF,iEAAiE;YACjE,qEAAqE;YACrE,wEAAwE;YACxE,0BAA0B;YAC1B,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,uBAAuB,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;YACnD,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC;AAEF,uEAAuE;AACvE,sEAAsE;AACtE,6DAA6D;AAC7D,MAAM,CAAC,MAAM,iBAAiB,GAAU;IACtC,IAAI,EAAE,kCAAkC;IACxC,IAAI,EAAE;QACJ,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;QACjB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,CAAC;QACR,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC;QACvC,aAAa,EAAE,SAAS;QACxB,sBAAsB,EAAE,MAAM;QAC9B,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACxB,eAAe,EAAE,GAAG,EAAE,CAAC,MAAM;KAC9B;IACD,UAAU,EAAE,EAAE,QAAQ,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,EAAE;IACxD,MAAM,EAAE,GAAG,EAAE,CAAC,KAAC,OAAO,IAAC,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,SAAS,GAAI;CAC9D,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { OfferFxInfo, OfferPresenceEntry, OfferTerms, Perspective, ViewerAdvantage } from "./types";
|
|
2
|
+
export type FactsCardStatus = "proposed" | "counter_pending" | "accepted" | "declined" | "expired" | "withdrawn";
|
|
3
|
+
export interface FactsCardProps {
|
|
4
|
+
status: FactsCardStatus;
|
|
5
|
+
round: number;
|
|
6
|
+
terms: OfferTerms;
|
|
7
|
+
/** Price at previous round, used to render strikethrough + delta chip. */
|
|
8
|
+
previousPrice?: number;
|
|
9
|
+
/**
|
|
10
|
+
* Viewer advantage for the **top-line price delta chip** only. Derived
|
|
11
|
+
* from the backend `price` criterion's own `viewerAdvantage` — NOT a
|
|
12
|
+
* page-wide constant (blocker B3, spec §11). Other per-field deltas are
|
|
13
|
+
* each rendered by their own per-criterion polarity upstream.
|
|
14
|
+
*/
|
|
15
|
+
viewerAdvantage: ViewerAdvantage;
|
|
16
|
+
/**
|
|
17
|
+
* Viewer perspective. Used to compose aria-labels and by consumers that
|
|
18
|
+
* need to distinguish producer- vs importer-framed copy. Color polarity
|
|
19
|
+
* itself derives from `viewerAdvantage` (and per-criterion advantage in
|
|
20
|
+
* other cards), not from `perspective` directly (blocker B3).
|
|
21
|
+
*/
|
|
22
|
+
perspective?: Perspective;
|
|
23
|
+
presence: OfferPresenceEntry[];
|
|
24
|
+
fx?: OfferFxInfo;
|
|
25
|
+
tenderCurrency?: string;
|
|
26
|
+
condensed?: boolean;
|
|
27
|
+
onExport?: () => void;
|
|
28
|
+
onToggleDetails?: () => void;
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare function FactsCard({ status, round, terms, previousPrice, viewerAdvantage, perspective, presence, fx, tenderCurrency, condensed, onExport, onToggleDetails, className, }: FactsCardProps): import("react/jsx-runtime").JSX.Element;
|
|
32
|
+
//# sourceMappingURL=facts-card.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts-card.d.ts","sourceRoot":"","sources":["../../src/offer/facts-card.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,iBAAiB,GACjB,UAAU,GACV,UAAU,GACV,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,UAAU,CAAC;IAClB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,eAAe,EAAE,eAAe,CAAC;IACjC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoDD,wBAAgB,SAAS,CAAC,EACxB,MAAM,EACN,KAAK,EACL,KAAK,EACL,aAAa,EACb,eAAe,EACf,WAAW,EACX,QAAQ,EACR,EAAE,EACF,cAAc,EACd,SAAiB,EACjB,QAAQ,EACR,eAAe,EACf,SAAS,GACV,EAAE,cAAc,2CAqJhB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { ArrowDown, ArrowUp, ChevronDown, Printer } from "lucide-react";
|
|
4
|
+
import { formatDistanceToNowStrict } from "date-fns";
|
|
5
|
+
import { cn } from "../lib/utils";
|
|
6
|
+
import { ShadcnBadge as Badge } from "../components/shadcn-badge";
|
|
7
|
+
import { ShadcnButton as Button } from "../components/shadcn-button";
|
|
8
|
+
const STATUS_LABEL = {
|
|
9
|
+
proposed: "Proposed",
|
|
10
|
+
counter_pending: "Counter pending",
|
|
11
|
+
accepted: "Accepted",
|
|
12
|
+
declined: "Declined",
|
|
13
|
+
expired: "Expired",
|
|
14
|
+
withdrawn: "Withdrawn",
|
|
15
|
+
};
|
|
16
|
+
const ADVANTAGE_TONE = {
|
|
17
|
+
improved: "bg-emerald-100 text-emerald-800 dark:bg-emerald-900 dark:text-emerald-100",
|
|
18
|
+
neutral: "bg-muted text-foreground",
|
|
19
|
+
worsened: "bg-rose-100 text-rose-800 dark:bg-rose-900 dark:text-rose-100",
|
|
20
|
+
};
|
|
21
|
+
function fmtMoney(amount, currency) {
|
|
22
|
+
try {
|
|
23
|
+
return new Intl.NumberFormat("en-US", {
|
|
24
|
+
style: "currency",
|
|
25
|
+
currency,
|
|
26
|
+
maximumFractionDigits: 2,
|
|
27
|
+
}).format(amount);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return `${amount.toFixed(2)} ${currency}`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Spec §19: Composes the screen-reader announcement sentence.
|
|
35
|
+
* Defined outside the component so it is a stable reference and does not
|
|
36
|
+
* need to be listed as a useEffect dependency.
|
|
37
|
+
*/
|
|
38
|
+
function buildAnnouncement(p, s, r, price, currency, dl) {
|
|
39
|
+
const parts = [];
|
|
40
|
+
if (p)
|
|
41
|
+
parts.push(`${p === "producer" ? "Producer" : "Importer"} view`);
|
|
42
|
+
parts.push(STATUS_LABEL[s]);
|
|
43
|
+
parts.push(`Round ${r}`);
|
|
44
|
+
parts.push(`Price ${fmtMoney(price, currency)}`);
|
|
45
|
+
if (dl)
|
|
46
|
+
parts.push(`delta ${dl}`);
|
|
47
|
+
return parts.join(" · ");
|
|
48
|
+
}
|
|
49
|
+
export function FactsCard({ status, round, terms, previousPrice, viewerAdvantage, perspective, presence, fx, tenderCurrency, condensed = false, onExport, onToggleDetails, className, }) {
|
|
50
|
+
const validityText = useMemo(() => {
|
|
51
|
+
if (!terms.validUntil)
|
|
52
|
+
return null;
|
|
53
|
+
if (status !== "proposed" && status !== "counter_pending")
|
|
54
|
+
return null;
|
|
55
|
+
const d = new Date(terms.validUntil);
|
|
56
|
+
if (Number.isNaN(d.getTime()))
|
|
57
|
+
return null;
|
|
58
|
+
return `Valid for ${formatDistanceToNowStrict(d)}`;
|
|
59
|
+
}, [terms.validUntil, status]);
|
|
60
|
+
const delta = previousPrice != null ? terms.price - previousPrice : 0;
|
|
61
|
+
const deltaLabel = delta === 0
|
|
62
|
+
? null
|
|
63
|
+
: `${delta > 0 ? "+" : ""}${fmtMoney(delta, terms.currency)}`;
|
|
64
|
+
/**
|
|
65
|
+
* Spec §19: `aria-live="polite"` updates must be debounced at 1s to
|
|
66
|
+
* avoid spamming screen readers. We store the composed announcement string
|
|
67
|
+
* in state and update it 1s after the underlying values settle — the
|
|
68
|
+
* visible price still updates immediately; only the ANNOUNCED copy is
|
|
69
|
+
* debounced.
|
|
70
|
+
*/
|
|
71
|
+
const [liveAnnouncement, setLiveAnnouncement] = useState(() => buildAnnouncement(perspective, status, round, terms.price, terms.currency, deltaLabel));
|
|
72
|
+
useEffect(() => {
|
|
73
|
+
// Debounce at 1s so screen-reader announcements don't spam on rapid updates (spec §19).
|
|
74
|
+
const h = setTimeout(() => setLiveAnnouncement(buildAnnouncement(perspective, status, round, terms.price, terms.currency, deltaLabel)), 1000);
|
|
75
|
+
return () => clearTimeout(h);
|
|
76
|
+
}, [perspective, status, round, terms.price, terms.currency, deltaLabel]);
|
|
77
|
+
return (_jsxs("div", { role: "region", "aria-label": "Offer key facts",
|
|
78
|
+
// Note: the outer region is NOT aria-live. Making the whole card live
|
|
79
|
+
// causes screen readers to re-announce unrelated elements on every
|
|
80
|
+
// state change. Spec §19 mandates debounced announcements — routed
|
|
81
|
+
// through the dedicated <div role="status"> below.
|
|
82
|
+
className: cn("sticky top-0 z-20 rounded-2xl border border-border/60 bg-card/95 p-4 shadow-sm backdrop-blur", condensed ? "max-h-18" : "max-h-30", className), children: [_jsx("div", { role: "status", "aria-live": "polite", className: "sr-only", children: liveAnnouncement }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsxs(Badge, { variant: "ghost", className: "status-pill", children: [STATUS_LABEL[status], (status === "counter_pending" || status === "proposed") && (_jsxs(_Fragment, { children: [" \u00B7 R", round] }))] }), validityText && (_jsx(Badge, { variant: "ghost", className: "text-xs", children: validityText })), _jsxs("div", { className: "flex items-baseline gap-2", children: [previousPrice != null && previousPrice !== terms.price && (_jsx("span", { className: "text-sm/6 text-muted-foreground line-through", children: fmtMoney(previousPrice, terms.currency) })), _jsx("span", { className: "text-xl font-semibold", children: fmtMoney(terms.price, terms.currency) }), deltaLabel && (_jsxs("span", { "aria-label": `Price ${delta > 0 ? "increased" : "decreased"} by ${fmtMoney(Math.abs(delta), terms.currency)}`, className: cn(
|
|
83
|
+
// Direction icon + color — not color-only. Colorblind
|
|
84
|
+
// sighted users must see direction via shape, not hue.
|
|
85
|
+
"inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium", ADVANTAGE_TONE[viewerAdvantage]), children: [delta > 0 ? (_jsx(ArrowUp, { "aria-hidden": true, className: "size-3" })) : (_jsx(ArrowDown, { "aria-hidden": true, className: "size-3" })), deltaLabel] }))] }), !condensed && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "text-sm/6 text-muted-foreground", children: [terms.volume.toLocaleString(), " ", terms.volumeUnit ?? "L", " \u00B7 total ", fmtMoney(terms.price * terms.volume, terms.currency)] }), _jsx("div", { className: "text-xs text-muted-foreground", children: [terms.incoterms, terms.paymentTerms].filter(Boolean).join(" · ") })] })), _jsxs("div", { className: "ml-auto flex items-center gap-2", children: [presence.map((p) => (_jsxs(Badge, { variant: "ghost", className: "text-xs", children: [p.orgRole === "producer" ? "Producer" : "Importer", " ", p.typing ? "typing" : p.state] }, p.orgRole))), onExport && (_jsxs(Button, { variant: "ghost", size: "sm", onClick: onExport, "aria-label": "Export offer as PDF", children: [_jsx(Printer, { "aria-hidden": true, className: "size-4" }), "Export"] }))] })] }), fx && tenderCurrency && (_jsxs("div", { className: "mt-1 text-xs text-muted-foreground", children: ["\u2248 ", fmtMoney(terms.price * fx.rate, tenderCurrency), " @ ", fx.rate, fx.stale && (_jsx("span", { className: "ml-1 text-amber-700", children: "(cached, may be stale)" }))] })), condensed && onToggleDetails && (_jsxs("button", { type: "button", onClick: onToggleDetails, className: "absolute right-4 top-4 flex items-center gap-1 text-xs text-muted-foreground", "aria-label": "Show condensed details", children: ["Show details", _jsx(ChevronDown, { "aria-hidden": true, className: "size-3" })] }))] }));
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=facts-card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts-card.js","sourceRoot":"","sources":["../../src/offer/facts-card.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { FactsCard } from "./facts-card";
|
|
3
|
+
declare const meta: {
|
|
4
|
+
title: string;
|
|
5
|
+
component: typeof FactsCard;
|
|
6
|
+
tags: string[];
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof meta>;
|
|
13
|
+
export declare const Proposed: Story;
|
|
14
|
+
export declare const CounterPending: Story;
|
|
15
|
+
export declare const Accepted: Story;
|
|
16
|
+
export declare const Declined: Story;
|
|
17
|
+
export declare const Expired: Story;
|
|
18
|
+
export declare const Withdrawn: Story;
|
|
19
|
+
export declare const WithFxConversion: Story;
|
|
20
|
+
export declare const WithStaleFx: Story;
|
|
21
|
+
export declare const CondensedMobile: Story;
|
|
22
|
+
export declare const ResponsiveSmall: Story;
|
|
23
|
+
export declare const DebouncedAriaLive: Story;
|
|
24
|
+
export declare const PrintMedia: Story;
|
|
25
|
+
//# sourceMappingURL=facts-card.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts-card.stories.d.ts","sourceRoot":"","sources":["../../src/offer/facts-card.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,QAAA,MAAM,IAAI;;;;;;;CAKwB,CAAC;AAEnC,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAYnC,eAAO,MAAM,QAAQ,EAAE,KAYtB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAa5B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAiB9B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAkBzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAKF,eAAO,MAAM,eAAe,EAAE,KAU7B,CAAC;AAKF,eAAO,MAAM,iBAAiB,EAAE,KAyB/B,CAAC;AAKF,eAAO,MAAM,UAAU,EAAE,KAgBxB,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { FactsCard } from "./facts-card";
|
|
2
|
+
const meta = {
|
|
3
|
+
title: "Offer/FactsCard",
|
|
4
|
+
component: FactsCard,
|
|
5
|
+
tags: ["autodocs"],
|
|
6
|
+
parameters: { layout: "padded" },
|
|
7
|
+
};
|
|
8
|
+
export default meta;
|
|
9
|
+
const baseTerms = {
|
|
10
|
+
price: 4.1,
|
|
11
|
+
currency: "EUR",
|
|
12
|
+
volume: 20000,
|
|
13
|
+
volumeUnit: "L",
|
|
14
|
+
paymentTerms: "Net 30",
|
|
15
|
+
incoterms: "FOB",
|
|
16
|
+
validUntil: "2026-05-22T12:00:00Z",
|
|
17
|
+
};
|
|
18
|
+
export const Proposed = {
|
|
19
|
+
args: {
|
|
20
|
+
status: "proposed",
|
|
21
|
+
round: 1,
|
|
22
|
+
terms: baseTerms,
|
|
23
|
+
viewerAdvantage: "neutral",
|
|
24
|
+
presence: [
|
|
25
|
+
{ orgRole: "producer", state: "active", typing: false },
|
|
26
|
+
{ orgRole: "importer", state: "idle", typing: false },
|
|
27
|
+
],
|
|
28
|
+
onExport: () => { },
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
export const CounterPending = {
|
|
32
|
+
args: {
|
|
33
|
+
status: "counter_pending",
|
|
34
|
+
round: 2,
|
|
35
|
+
terms: { ...baseTerms, price: 4.4 },
|
|
36
|
+
previousPrice: 4.1,
|
|
37
|
+
viewerAdvantage: "worsened",
|
|
38
|
+
presence: [
|
|
39
|
+
{ orgRole: "producer", state: "active", typing: true },
|
|
40
|
+
{ orgRole: "importer", state: "active", typing: false },
|
|
41
|
+
],
|
|
42
|
+
onExport: () => { },
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
export const Accepted = {
|
|
46
|
+
args: {
|
|
47
|
+
status: "accepted",
|
|
48
|
+
round: 3,
|
|
49
|
+
terms: baseTerms,
|
|
50
|
+
viewerAdvantage: "neutral",
|
|
51
|
+
presence: [],
|
|
52
|
+
onExport: () => { },
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
export const Declined = {
|
|
56
|
+
args: { status: "declined", round: 2, terms: baseTerms, viewerAdvantage: "neutral", presence: [], onExport: () => { } },
|
|
57
|
+
};
|
|
58
|
+
export const Expired = {
|
|
59
|
+
args: { status: "expired", round: 2, terms: baseTerms, viewerAdvantage: "neutral", presence: [], onExport: () => { } },
|
|
60
|
+
};
|
|
61
|
+
export const Withdrawn = {
|
|
62
|
+
args: { status: "withdrawn", round: 2, terms: baseTerms, viewerAdvantage: "neutral", presence: [], onExport: () => { } },
|
|
63
|
+
};
|
|
64
|
+
export const WithFxConversion = {
|
|
65
|
+
args: {
|
|
66
|
+
status: "proposed",
|
|
67
|
+
round: 1,
|
|
68
|
+
terms: baseTerms,
|
|
69
|
+
viewerAdvantage: "neutral",
|
|
70
|
+
presence: [],
|
|
71
|
+
fx: {
|
|
72
|
+
rate: 1.09,
|
|
73
|
+
base: "EUR",
|
|
74
|
+
quote: "USD",
|
|
75
|
+
fetchedAt: "2026-04-20T09:00:00Z",
|
|
76
|
+
provider: "frankfurter",
|
|
77
|
+
},
|
|
78
|
+
tenderCurrency: "USD",
|
|
79
|
+
onExport: () => { },
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
export const WithStaleFx = {
|
|
83
|
+
args: {
|
|
84
|
+
status: "proposed",
|
|
85
|
+
round: 1,
|
|
86
|
+
terms: baseTerms,
|
|
87
|
+
viewerAdvantage: "neutral",
|
|
88
|
+
presence: [],
|
|
89
|
+
fx: {
|
|
90
|
+
rate: 1.09,
|
|
91
|
+
base: "EUR",
|
|
92
|
+
quote: "USD",
|
|
93
|
+
fetchedAt: "2026-04-20T07:00:00Z",
|
|
94
|
+
provider: "frankfurter",
|
|
95
|
+
stale: true,
|
|
96
|
+
},
|
|
97
|
+
tenderCurrency: "USD",
|
|
98
|
+
onExport: () => { },
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
export const CondensedMobile = {
|
|
102
|
+
args: {
|
|
103
|
+
status: "counter_pending",
|
|
104
|
+
round: 2,
|
|
105
|
+
terms: baseTerms,
|
|
106
|
+
viewerAdvantage: "improved",
|
|
107
|
+
presence: [],
|
|
108
|
+
condensed: true,
|
|
109
|
+
onExport: () => { },
|
|
110
|
+
},
|
|
111
|
+
// Spec §5.5: `<768px` (mobile) condenses the Facts Card. Exercising under
|
|
112
|
+
// a mobile viewport catches layout-shift + max-height regressions.
|
|
113
|
+
parameters: { viewport: { defaultViewport: "mobile1" } },
|
|
114
|
+
};
|
|
115
|
+
// Responsive coverage per spec §5.5 — sm/md viewport variants so chromatic /
|
|
116
|
+
// visual-regression catches breakpoint regressions independent of the
|
|
117
|
+
// desktop stories above.
|
|
118
|
+
export const ResponsiveSmall = {
|
|
119
|
+
args: {
|
|
120
|
+
status: "counter_pending",
|
|
121
|
+
round: 2,
|
|
122
|
+
terms: baseTerms,
|
|
123
|
+
viewerAdvantage: "worsened",
|
|
124
|
+
presence: [{ orgRole: "producer", state: "active", typing: true }],
|
|
125
|
+
onExport: () => { },
|
|
126
|
+
},
|
|
127
|
+
parameters: { viewport: { defaultViewport: "mobile2" } },
|
|
128
|
+
};
|
|
129
|
+
// Spec §19 — debounced aria-live announcement (1s). This story's play
|
|
130
|
+
// function asserts that a rapid sequence of price changes produces a
|
|
131
|
+
// SINGLE announcement, not one per keystroke.
|
|
132
|
+
export const DebouncedAriaLive = {
|
|
133
|
+
args: {
|
|
134
|
+
status: "counter_pending",
|
|
135
|
+
round: 2,
|
|
136
|
+
terms: baseTerms,
|
|
137
|
+
viewerAdvantage: "worsened",
|
|
138
|
+
presence: [],
|
|
139
|
+
onExport: () => { },
|
|
140
|
+
},
|
|
141
|
+
play: async ({ canvasElement, step }) => {
|
|
142
|
+
const { within } = await import("storybook/test");
|
|
143
|
+
const { expect } = await import("vitest");
|
|
144
|
+
const canvas = within(canvasElement);
|
|
145
|
+
await step("live region exists and is initially populated", async () => {
|
|
146
|
+
const region = canvas.getByRole("status");
|
|
147
|
+
await expect(region).toBeInTheDocument();
|
|
148
|
+
// Initial render seeds `announced` with the starting value — visible
|
|
149
|
+
// text already present.
|
|
150
|
+
await expect(region.textContent?.length ?? 0).toBeGreaterThan(0);
|
|
151
|
+
});
|
|
152
|
+
// A full debounce regression test is easier in a sandbox with
|
|
153
|
+
// jest.useFakeTimers — for Storybook we assert the wiring exists and
|
|
154
|
+
// defer the timing assertion to a Vitest component test during CI.
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
// Print-media coverage per §10.5 + spec §14.4. Storybook Chromatic can
|
|
158
|
+
// render this mode; locally a Playwright-component test uses
|
|
159
|
+
// page.emulateMedia({ media: "print" }) and takes a snapshot.
|
|
160
|
+
export const PrintMedia = {
|
|
161
|
+
args: {
|
|
162
|
+
status: "proposed",
|
|
163
|
+
round: 1,
|
|
164
|
+
terms: baseTerms,
|
|
165
|
+
viewerAdvantage: "neutral",
|
|
166
|
+
presence: [],
|
|
167
|
+
onExport: () => { },
|
|
168
|
+
},
|
|
169
|
+
parameters: {
|
|
170
|
+
// Storybook Chromatic `modes.print` lands in MODE_PRINT, which applies
|
|
171
|
+
// `@media print` rules from offer-document.print.css. Consumer apps
|
|
172
|
+
// that cannot install Chromatic should run a Playwright-component test
|
|
173
|
+
// using `page.emulateMedia({ media: "print" })`.
|
|
174
|
+
chromatic: { modes: { print: { media: "print" } } },
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
//# sourceMappingURL=facts-card.stories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facts-card.stories.js","sourceRoot":"","sources":["../../src/offer/facts-card.stories.tsx"],"names":[],"mappings":"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"}
|