@cellarnode/ui 0.17.4 → 0.19.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/components/journey-card.d.ts +9 -1
- package/dist/components/journey-card.d.ts.map +1 -1
- package/dist/components/journey-card.js +13 -6
- package/dist/components/journey-card.js.map +1 -1
- package/dist/components/journey-card.stories.d.ts +2 -0
- package/dist/components/journey-card.stories.d.ts.map +1 -1
- package/dist/components/journey-card.stories.js +43 -0
- package/dist/components/journey-card.stories.js.map +1 -1
- package/dist/components/sortable-card-context.d.ts +18 -0
- package/dist/components/sortable-card-context.d.ts.map +1 -0
- package/dist/components/sortable-card-context.js +18 -0
- package/dist/components/sortable-card-context.js.map +1 -0
- package/dist/components/sortable-card-shell.d.ts +40 -21
- package/dist/components/sortable-card-shell.d.ts.map +1 -1
- package/dist/components/sortable-card-shell.js +46 -39
- package/dist/components/sortable-card-shell.js.map +1 -1
- package/dist/components/sortable-card-shell.stories.d.ts +1 -1
- package/dist/components/sortable-card-shell.stories.d.ts.map +1 -1
- package/dist/components/sortable-card-shell.stories.js +28 -15
- package/dist/components/sortable-card-shell.stories.js.map +1 -1
- package/dist/components/sortable-card-shell.test.js +57 -16
- package/dist/components/sortable-card-shell.test.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,81 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from "@headlessui/react";
|
|
4
|
+
import { X, Send, AlertCircle } from "lucide-react";
|
|
5
|
+
import { cn } from "../lib/utils";
|
|
6
|
+
import { ShadcnButton as Button } from "../components/shadcn-button";
|
|
7
|
+
import { ShadcnInput as Input } from "../components/shadcn-input";
|
|
8
|
+
import { ShadcnTextarea as Textarea } from "../components/shadcn-textarea";
|
|
9
|
+
import { Label } from "../components/label";
|
|
10
|
+
import { ShadcnSelect as Select, ShadcnSelectContent as SelectContent, ShadcnSelectItem as SelectItem, ShadcnSelectTrigger as SelectTrigger, ShadcnSelectValue as SelectValue, } from "../components/shadcn-select";
|
|
11
|
+
import { MatchPreview } from "./match-preview";
|
|
12
|
+
function formatDelta(current, baseline, unit) {
|
|
13
|
+
const delta = current - baseline;
|
|
14
|
+
if (delta === 0)
|
|
15
|
+
return null;
|
|
16
|
+
const sign = delta > 0 ? "+" : "";
|
|
17
|
+
return `${sign}${delta.toFixed(2)}${unit ? ` ${unit}` : ""}`;
|
|
18
|
+
}
|
|
19
|
+
export function CounterSlideOver({ open, onClose, offerId: _offerId, round, allowedIncoterms, baselineTerms, initialMatchEvaluation, onSubmit, onEvaluateDraft, banner, className, }) {
|
|
20
|
+
const initial = useMemo(() => ({
|
|
21
|
+
price: baselineTerms.price,
|
|
22
|
+
volume: baselineTerms.volume,
|
|
23
|
+
incoterms: baselineTerms.incoterms ?? "",
|
|
24
|
+
paymentTerms: baselineTerms.paymentTerms ?? "",
|
|
25
|
+
deliveryDate: baselineTerms.deliveryDate ?? "",
|
|
26
|
+
validUntil: baselineTerms.validUntil ?? "",
|
|
27
|
+
message: "",
|
|
28
|
+
attachmentIds: [],
|
|
29
|
+
}), [baselineTerms]);
|
|
30
|
+
const [draft, setDraft] = useState(initial);
|
|
31
|
+
const [evaluation, setEvaluation] = useState(initialMatchEvaluation);
|
|
32
|
+
const [submitting, setSubmitting] = useState(false);
|
|
33
|
+
const priceInputRef = useRef(null);
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- syncs draft to baseline on open transition; intentional controlled reset
|
|
36
|
+
if (open)
|
|
37
|
+
setDraft(initial);
|
|
38
|
+
}, [open, initial]);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- derives evaluation from draft; must stay in sync on every draft change
|
|
41
|
+
setEvaluation(onEvaluateDraft(draft));
|
|
42
|
+
}, [draft, onEvaluateDraft]);
|
|
43
|
+
const handleSubmit = useCallback(async () => {
|
|
44
|
+
if (banner?.kind === "round_cap")
|
|
45
|
+
return;
|
|
46
|
+
setSubmitting(true);
|
|
47
|
+
try {
|
|
48
|
+
await onSubmit(draft);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
setSubmitting(false);
|
|
52
|
+
}
|
|
53
|
+
}, [banner, draft, onSubmit]);
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
function handleKey(e) {
|
|
56
|
+
if (!open)
|
|
57
|
+
return;
|
|
58
|
+
if (e.key === "Escape")
|
|
59
|
+
onClose();
|
|
60
|
+
if ((e.metaKey || e.ctrlKey) && e.key === "Enter") {
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
void handleSubmit();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
document.addEventListener("keydown", handleKey);
|
|
66
|
+
return () => document.removeEventListener("keydown", handleKey);
|
|
67
|
+
}, [open, onClose, handleSubmit]);
|
|
68
|
+
const isRoundOne = round === 1;
|
|
69
|
+
const baselineLabel = isRoundOne ? "vs initial proposal" : "vs counterparty's last proposal";
|
|
70
|
+
return (_jsxs(Dialog, { open: open, onClose: onClose,
|
|
71
|
+
// Blocker B2 — Headless UI's `initialFocus` prop points to the ref we
|
|
72
|
+
// want focused on open. Spec §7.6: "Focus trap on open; returns focus
|
|
73
|
+
// to the triggering button on close." Without this prop Headless UI
|
|
74
|
+
// focuses the first focusable child it finds (the Close button), which
|
|
75
|
+
// does not match the spec or the accompanying aria-live announcement.
|
|
76
|
+
initialFocus: priceInputRef, className: cn("relative z-50", className), "aria-labelledby": "counter-title", "aria-describedby": "counter-baseline-label", children: [_jsx(DialogBackdrop, { className: "fixed inset-0 bg-background/60 backdrop-blur-xs motion-safe:transition-opacity motion-reduce:transition-none" }), _jsx("div", { className: "fixed inset-0 flex md:justify-end", children: _jsxs(DialogPanel, { className: cn("flex h-full w-full flex-col overflow-hidden bg-card shadow-xl", "md:w-[520px] md:rounded-l-2xl", "motion-safe:transition-transform motion-reduce:transition-none"), children: [_jsxs("div", { className: "flex items-center justify-between border-b border-border/60 px-5 py-3", children: [_jsxs("div", { children: [_jsxs(DialogTitle, { id: "counter-title", className: "text-base/6 font-semibold", children: ["Counter \u2014 R", round] }), _jsx("div", { id: "counter-baseline-label", className: "text-xs text-muted-foreground", children: baselineLabel })] }), _jsx("button", { type: "button", onClick: onClose, "aria-label": "Close counter composer", className: "flex size-8 items-center justify-center rounded-lg border border-border/60 hover:bg-accent/30", children: _jsx(X, { "aria-hidden": true, className: "size-4" }) })] }), banner && (_jsxs("div", { role: "alert", className: cn("flex items-start gap-2 border-b border-border/60 px-5 py-3 text-sm", banner.kind === "round_cap" && "bg-amber-50 text-amber-900", banner.kind === "version_conflict" && "bg-amber-50 text-amber-900", banner.kind === "rate_limit" && "bg-amber-50 text-amber-900", banner.kind === "validation" && "bg-rose-50 text-rose-900", banner.kind === "incoming_counter" && "bg-sky-50 text-sky-900"), children: [_jsx(AlertCircle, { "aria-hidden": true, className: "size-4 shrink-0" }), _jsxs("div", { className: "flex-1", children: [banner.kind === "round_cap" && "Round 4 is the final counter. Accept, decline, or wait for the counterparty to respond.", banner.kind === "version_conflict" && "The counterparty acted while you were drafting. Reload to see their latest.", banner.kind === "rate_limit" && `Slow down — you can submit another counter in ${banner.retryAfterSeconds}s.`, banner.kind === "validation" && banner.message, banner.kind === "incoming_counter" && (_jsxs(_Fragment, { children: ["The counterparty just sent a new counter \u2014 R", banner.roundN, ": ", banner.headline, ". Your draft is based on the previous round."] }))] }), banner.kind === "incoming_counter" && (_jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { size: "sm", variant: "ghost", onClick: banner.onDismiss, children: "Dismiss" }), _jsx(Button, { size: "sm", onClick: banner.onReset, children: "Reset from new round" })] })), banner.kind === "version_conflict" && (_jsx(Button, { size: "sm", onClick: banner.onReload, children: "Reload" }))] })), _jsxs("form", { onSubmit: (e) => {
|
|
77
|
+
e.preventDefault();
|
|
78
|
+
void handleSubmit();
|
|
79
|
+
}, className: "flex flex-1 flex-col overflow-y-auto px-5 py-4 gap-4", children: [_jsxs("div", { className: "grid grid-cols-2 gap-3", children: [_jsxs("div", { children: [_jsxs(Label, { htmlFor: "cs-price", className: "text-xs", children: ["Price (", baselineTerms.currency, ")"] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { ref: priceInputRef, id: "cs-price", type: "number", step: "0.01", required: true, min: 0, value: draft.price, onChange: (e) => setDraft((d) => ({ ...d, price: Number(e.target.value) })) }), formatDelta(draft.price, baselineTerms.price, baselineTerms.currency) && (_jsx("span", { "aria-label": `price ${draft.price > baselineTerms.price ? "increased" : "decreased"} by ${Math.abs(draft.price - baselineTerms.price).toFixed(2)} ${baselineTerms.currency}`, className: "rounded-full border border-border/60 bg-muted/50 px-2 py-0.5 text-xs", children: formatDelta(draft.price, baselineTerms.price, baselineTerms.currency) }))] })] }), _jsxs("div", { children: [_jsx(Label, { htmlFor: "cs-volume", className: "text-xs", children: "Volume (L)" }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Input, { id: "cs-volume", type: "number", required: true, min: 1, value: draft.volume, onChange: (e) => setDraft((d) => ({ ...d, volume: Number(e.target.value) })) }), formatDelta(draft.volume, baselineTerms.volume, "L") && (_jsx("span", { "aria-label": `volume ${draft.volume > baselineTerms.volume ? "increased" : "decreased"} by ${Math.abs(draft.volume - baselineTerms.volume)} L`, className: "rounded-full border border-border/60 bg-muted/50 px-2 py-0.5 text-xs", children: formatDelta(draft.volume, baselineTerms.volume, "L") }))] })] }), _jsxs("div", { children: [_jsx(Label, { htmlFor: "cs-incoterms", className: "text-xs", children: "Incoterms" }), _jsxs(Select, { value: draft.incoterms, onValueChange: (v) => setDraft((d) => ({ ...d, incoterms: v })), children: [_jsx(SelectTrigger, { id: "cs-incoterms", children: _jsx(SelectValue, { placeholder: "Select" }) }), _jsx(SelectContent, { children: allowedIncoterms.map((i) => (_jsx(SelectItem, { value: i, children: i }, i))) })] })] }), _jsxs("div", { children: [_jsx(Label, { htmlFor: "cs-payment", className: "text-xs", children: "Payment terms" }), _jsx(Input, { id: "cs-payment", required: true, value: draft.paymentTerms, onChange: (e) => setDraft((d) => ({ ...d, paymentTerms: e.target.value })) })] }), _jsxs("div", { children: [_jsx(Label, { htmlFor: "cs-delivery", className: "text-xs", children: "Delivery date" }), _jsx(Input, { id: "cs-delivery", type: "date", required: true, value: draft.deliveryDate, onChange: (e) => setDraft((d) => ({ ...d, deliveryDate: e.target.value })) })] }), _jsxs("div", { children: [_jsx(Label, { htmlFor: "cs-valid", className: "text-xs", children: "Valid until" }), _jsx(Input, { id: "cs-valid", type: "date", required: true, value: draft.validUntil, onChange: (e) => setDraft((d) => ({ ...d, validUntil: e.target.value })) })] })] }), _jsxs("div", { children: [_jsx(Label, { htmlFor: "cs-message", className: "text-xs", children: "Message (optional)" }), _jsx(Textarea, { id: "cs-message", rows: 3, value: draft.message, onChange: (e) => setDraft((d) => ({ ...d, message: e.target.value })) })] }), _jsx(MatchPreview, { evaluation: evaluation }), _jsxs("div", { className: "mt-auto flex items-center justify-end gap-2 border-t border-border/60 pt-3", children: [_jsx(Button, { type: "button", variant: "ghost", onClick: onClose, children: "Cancel" }), _jsxs(Button, { type: "submit", disabled: submitting || banner?.kind === "round_cap" || banner?.kind === "version_conflict" || banner?.kind === "rate_limit", children: [_jsx(Send, { "aria-hidden": true, className: "size-4" }), "Submit counter (Cmd+Enter)"] })] })] })] }) })] }));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=counter-slide-over.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter-slide-over.js","sourceRoot":"","sources":["../../src/offer/counter-slide-over.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { StoryObj } from "@storybook/react-vite";
|
|
2
|
+
import { CounterSlideOver } from "./counter-slide-over";
|
|
3
|
+
declare const meta: {
|
|
4
|
+
title: string;
|
|
5
|
+
component: typeof CounterSlideOver;
|
|
6
|
+
tags: string[];
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof meta>;
|
|
13
|
+
export declare const Round1PreFill: Story;
|
|
14
|
+
export declare const Round2PreFill: Story;
|
|
15
|
+
export declare const MidComposeDiffBanner: Story;
|
|
16
|
+
export declare const RoundCap409: Story;
|
|
17
|
+
export declare const VersionConflict409: Story;
|
|
18
|
+
export declare const RateLimit429: Story;
|
|
19
|
+
export declare const ValidationError: Story;
|
|
20
|
+
export declare const FocusTrapAndReturn: Story;
|
|
21
|
+
export declare const MatchEvaluatorContractFixture: Story;
|
|
22
|
+
export declare const MobileBottomSheet: Story;
|
|
23
|
+
//# sourceMappingURL=counter-slide-over.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"counter-slide-over.stories.d.ts","sourceRoot":"","sources":["../../src/offer/counter-slide-over.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAIxD,QAAA,MAAM,IAAI;;;;;;;CAK+B,CAAC;AAE1C,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA4DnC,eAAO,MAAM,aAAa,EAAE,KAG3B,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAG3B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAGlC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAGzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAGhC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAG1B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAG7B,CAAC;AAuCF,eAAO,MAAM,kBAAkB,EAAE,KAuDhC,CAAC;AAsEF,eAAO,MAAM,6BAA6B,EAAE,KA6B3C,CAAC;AAKF,eAAO,MAAM,iBAAiB,EAAE,KAe/B,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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":";AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,WAAW,IAAI,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,MAAM,6BAA6B,CAAC;AA8CrE,MAAM,YAAY,GAAoC;IACpD,QAAQ,EAAE,UAAU;IACpB,eAAe,EAAE,iBAAiB;IAClC,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;CACvB,CAAC;AAEF,MAAM,cAAc,GAAoC;IACtD,QAAQ,EACN,2EAA2E;IAC7E,OAAO,EAAE,0BAA0B;IACnC,QAAQ,EAAE,+DAA+D;CAC1E,CAAC;AAEF,SAAS,QAAQ,CAAC,MAAc,EAAE,QAAgB;IAChD,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACpC,KAAK,EAAE,UAAU;YACjB,QAAQ;YACR,qBAAqB,EAAE,CAAC;SACzB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CACxB,CAA0B,EAC1B,CAAkB,EAClB,CAAS,EACT,KAAa,EACb,QAAgB,EAChB,EAAiB;IAEjB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EACxB,MAAM,EACN,KAAK,EACL,KAAK,EACL,aAAa,EACb,eAAe,EACf,WAAW,EACX,QAAQ,EACR,EAAE,EACF,cAAc,EACd,SAAS,GAAG,KAAK,EACjB,QAAQ,EACR,eAAe,EACf,SAAS,GACM;IACf,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,EAAE;QAChC,IAAI,CAAC,KAAK,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QACnC,IAAI,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,iBAAiB;YAAE,OAAO,IAAI,CAAC;QACvE,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,OAAO,aAAa,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GACd,KAAK,KAAK,CAAC;QACT,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;IAElE;;;;;;OAMG;IACH,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAC5D,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CACvF,CAAC;IACF,SAAS,CAAC,GAAG,EAAE;QACb,wFAAwF;QACxF,MAAM,CAAC,GAAG,UAAU,CAClB,GAAG,EAAE,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,EACjH,IAAI,CACL,CAAC;QACF,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAE1E,OAAO,CACL,eACE,IAAI,EAAC,QAAQ,gBACF,iBAAiB;QAC5B,sEAAsE;QACtE,mEAAmE;QACnE,mEAAmE;QACnE,mDAAmD;QACnD,SAAS,EAAE,EAAE,CACX,8FAA8F,EAC9F,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EACnC,SAAS,CACV,aAQD,cAAK,IAAI,EAAC,QAAQ,eAAW,QAAQ,EAAC,SAAS,EAAC,SAAS,YACtD,gBAAgB,GACb,EACN,eAAK,SAAS,EAAC,mCAAmC,aAChD,MAAC,KAAK,IAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,aAAa,aAC3C,YAAY,CAAC,MAAM,CAAC,EACpB,CAAC,MAAM,KAAK,iBAAiB,IAAI,MAAM,KAAK,UAAU,CAAC,IAAI,CAC1D,2CAAO,KAAK,IAAI,CACjB,IACK,EACP,YAAY,IAAI,CACf,KAAC,KAAK,IAAC,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,YACvC,YAAY,GACP,CACT,EACD,eAAK,SAAS,EAAC,2BAA2B,aACvC,aAAa,IAAI,IAAI,IAAI,aAAa,KAAK,KAAK,CAAC,KAAK,IAAI,CACzD,eAAM,SAAS,EAAC,8CAA8C,YAC3D,QAAQ,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,GACnC,CACR,EACD,eAAM,SAAS,EAAC,uBAAuB,YACpC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,GACjC,EACN,UAAU,IAAI,CACb,8BACc,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,OAAO,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,EAC5G,SAAS,EAAE,EAAE;gCACX,sDAAsD;gCACtD,uDAAuD;gCACvD,6EAA6E,EAC7E,cAAc,CAAC,eAAe,CAAC,CAChC,aAEA,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CACX,KAAC,OAAO,yBAAa,SAAS,EAAC,QAAQ,GAAG,CAC3C,CAAC,CAAC,CAAC,CACF,KAAC,SAAS,yBAAa,SAAS,EAAC,QAAQ,GAAG,CAC7C,EACA,UAAU,IACN,CACR,IACG,EACL,CAAC,SAAS,IAAI,CACb,8BACE,eAAK,SAAS,EAAC,iCAAiC,aAC7C,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,OAAG,KAAK,CAAC,UAAU,IAAI,GAAG,oBACjD,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,IACvD,EACN,cAAK,SAAS,EAAC,+BAA+B,YAC3C,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAC9D,IACL,CACJ,EACD,eAAK,SAAS,EAAC,iCAAiC,aAC7C,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACnB,MAAC,KAAK,IAAiB,OAAO,EAAC,OAAO,EAAC,SAAS,EAAC,SAAS,aACvD,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,EACvD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAFpB,CAAC,CAAC,OAAO,CAGb,CACT,CAAC,EACD,QAAQ,IAAI,CACX,MAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,QAAQ,gBACN,qBAAqB,aAEhC,KAAC,OAAO,yBAAa,SAAS,EAAC,QAAQ,GAAG,cAEnC,CACV,IACG,IACF,EACL,EAAE,IAAI,cAAc,IAAI,CACvB,eAAK,SAAS,EAAC,oCAAoC,wBAC9C,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,EAAE,cAAc,CAAC,SAAK,EAAE,CAAC,IAAI,EAC7D,EAAE,CAAC,KAAK,IAAI,CACX,eAAM,SAAS,EAAC,qBAAqB,uCAA8B,CACpE,IACG,CACP,EACA,SAAS,IAAI,eAAe,IAAI,CAC/B,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,eAAe,EACxB,SAAS,EAAC,8EAA8E,gBAC7E,wBAAwB,6BAGnC,KAAC,WAAW,yBAAa,SAAS,EAAC,QAAQ,GAAG,IACvC,CACV,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|