@startuml

' == THEME ==

'Couleurs issues de : https://htmlcolorcodes.com/fr/tableau-de-couleur/tableau-de-couleur-design-plat/
!define COLOR_YELLOW D4AC0D
!define COLOR_RED E74C3C
!define COLOR_PURPLE 8E44AD
!define COLOR_BLUE 3498DB
!define COLOR_GREEN 27AE60
!define COLOR_GREY 2C3E50

!define C_GREY1 F8F9F9
!define C_GREY2 F2F3F4
!define C_GREY3 E5E7E9
!define C_GREY4 D7DBDD
!define C_GREY5 CACFD2
!define C_GREY6 BDC3C7
!define C_LINK 3498DB
!define C_USE 27AE60

skinparam Shadowing false
skinparam component {
    BorderColor #D4AC0D
    ' Red
    BackgroundColor<<red>> #FDEDEC
    BorderColor<<red>> #E74C3C
    ' Purple
    BackgroundColor<<purple>> #F4ECF7
    BorderColor<<purple>> #8E44AD
    ' blue
    BackgroundColor<<blue>> #EBF5FB
    BorderColor<<blue>> #3498DB
    ' Green
    BackgroundColor<<green>> #E9F7EF
    BorderColor<<green>> #27AE60
    ' Grey
    BackgroundColor<<grey>> #EAECEE
    BorderColor<<grey>> #2C3E50
}
skinparam interface {
    BorderColor #D4AC0D
    ' Red
    BackgroundColor<<red>> #FDEDEC
    BorderColor<<red>> #E74C3C
    ' Purple
    BackgroundColor<<purple>> #F4ECF7
    BorderColor<<purple>> #8E44AD
    ' blue
    BackgroundColor<<blue>> #EBF5FB
    BorderColor<<blue>> #3498DB
    ' Green
    BackgroundColor<<green>> #E9F7EF
    BorderColor<<green>> #27AE60
    ' Grey
    BackgroundColor<<grey>> #EAECEE
    BorderColor<<grey>> #2C3E50
}
hide <<red>> stereotype
hide <<purple>> stereotype
hide <<blue>> stereotype
hide <<green>> stereotype
hide <<grey>> stereotype

' == COMPONENTS ==

[Client Application] as application <<blue>>
package "Common API" as packCommonApi {
    interface " " as commonApi <<green>>
}
package "Card Extension Xxx" as packExtension {
    interface " " as specificCardExtensionApi <<green>>
    [Adapter] as extension <<green>>
}
package "Calypsonet Terminal Reader API" as packReaderApi {
    interface "\nReader API" as readerApi
    interface "\nSelection API" as selectionApi
    interface "\nSelection SPI" as selectionSpi <<green>>
}
package "Keyple Service" as packService {
    interface " " as serviceApi
    [Adapter] as service
}
package "Calypsonet Terminal Card API" as packCardApi {
    interface "SPI" as cardSpi <<green>>
    interface "API" as cardApi
}

' == ASSOCIATIONS ==

extension -up- commonApi #COLOR_GREEN
extension -up- selectionSpi #COLOR_GREEN

extension -up- specificCardExtensionApi #COLOR_GREEN
extension -- cardSpi #COLOR_GREEN

service -up- serviceApi #COLOR_YELLOW
service -up- readerApi #COLOR_YELLOW
service -up- selectionApi #COLOR_YELLOW
service -- cardApi #COLOR_YELLOW

' USE

application ..> commonApi : use
application ..> specificCardExtensionApi : use
application ..> readerApi : use
application ..> selectionApi : use
application ..> selectionSpi : use
application ..> serviceApi : use

service ..> cardSpi : use

serviceApi .left.> commonApi : use

extension ..> cardApi : use

selectionApi .right.> readerApi : "   use   "
selectionApi .left.> selectionSpi : "   use   "

' == STYLE ==

package packExtension #C_GREY1 {
}
package packCommonApi #C_GREY1 {
}
package packReaderApi #C_GREY1 {
}
package packService #C_GREY1 {
}
package packCardApi #C_GREY1 {
}

@enduml