@cognitiveproof/c2pa-react-ddex-component 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require("react"),require("react/jsx-runtime")):typeof define==`function`&&define.amd?define([`exports`,`react`,`react/jsx-runtime`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.C2paReactDdexComponent={},e.React,e.ReactJSXRuntime))})(this,function(e,t,n){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var r=Object.create,i=Object.defineProperty,a=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.getPrototypeOf,c=Object.prototype.hasOwnProperty,l=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var s=o(t),l=0,u=s.length,d;l<u;l++)d=s[l],!c.call(e,d)&&d!==n&&i(e,d,{get:(e=>t[e]).bind(null,d),enumerable:!(r=a(t,d))||r.enumerable});return e};t=((e,t,n)=>(n=e==null?{}:r(s(e)),l(t||!e||!e.__esModule||!c.call(e,`default`)?i(n,`default`,{value:e,enumerable:!0}):n,e)))(t,1);var u=`<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="DDEX">
2
+ <rect x="0.5" y="0.5" width="23" height="23" rx="5" fill="#111827"/>
3
+ <path d="M8 16.6V7.7L17.2 6v9" stroke="#ffffff" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/>
4
+ <circle cx="6.2" cy="16.6" r="2" fill="#ffffff"/>
5
+ <circle cx="15.4" cy="15" r="2" fill="#ffffff"/>
6
+ </svg>`,d=()=>(0,n.jsxs)(`div`,{className:`ddex-header`,children:[(0,n.jsx)(`div`,{className:`ddex-mark`,dangerouslySetInnerHTML:{__html:u}}),(0,n.jsx)(`span`,{className:`ddex-header-title`,children:`DDEX Release Data`})]}),f=`org.mixotron.ddex`;function p(e){return e.assertions?.[f]}function m(e){return e?.ReleaseList?.Release?.[0]}function h(e,t){if(e&&t)return t.find(t=>t.PartyReference===e)?.PartyName?.FullName}function g(e,t){return!e||e.length===0?``:e.map(e=>h(e.ArtistPartyReference,t)).filter(e=>!!e).join(`, `)}function _(e,t){let n=t?.ResourceList?.SoundRecording??[],r=e?.ReleaseResourceReferenceList;return!r||r.length===0?n:n.filter(e=>e.ResourceReference&&r.includes(e.ResourceReference))}function v(e,t){let n=t?.DealList?.ReleaseDeal??[];return e?.ReleaseReference?n.filter(t=>t.DealReleaseReference===e.ReleaseReference):n}function y(e){let t=e?.WholesalePrice;if(t?.Amount)return t.CurrencyCode?`${t.Amount} ${t.CurrencyCode}`:t.Amount}var b={SubscriptionModel:`Subscription`,PayAsYouGoModel:`Pay As You Go`,AdvertisementSupportedModel:`Ad Supported`,FreeOfChargeModel:`Free of Charge`,RightsClaimModel:`Rights Claim`};function x(e){if(e)return b[e]??A(e)}var S={OnDemandStream:`On-Demand Stream`,PermanentDownload:`Permanent Download`,ConditionalDownload:`Conditional Download`,NonInteractiveStream:`Non-Interactive Stream`};function C(e){return S[e]??A(e)}var w={Explicit:`Explicit`,NotExplicit:`Not Explicit`,ExplicitContentEdited:`Edited`,NoAdviceAvailable:`No Advice Available`};function T(e){if(e)return w[e]??A(e)}function E(e){return e.claimGenerator??e.claimGeneratorInfo?.[0]?.name??`Unknown`}function D(e){return e.split(` `).filter(Boolean).map(e=>e[0].toUpperCase()).join(``).slice(0,3)||`?`}function O(e){if(e)try{return new Date(e).toLocaleDateString(void 0,{year:`numeric`,month:`long`,day:`numeric`})}catch{return e}}function k(e){if(e)try{return new Date(e).toLocaleString(void 0,{year:`numeric`,month:`long`,day:`numeric`,hour:`numeric`,minute:`2-digit`})}catch{return e}}function A(e){return e.replace(/[_-]+/g,` `).replace(/([a-z])([A-Z])/g,`$1 $2`).replace(/\b\w/g,e=>e.toUpperCase())}function j(e){return e==null?``:typeof e==`string`||typeof e==`number`||typeof e==`boolean`?String(e):Array.isArray(e)?e.map(e=>j(e)).filter(Boolean).join(`, `):typeof e==`object`?Object.entries(e).map(([e,t])=>`${A(e)}: ${j(t)}`).filter(Boolean).join(`; `):String(e)}function ee({manifest:e,moreInfo:t,className:r}){let i=p(e),a=m(i),o=a?.DisplayTitleText??e.title,s=g(a?.DisplayArtist,i?.PartyList),c=E(e),l=D(o||c),u=a?.DisplayGenre,f=T(a?.ParentalWarningType),h=a?.ParentalWarningType===`Explicit`;return(0,n.jsxs)(`div`,{className:`ddex-card ${r??``}`,children:[(0,n.jsx)(d,{}),(0,n.jsxs)(`div`,{className:`ddex-container`,children:[e.thumbnail?(0,n.jsx)(`img`,{src:e.thumbnail,alt:`Thumbnail`,className:`ddex-thumbnail`}):(0,n.jsx)(`div`,{className:`ddex-square`,children:(0,n.jsx)(`span`,{className:`ddex-logo-text`,children:l})}),(0,n.jsxs)(`div`,{className:`ddex-summary`,children:[(0,n.jsx)(`span`,{className:`ddex-media-title`,children:o}),(0,n.jsx)(`span`,{className:`ddex-artist-name`,children:s||c})]})]}),!i&&(0,n.jsx)(`div`,{className:`ddex-empty`,children:`No DDEX release data found.`}),(u||f)&&(0,n.jsxs)(`div`,{className:`ddex-badges`,children:[u&&(0,n.jsx)(`span`,{className:`ddex-badge`,children:u}),f&&(0,n.jsx)(`span`,{className:`ddex-badge ${h?`ddex-badge-warning`:``}`,children:f})]}),t&&(0,n.jsx)(`div`,{className:`ddex-action`,children:(0,n.jsx)(`button`,{onClick:t,className:`ddex-button`,children:`More Info`})})]})}function te({className:e,manifest:t,moreInfo:r}){let i=p(t),a=m(i),o=a?.DisplayTitleText??t.title,s=g(a?.DisplayArtist,i?.PartyList),c=E(t),l=D(o||c),u=a?.DisplayGenre,f=T(a?.ParentalWarningType),h=a?.ParentalWarningType===`Explicit`,b=_(a,i),S=v(a,i);return(0,n.jsxs)(`div`,{className:`ddex-card ${e??``}`,children:[(0,n.jsx)(d,{}),(0,n.jsxs)(`div`,{className:`ddex-container`,children:[t.thumbnail?(0,n.jsx)(`img`,{src:t.thumbnail,alt:`Thumbnail`,className:`ddex-thumbnail`}):(0,n.jsx)(`div`,{className:`ddex-square`,children:(0,n.jsx)(`span`,{className:`ddex-logo-text`,children:l})}),(0,n.jsxs)(`div`,{className:`ddex-summary`,children:[(0,n.jsx)(`span`,{className:`ddex-media-title`,children:o}),(0,n.jsx)(`span`,{className:`ddex-artist-name`,children:s||c})]})]}),i?(0,n.jsxs)(n.Fragment,{children:[(u||f)&&(0,n.jsxs)(`div`,{className:`ddex-badges`,children:[u&&(0,n.jsx)(`span`,{className:`ddex-badge`,children:u}),f&&(0,n.jsx)(`span`,{className:`ddex-badge ${h?`ddex-badge-warning`:``}`,children:f})]}),a&&(a.LabelName||a.ReleaseId?.UPC||a.CLine||a.PLine)&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(`div`,{className:`ddex-divider`}),(0,n.jsx)(`div`,{className:`ddex-section-title`,children:`Release`}),a.LabelName&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`Label`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:a.LabelName})]}),a.ReleaseId?.UPC&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`UPC`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:a.ReleaseId.UPC})]}),a.CLine&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`℗ / © Line`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:a.CLine})]})]}),b.length>0&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(`div`,{className:`ddex-divider`}),(0,n.jsx)(`div`,{className:`ddex-section-title`,children:`Tracks`}),(0,n.jsx)(`div`,{className:`ddex-track-list`,children:b.map((e,t)=>(0,n.jsxs)(`div`,{className:`ddex-track-item`,children:[(0,n.jsx)(`div`,{className:`ddex-track-title`,children:e.DisplayTitleText}),e.ISRC&&(0,n.jsxs)(`div`,{className:`ddex-track-isrc`,children:[`ISRC `,e.ISRC]})]},e.ResourceReference??t))})]}),S.length>0&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(`div`,{className:`ddex-divider`}),(0,n.jsx)(`div`,{className:`ddex-section-title`,children:`Deals`}),(0,n.jsx)(`div`,{className:`ddex-deal-list`,children:S.map((e,t)=>{let r=e.Deal?.DealTerms,i=y(r?.PriceInformation),a=x(r?.CommercialModelType),o=e.Deal?.Territory??[],s=O(r?.ValidityPeriod?.StartDate);return(0,n.jsxs)(`div`,{className:`ddex-deal-item`,children:[(0,n.jsxs)(`div`,{className:`ddex-deal-row`,children:[a&&(0,n.jsx)(`span`,{className:`ddex-badge`,children:a}),(r?.UseType??[]).map(e=>(0,n.jsx)(`span`,{className:`ddex-badge`,children:C(e)},e))]}),(0,n.jsxs)(`div`,{className:`ddex-deal-meta`,children:[i&&(0,n.jsx)(`span`,{children:i}),o.length>0&&(0,n.jsx)(`span`,{children:o.join(`, `)}),s&&(0,n.jsxs)(`span`,{children:[`From `,s]})]})]},t)})})]})]}):(0,n.jsx)(`div`,{className:`ddex-empty`,children:`No DDEX release data found.`}),r&&(0,n.jsx)(`div`,{className:`ddex-action`,children:(0,n.jsx)(`button`,{onClick:r,className:`ddex-button`,children:`More Info`})})]})}function M(e){let t=[re(e),ae(e),se(e),B(e),W(e)].filter(Boolean);return`<?xml version="1.0" encoding="UTF-8"?>\n${t.length>0?`<NewReleaseMessage>\n${F(t.join(`
7
+ `))}\n</NewReleaseMessage>`:`<NewReleaseMessage />`}\n`}function ne(e){return e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`).replace(/'/g,`&apos;`)}function N(e,t){return t===void 0||t===``?``:`<${e}>${ne(t)}</${e}>`}function P(e,t){let n=t.filter(Boolean).join(`
8
+ `);return n?`<${e}>\n${F(n)}\n</${e}>`:``}function F(e){return e.split(`
9
+ `).map(e=>e&&` ${e}`).join(`
10
+ `)}function re(e){let t=e.MessageHeader;return t?P(`MessageHeader`,[N(`MessageId`,t.MessageId),N(`MessageCreatedDateTime`,t.MessageCreatedDateTime)]):``}function I(e){return e?e.map(e=>P(`DisplayArtist`,[N(`ArtistPartyReference`,e.ArtistPartyReference)])):[]}function ie(e){return P(`Party`,[N(`PartyReference`,e.PartyReference),e.PartyName?.FullName?P(`PartyName`,[N(`FullName`,e.PartyName.FullName)]):``])}function ae(e){let t=e.PartyList;return!t||t.length===0?``:P(`PartyList`,t.map(ie))}function oe(e){return P(`SoundRecording`,[N(`ResourceReference`,e.ResourceReference),N(`ISRC`,e.ISRC),N(`DisplayTitleText`,e.DisplayTitleText),N(`Duration`,e.Duration),...I(e.DisplayArtist)])}function se(e){let t=e.ResourceList?.SoundRecording;return!t||t.length===0?``:P(`ResourceList`,t.map(oe))}function L(e){let t=Object.entries(e??{}).filter(e=>!!e[1]);return t.length===0?``:P(`ReleaseId`,t.map(([e,t])=>N(e,t)))}function R(e){return!e||e.length===0?``:P(`ReleaseResourceReferenceList`,e.map(e=>N(`ReleaseResourceReference`,e)))}function z(e){return P(`Release`,[N(`ReleaseReference`,e.ReleaseReference),L(e.ReleaseId),N(`DisplayTitleText`,e.DisplayTitleText),...I(e.DisplayArtist),N(`LabelName`,e.LabelName),N(`DisplayGenre`,e.DisplayGenre),N(`ParentalWarningType`,e.ParentalWarningType),N(`CLine`,e.CLine),N(`PLine`,e.PLine),R(e.ReleaseResourceReferenceList)])}function B(e){let t=e.ReleaseList?.Release;return!t||t.length===0?``:P(`ReleaseList`,t.map(z))}function V(e){let t=e?.WholesalePrice;return t?.Amount?P(`PriceInformation`,[P(`WholesalePrice`,[N(`Amount`,t.Amount),N(`CurrencyCode`,t.CurrencyCode)])]):``}function H(e){return e?P(`DealTerms`,[N(`CommercialModelType`,e.CommercialModelType),...(e.UseType??[]).map(e=>N(`UseType`,e)),V(e.PriceInformation),e.ValidityPeriod?P(`ValidityPeriod`,[N(`StartDate`,e.ValidityPeriod.StartDate),N(`EndDate`,e.ValidityPeriod.EndDate)]):``]):``}function U(e){return P(`ReleaseDeal`,[N(`DealReleaseReference`,e.DealReleaseReference),e.Deal?P(`Deal`,[...(e.Deal.Territory??[]).map(e=>N(`Territory`,e)),H(e.Deal.DealTerms)]):``])}function W(e){let t=e.DealList?.ReleaseDeal;return!t||t.length===0?``:P(`DealList`,t.map(U))}function G(e){let t=K(e);return{MessageHeader:ce(t),PartyList:ue(t),ResourceList:fe(t),ReleaseList:he(t),DealList:be(t)}}function K(e){if(typeof DOMParser>`u`)throw Error(`xmlToDdexAssertion requires a DOMParser implementation (browser or a DOM-compatible environment).`);let t=new DOMParser().parseFromString(e,`application/xml`),n=t.getElementsByTagName(`parsererror`)[0];if(n)throw Error(`Invalid DDEX XML: ${n.textContent??`unknown parse error`}`);return t.documentElement}function q(e,t){if(e)for(let n=0;n<e.children.length;n++){let r=e.children[n];if(r.tagName===t)return r}}function J(e,t){if(!e)return[];let n=[];for(let r=0;r<e.children.length;r++){let i=e.children[r];i.tagName===t&&n.push(i)}return n}function Y(e){return e?.textContent?.trim()||void 0}function X(e,t){return Y(q(e,t))}function ce(e){let t=q(e,`MessageHeader`);if(!t)return;let n=X(t,`MessageId`),r=X(t,`MessageCreatedDateTime`);if(n||r)return{MessageId:n,MessageCreatedDateTime:r}}function Z(e){let t=J(e,`DisplayArtist`).map(e=>X(e,`ArtistPartyReference`)).filter(e=>!!e).map(e=>({ArtistPartyReference:e}));return t.length>0?t:void 0}function le(e){let t=X(q(e,`PartyName`),`FullName`);return{PartyReference:X(e,`PartyReference`),PartyName:t?{FullName:t}:void 0}}function ue(e){let t=q(e,`PartyList`);if(!t)return;let n=J(t,`Party`).map(le);return n.length>0?n:void 0}function de(e){return{ResourceReference:X(e,`ResourceReference`),ISRC:X(e,`ISRC`),DisplayTitleText:X(e,`DisplayTitleText`),Duration:X(e,`Duration`),DisplayArtist:Z(e)}}function fe(e){let t=q(e,`ResourceList`);if(!t)return;let n=J(t,`SoundRecording`).map(de);return n.length>0?{SoundRecording:n}:void 0}function pe(e){let t=q(e,`ReleaseId`);if(!t)return;let n={};for(let e=0;e<t.children.length;e++){let r=t.children[e],i=Y(r);i&&(n[r.tagName]=i)}return Object.keys(n).length>0?n:void 0}function Q(e){let t=q(e,`ReleaseResourceReferenceList`);if(!t)return;let n=J(t,`ReleaseResourceReference`).map(Y).filter(e=>!!e);return n.length>0?n:void 0}function me(e){return{ReleaseReference:X(e,`ReleaseReference`),ReleaseId:pe(e),DisplayTitleText:X(e,`DisplayTitleText`),DisplayArtist:Z(e),LabelName:X(e,`LabelName`),DisplayGenre:X(e,`DisplayGenre`),ParentalWarningType:X(e,`ParentalWarningType`),CLine:X(e,`CLine`),PLine:X(e,`PLine`),ReleaseResourceReferenceList:Q(e)}}function he(e){let t=q(e,`ReleaseList`);if(!t)return;let n=J(t,`Release`).map(me);return n.length>0?{Release:n}:void 0}function ge(e){let t=q(q(e,`PriceInformation`),`WholesalePrice`);if(!t)return;let n=X(t,`Amount`),r=X(t,`CurrencyCode`);if(n||r)return{WholesalePrice:{Amount:n,CurrencyCode:r}}}function _e(e){let t=q(e,`DealTerms`);if(!t)return;let n=J(t,`UseType`).map(Y).filter(e=>!!e),r=q(t,`ValidityPeriod`),i=X(r,`StartDate`),a=X(r,`EndDate`);return{CommercialModelType:X(t,`CommercialModelType`),UseType:n.length>0?n:void 0,PriceInformation:ge(t),ValidityPeriod:i||a?{StartDate:i,EndDate:a}:void 0}}function ve(e){let t=J(e,`Territory`).map(Y).filter(e=>!!e),n=_e(e);if(t.length!==0||n)return{Territory:t.length>0?t:void 0,DealTerms:n}}function ye(e){let t=q(e,`Deal`);return{DealReleaseReference:X(e,`DealReleaseReference`),Deal:t?ve(t):void 0}}function be(e){let t=q(e,`DealList`);if(!t)return;let n=J(t,`ReleaseDeal`).map(ye);return n.length>0?{ReleaseDeal:n}:void 0}function xe(e,t){let n=`${e.trim().toLowerCase().replace(/[^a-z0-9]+/g,`-`).replace(/(^-|-$)/g,``)||`ddex-release`}.xml`,r=new Blob([t],{type:`application/xml`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=n,document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}function Se({manifest:e,moreInfo:t,className:r}){let i=p(e),a=m(i),o=a?.DisplayTitleText??e.title,s=g(a?.DisplayArtist,i?.PartyList),c=E(e),l=D(o||c),u=a?.DisplayGenre,f=T(a?.ParentalWarningType),b=a?.ParentalWarningType===`Explicit`,S=_(a,i),w=v(a,i),A=i?.PartyList??[],j=i?.MessageHeader;return(0,n.jsxs)(`div`,{className:`ddex-card ${r??``}`,children:[(0,n.jsx)(d,{}),(0,n.jsxs)(`div`,{className:`ddex-container`,children:[e.thumbnail?(0,n.jsx)(`img`,{src:e.thumbnail,alt:`Thumbnail`,className:`ddex-thumbnail`}):(0,n.jsx)(`div`,{className:`ddex-square`,children:(0,n.jsx)(`span`,{className:`ddex-logo-text`,children:l})}),(0,n.jsxs)(`div`,{className:`ddex-summary`,children:[(0,n.jsx)(`span`,{className:`ddex-media-title`,children:o}),(0,n.jsx)(`span`,{className:`ddex-artist-name`,children:s||c})]})]}),i?(0,n.jsxs)(n.Fragment,{children:[(u||f)&&(0,n.jsxs)(`div`,{className:`ddex-badges`,children:[u&&(0,n.jsx)(`span`,{className:`ddex-badge`,children:u}),f&&(0,n.jsx)(`span`,{className:`ddex-badge ${b?`ddex-badge-warning`:``}`,children:f})]}),a&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(`div`,{className:`ddex-divider`}),(0,n.jsx)(`div`,{className:`ddex-section-title`,children:`Release`}),a.ReleaseReference&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`Release Reference`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:a.ReleaseReference})]}),a.LabelName&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`Label`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:a.LabelName})]}),a.ReleaseId?.UPC&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`UPC`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:a.ReleaseId.UPC})]}),a.CLine&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`© Line`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:a.CLine})]}),a.PLine&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`℗ Line`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:a.PLine})]})]}),S.length>0&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(`div`,{className:`ddex-divider`}),(0,n.jsx)(`div`,{className:`ddex-section-title`,children:`Tracks`}),(0,n.jsx)(`div`,{className:`ddex-track-list`,children:S.map((e,t)=>(0,n.jsxs)(`div`,{className:`ddex-track-item`,children:[(0,n.jsx)(`div`,{className:`ddex-track-title`,children:e.DisplayTitleText}),(0,n.jsxs)(`div`,{className:`ddex-track-meta`,children:[g(e.DisplayArtist,i?.PartyList)&&(0,n.jsx)(`span`,{children:g(e.DisplayArtist,i?.PartyList)}),e.ISRC&&(0,n.jsxs)(`span`,{children:[`ISRC `,e.ISRC]}),e.ResourceReference&&(0,n.jsxs)(`span`,{children:[`Ref `,e.ResourceReference]})]})]},e.ResourceReference??t))})]}),w.length>0&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(`div`,{className:`ddex-divider`}),(0,n.jsx)(`div`,{className:`ddex-section-title`,children:`Deals`}),(0,n.jsx)(`div`,{className:`ddex-deal-list`,children:w.map((e,t)=>{let r=e.Deal?.DealTerms,i=y(r?.PriceInformation),a=x(r?.CommercialModelType),o=e.Deal?.Territory??[],s=O(r?.ValidityPeriod?.StartDate),c=O(r?.ValidityPeriod?.EndDate);return(0,n.jsxs)(`div`,{className:`ddex-deal-item`,children:[(0,n.jsxs)(`div`,{className:`ddex-deal-row`,children:[a&&(0,n.jsx)(`span`,{className:`ddex-badge`,children:a}),(r?.UseType??[]).map(e=>(0,n.jsx)(`span`,{className:`ddex-badge`,children:C(e)},e))]}),i&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`Wholesale Price`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:i})]}),o.length>0&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`Territory`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:o.join(`, `)})]}),(s||c)&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`Validity Period`}),(0,n.jsxs)(`div`,{className:`ddex-key-value-value`,children:[s??`—`,c?` – ${c}`:``]})]})]},t)})})]}),A.length>0&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(`div`,{className:`ddex-divider`}),(0,n.jsx)(`div`,{className:`ddex-section-title`,children:`Parties`}),(0,n.jsx)(`div`,{className:`ddex-party-list`,children:A.map((e,t)=>(0,n.jsxs)(`div`,{className:`ddex-party-item`,children:[(0,n.jsx)(`span`,{className:`ddex-party-name`,children:e.PartyName?.FullName??h(e.PartyReference,A)??`Unknown`}),e.PartyReference&&(0,n.jsx)(`span`,{className:`ddex-party-ref`,children:e.PartyReference})]},e.PartyReference??t))})]}),j&&(j.MessageId||j.MessageCreatedDateTime)&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(`div`,{className:`ddex-divider`}),(0,n.jsx)(`div`,{className:`ddex-section-title`,children:`Message`}),j.MessageId&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`Message ID`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:j.MessageId})]}),j.MessageCreatedDateTime&&(0,n.jsxs)(`div`,{className:`ddex-key-value`,children:[(0,n.jsx)(`div`,{className:`ddex-key-value-label`,children:`Created`}),(0,n.jsx)(`div`,{className:`ddex-key-value-value`,children:k(j.MessageCreatedDateTime)})]})]})]}):(0,n.jsx)(`div`,{className:`ddex-empty`,children:`No DDEX release data found.`}),i&&(0,n.jsx)(`div`,{className:`ddex-action`,children:(0,n.jsx)(`button`,{onClick:()=>xe(o,M(i)),className:`ddex-button ddex-button-secondary`,children:`Download DDEX`})}),t&&(0,n.jsx)(`div`,{className:`ddex-action`,children:(0,n.jsx)(`button`,{onClick:t,className:`ddex-button`,children:`Small View`})})]})}var $=({manifest:e,level:r,className:i})=>{let[a,o]=t.default.useState(r||1),s=e.manifestStore?.activeManifest,c=e.manifests.find(e=>e.id===s||e.instanceId===s)??(s?e.manifestStore.manifests[s]:void 0)??e.manifests[0];if(!c||!p(c))return null;switch(a){case 1:return(0,n.jsx)(ee,{className:i,manifest:c,moreInfo:()=>{o(2)}});case 2:return(0,n.jsx)(te,{className:i,manifest:c,moreInfo:()=>{o(3)}});case 3:return(0,n.jsx)(Se,{className:i,manifest:c,moreInfo:()=>{o(1)}})}return(0,n.jsx)(`div`,{children:`Level Of Detail Not Selected`})};$.knownAssertions=[`org.mixotron.ddex`],e.DDEXManifest=$,e.DDEX_ASSERTION_LABEL=f,e.ddexAssertionToXml=M,e.formatCommercialModel=x,e.formatDate=O,e.formatDateTime=k,e.formatLabel=A,e.formatParentalWarning=T,e.formatPrice=y,e.formatUseType=C,e.formatValue=j,e.getArtistNames=g,e.getClaimGenerator=E,e.getDdexAssertion=p,e.getDealsForRelease=v,e.getInitials=D,e.getPrimaryRelease=m,e.getSoundRecordingsForRelease=_,e.resolvePartyName=h,e.xmlToDdexAssertion=G});
@@ -0,0 +1,3 @@
1
+ import { default as React } from 'react';
2
+ export declare const DDEX_LOGO_SVG = "<svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" role=\"img\" aria-label=\"DDEX\">\n <rect x=\"0.5\" y=\"0.5\" width=\"23\" height=\"23\" rx=\"5\" fill=\"#111827\"/>\n <path d=\"M8 16.6V7.7L17.2 6v9\" stroke=\"#ffffff\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"6.2\" cy=\"16.6\" r=\"2\" fill=\"#ffffff\"/>\n <circle cx=\"15.4\" cy=\"15\" r=\"2\" fill=\"#ffffff\"/>\n</svg>";
3
+ export declare const DDEX_Header: React.FC;
@@ -0,0 +1,3 @@
1
+ import { PluginC2PA } from 'c2pa-react-component-types';
2
+ export declare const DDEXManifest: PluginC2PA;
3
+ export default DDEXManifest;
@@ -0,0 +1,93 @@
1
+ import { Manifest } from 'c2pa-react-component-types';
2
+ export declare const DDEX_ASSERTION_LABEL = "org.mixotron.ddex";
3
+ export interface DdexParty {
4
+ PartyName?: {
5
+ FullName?: string;
6
+ };
7
+ PartyReference?: string;
8
+ }
9
+ export interface DdexDisplayArtist {
10
+ ArtistPartyReference?: string;
11
+ }
12
+ export interface DdexReleaseId {
13
+ UPC?: string;
14
+ ISRC?: string;
15
+ ISNI?: string;
16
+ GRid?: string;
17
+ [key: string]: string | undefined;
18
+ }
19
+ export interface DdexRelease {
20
+ CLine?: string;
21
+ PLine?: string;
22
+ DisplayArtist?: DdexDisplayArtist[];
23
+ DisplayGenre?: string;
24
+ DisplayTitleText?: string;
25
+ LabelName?: string;
26
+ ParentalWarningType?: string;
27
+ ReleaseId?: DdexReleaseId;
28
+ ReleaseReference?: string;
29
+ ReleaseResourceReferenceList?: string[];
30
+ }
31
+ export interface DdexSoundRecording {
32
+ DisplayArtist?: DdexDisplayArtist[];
33
+ DisplayTitleText?: string;
34
+ ISRC?: string;
35
+ ResourceReference?: string;
36
+ Duration?: string;
37
+ }
38
+ export interface DdexPriceInformation {
39
+ WholesalePrice?: {
40
+ Amount?: string;
41
+ CurrencyCode?: string;
42
+ };
43
+ [key: string]: unknown;
44
+ }
45
+ export interface DdexDealTerms {
46
+ CommercialModelType?: string;
47
+ PriceInformation?: DdexPriceInformation;
48
+ UseType?: string[];
49
+ ValidityPeriod?: {
50
+ StartDate?: string;
51
+ EndDate?: string;
52
+ };
53
+ }
54
+ export interface DdexReleaseDeal {
55
+ Deal?: {
56
+ DealTerms?: DdexDealTerms;
57
+ Territory?: string[];
58
+ };
59
+ DealReleaseReference?: string;
60
+ }
61
+ export interface DdexMessageHeader {
62
+ MessageCreatedDateTime?: string;
63
+ MessageId?: string;
64
+ }
65
+ export interface DdexAssertion {
66
+ MessageHeader?: DdexMessageHeader;
67
+ PartyList?: DdexParty[];
68
+ ReleaseList?: {
69
+ Release?: DdexRelease[];
70
+ };
71
+ ResourceList?: {
72
+ SoundRecording?: DdexSoundRecording[];
73
+ };
74
+ DealList?: {
75
+ ReleaseDeal?: DdexReleaseDeal[];
76
+ };
77
+ }
78
+ export declare function getDdexAssertion(manifest: Manifest): DdexAssertion | undefined;
79
+ export declare function getPrimaryRelease(assertion?: DdexAssertion): DdexRelease | undefined;
80
+ export declare function resolvePartyName(partyReference: string | undefined, partyList?: DdexParty[]): string | undefined;
81
+ export declare function getArtistNames(displayArtist: DdexDisplayArtist[] | undefined, partyList?: DdexParty[]): string;
82
+ export declare function getSoundRecordingsForRelease(release: DdexRelease | undefined, assertion: DdexAssertion | undefined): DdexSoundRecording[];
83
+ export declare function getDealsForRelease(release: DdexRelease | undefined, assertion?: DdexAssertion): DdexReleaseDeal[];
84
+ export declare function formatPrice(price?: DdexPriceInformation): string | undefined;
85
+ export declare function formatCommercialModel(type?: string): string | undefined;
86
+ export declare function formatUseType(type: string): string;
87
+ export declare function formatParentalWarning(type?: string): string | undefined;
88
+ export declare function getClaimGenerator(manifest: Manifest): string;
89
+ export declare function getInitials(value: string): string;
90
+ export declare function formatDate(iso?: string): string | undefined;
91
+ export declare function formatDateTime(iso?: string): string | undefined;
92
+ export declare function formatLabel(value: string): string;
93
+ export declare function formatValue(value: unknown): string;
@@ -0,0 +1,7 @@
1
+ import { Manifest } from 'c2pa-react-component-types';
2
+ export interface DDEXL1Props {
3
+ manifest: Manifest;
4
+ moreInfo?: () => void;
5
+ className?: string;
6
+ }
7
+ export declare function DDEXL1({ manifest, moreInfo, className }: DDEXL1Props): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { Manifest } from 'c2pa-react-component-types';
2
+ export interface DDEXL2Props {
3
+ manifest: Manifest;
4
+ moreInfo?: () => void;
5
+ className?: string;
6
+ }
7
+ export default function DDEXL2({ className, manifest, moreInfo }: DDEXL2Props): import("react").JSX.Element;
@@ -0,0 +1,7 @@
1
+ import { Manifest } from 'c2pa-react-component-types';
2
+ export interface DDEXL3Props {
3
+ manifest: Manifest;
4
+ moreInfo?: () => void;
5
+ className?: string;
6
+ }
7
+ export default function DDEXL3({ manifest, moreInfo, className }: DDEXL3Props): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ export * from './components/Ddex/Ddex';
2
+ export * from './components/Ddex/ddexAssertion';
3
+ export * from './server/ddex/convert';
@@ -0,0 +1,21 @@
1
+ import { DdexAssertion } from '../../components/Ddex/ddexAssertion';
2
+ /**
3
+ * Serializes the `org.mixotron.ddex` assertion shape (see ddexAssertion.ts)
4
+ * into a simplified DDEX ERN-style NewReleaseMessage XML document. This is
5
+ * the inverse of the shape produced by parsing an ERN message into that
6
+ * assertion — real ERN (https://ern.ddex.net/) has a much larger surface
7
+ * area than the fields this project renders.
8
+ */
9
+ export declare function ddexAssertionToXml(assertion: DdexAssertion): string;
10
+ /**
11
+ * Parses a DDEX NewReleaseMessage XML document — as produced by
12
+ * `ddexAssertionToXml`, or any XML following the same simplified shape —
13
+ * back into the `org.mixotron.ddex` assertion shape. Missing sections and
14
+ * elements are simply omitted from the result, mirroring how
15
+ * `ddexAssertionToXml` omits them on the way out.
16
+ *
17
+ * Requires a `DOMParser` (available in browsers and in jsdom); there is no
18
+ * pure-Node fallback, since this project otherwise has no XML parsing
19
+ * dependency.
20
+ */
21
+ export declare function xmlToDdexAssertion(xml: string): DdexAssertion;
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@cognitiveproof/c2pa-react-ddex-component",
3
+ "version": "0.1.0",
4
+ "description": "A React plugin for c2pa-react-component that renders DDEX (Digital Data Exchange) ERN release, resource, party, and deal data from a C2PA manifest.",
5
+ "type": "module",
6
+ "main": "./dist/c2pa-react-ddex-component.umd.cjs",
7
+ "module": "./dist/c2pa-react-ddex-component.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/c2pa-react-ddex-component.js",
12
+ "require": "./dist/c2pa-react-ddex-component.umd.cjs",
13
+ "types": "./dist/index.d.ts"
14
+ },
15
+ "./style.css": "./dist/c2pa-react-ddex-component.css",
16
+ "./dist/c2pa-react-ddex-component.css": "./dist/c2pa-react-ddex-component.css"
17
+ },
18
+ "files": [
19
+ "dist"
20
+ ],
21
+ "sideEffects": [
22
+ "**/*.css"
23
+ ],
24
+ "scripts": {
25
+ "dev": "vite",
26
+ "build": "tsc && vite build",
27
+ "lint": "eslint src",
28
+ "preview": "vite preview",
29
+ "prepublishOnly": "npm run build",
30
+ "test": "vitest run --passWithNoTests",
31
+ "test:watch": "vitest",
32
+ "test:ui": "vitest --ui",
33
+ "dev:lib": "vite build --watch"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/Cognitive-Proof/c2pa-react-ddex-component.git"
38
+ },
39
+ "keywords": [
40
+ "c2pa",
41
+ "ddex",
42
+ "ern",
43
+ "react",
44
+ "component",
45
+ "music",
46
+ "provenance",
47
+ "content-credentials"
48
+ ],
49
+ "author": "Cognitive Proof",
50
+ "license": "MIT",
51
+ "publishConfig": {
52
+ "access": "public"
53
+ },
54
+ "peerDependencies": {
55
+ "react": "^18.0.0 || ^19.0.0",
56
+ "react-dom": "^18.0.0 || ^19.0.0"
57
+ },
58
+ "devDependencies": {
59
+ "@eslint/js": "^9.0.0",
60
+ "@testing-library/dom": "^10.4.1",
61
+ "@testing-library/jest-dom": "^6.9.1",
62
+ "@testing-library/react": "^16.3.2",
63
+ "@testing-library/user-event": "^14.6.1",
64
+ "@types/node": "^25.5.0",
65
+ "@types/react": "^18.2.0",
66
+ "@types/react-dom": "^18.2.0",
67
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
68
+ "@typescript-eslint/parser": "^8.0.0",
69
+ "@vitejs/plugin-react": "^6.0.1",
70
+ "@vitest/ui": "^4.1.5",
71
+ "eslint": "^9.0.0",
72
+ "eslint-plugin-react-hooks": "^5.0.0",
73
+ "eslint-plugin-react-refresh": "^0.4.5",
74
+ "globals": "^17.5.0",
75
+ "jsdom": "^29.0.2",
76
+ "react": "^19.2.5",
77
+ "react-dom": "^19.2.5",
78
+ "typescript": "^5.2.2",
79
+ "typescript-eslint": "^8.59.0",
80
+ "vite": "^8.0.1",
81
+ "vite-plugin-dts": "^5.0.1",
82
+ "vitest": "^4.1.5"
83
+ },
84
+ "dependencies": {
85
+ "c2pa-react-component-types": "^0.1.5"
86
+ }
87
+ }