Code Monkey home page Code Monkey logo

Comments (7)

kawa89 avatar kawa89 commented on July 16, 2024 2

@ayang99 I could not reproduce the problem that you have. I've added a new page in the example app called Bug Page. There you can find the Github #32 1st example and Github #32 2nd example buttons. Also, check the JSON files example/assets/tweet_examples/tweet_bug_gh32_1st.json and example/assets/tweet_examples/tweet_bug_gh32_2nd.json which are the two Tweets that you provided. Check if there are any differences in my JSON files compared to yours.

@ayang99 Fixed from version 2.2.0

@ercadev Version 2.2.0 contains also some code related to Text widget overflow, so you should not see the rendering overflow information.

Closing for now. If you spot any weird looking Tweets, create an issue ;)

from tweet_ui.

kawa89 avatar kawa89 commented on July 16, 2024

Hi, I will try to check it ASAP (worst case scenario May 8th).

  1. EmbeddedTweetView is not as customizable as the previous two. I will try to add the same customizable options to it in a later release (June probably).
  2. You should be able. I did not test this library much on iOS devices. Please fill a new bug report for this.

from tweet_ui.

ayang99 avatar ayang99 commented on July 16, 2024

Hi, I'm not sure if this is the same issue or not. But for this tweet: https://twitter.com/cafreeland/status/1253740824065687555
image

Using EmbeddedTweetView.buildEmbeddedTweetView() and running from IntelliJ in an iPhone 11 Pro Max emulator :
image

Which manifests as:
image

in the iPhone emulator. On real devices (you just get an extra-long tweet card that extends for many, many swipes:

image

If this is a different issue, I'll create a new one for it.

Thanks,

from tweet_ui.

ercadev avatar ercadev commented on July 16, 2024

@okzjapan for issue (2) can you please provide the tweet json. I don't get the same result as you.
Even though I can see we have a problem with the user name length

Skärmavbild 2020-04-30 kl  08 30 24

@ayang99 can you also provide with the json. Here is my result:
Skärmavbild 2020-04-30 kl  08 40 53

from tweet_ui.

ayang99 avatar ayang99 commented on July 16, 2024

There might be some accidental whitespace artifacts as I cut/paste and formatted. This is what I'm getting prior to json.decode()

{
"created_at": "Fri Apr 24 17:41:20 +0000 2020",
"id": 1253740824065687555,
"id_str": "1253740824065687555",
"full_text": "This #Ramadan, many Canadian Muslim groups such as @Fastinthe6 are finding creative ways to hold their annual fast-breaking events virtually -- while raising money for local foodbanks. And everyone is invited! #shareyourmeal #stayhome #staysafe #Fastinthe6 https://t.co/5aumG3jkW7",
"truncated": false,
"display_text_range": [
0,
256
],
"entities": {
"hashtags": [
{
"text": "Ramadan",
"indices": [
5,
13
]
},
{
"text": "shareyourmeal",
"indices": [
210,
224
]
},
{
"text": "stayhome",
"indices": [
225,
234
]
},
{
"text": "staysafe",
"indices": [
235,
244
]
},
{
"text": "Fastinthe6",
"indices": [
245,
256
]
}
],
"symbols": [],
"user_mentions": [
{
"screen_name": "fastinthe6",
"name": "Fastinthe6",
"id": 861418280724164608,
"id_str": "861418280724164608",
"indices": [
51,
62
]
}
],
" urls": [
{
"url": "https://t.co/5aumG3jkW7",
"expanded_url": "https://twitter.com/fastinthe6/status/1253012121220194304",
"display_url": "twitter.com/fastinthe6/stau2026",
"indices": [
257,
280
]
}
]
},
"source": "<a href="http://twitter.com/download/iphone\" rel="nofollow">Twitter for iPhone",
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 203132018,
"id_str": "203132018",
"name": "Chrystia Freeland",
"screen_name": "cafreeland",
"location": "Toronto, ON",
"description": "Deputy Prime Minister of Canada / vice-premiu00e8re ministre du Canada. Liberal MP for Universityu2014Rosedale. Proud mother of three.",
"url": "https://t.co/SvW93Ajaa6",
"entities": {
"url": {
"urls": [
{
"url": "https://t.co/SvW93Ajaa6",
"expanded_url": "http://www.chrystiafreeland.ca",
"display_url": "chrystiafreeland.ca",
"indices": [
0,
23
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 175458,
"friends_count": 4540,
"listed_count": 2561,
"created_at": "Fri Oct 15 16:11:28 +0000 2010",
"favourites_count": 672,
"utc_offset": null,
"time_zone": null,
"geo_enabled": true,
"verified": true,
"statuses_count": 26836,
"lang": null,
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http:// pbs.twimg.com/profile_images/1110557601463521280/ce7uh8Gv_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1110557601463521280/ce7uh8Gv_normal.png",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/203132018/1585865736",
"profile_link_color": "DD2E44",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"has_extended_profile": false,
"default_profile": false,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false,
"translator_type": "none"
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"is_quote_status": true,
"quoted_status_id": 1253012121220194304,
"quoted_status_id_str": "1253012121220194304",
"quoted_status_permalink": {
"url": "https://t.co/5aumG3jkW7",
"expanded": "https://twitter.com/fastinthe6/status/1253012121220194304",
"display": "twitter.com/fastinthe6/stau2026"
},
"quoted_status": {
"created_at": "Wed Apr 22 17:25:44 +0000 2020",
"id": 1253012121220194304,
"id_str": "1253012121220194304",
"full_text": "https://t.co/raIDZpKo0H",
"truncated": false,
"display_text_range": [
0,
0
],
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [],
"urls": [],
"media": [
{
"id": 1253012108293398534,
"id_str": "1253012108293398534",
"indices": [
0,
23
],
"media_url": "http://pbs.twimg.com/media/EWOX364XYAYJ7pg.jpg",
"media_url_https": "https://pbs.twimg.com/media/EWOX364XYAYJ7pg.jpg",
"url": "https://t.co/raIDZpKo0H",
"display_url": "pic.twitter.com/raIDZpKo0H",
"expanded_url": "https://twitter.com/fastinthe6/ status/1253012121220194304/photo/1",
"type": "photo",
"sizes": {
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"large": {
"w": 1123,
"h": 1703,
"resize": "fit"
},
"medium": {
"w": 791,
"h": 1200,
"resize": "fit"
},
"small": {
"w": 448,
"h": 680,
"resize": "fit"
}
}
}
]
},
"extended_entities": {
"media": [
{
"id": 1253012108293398534,
"id_str": "1253012108293398534",
"indices": [
0,
23
],
"media_url": "http://pbs.twimg.com/media/EWOX364XYAYJ7pg.jpg",
"media_url_https": "https://pbs.twimg.com/media/EWOX364XYAYJ7pg.jpg",
"url": "https://t.co/raIDZpKo0H",
"display_url": "pic.twitter.com/raIDZpKo0H",
"expanded_url": "https://twitter.com/fastinthe6/status/1253012121220194304/photo/1",
"type": "photo",
"sizes": {
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"large": {
"w": 1123,
"h": 1703,
"resize": "fit"
},
"medium": {
"w": 791,
"h": 1200,
"resize": "fit"
},
"s mall": {
"w": 448,
"h": 680,
"resize": "fit"
}
}
}
]
},
"source": "<a href="http://twitter.com/download/iphone\" rel="nofollow">Twitter for iPhone",
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 861418280724164608,
"id_str": "861418280724164608",
"name": "Fastinthe6",
"screen_name": "fastinthe6",
"location": "Toronto, Ontario",
"description": "April 24, 2020 | Join our virtual event to kick-off #Ramadan 2020! Please #StayatHome to #StaySafe and post a message/pic to #Fastinthe6 #ShareYourMeal",
"url": "https://t.co/0oNlec6ZmG",
"entities": {
"url": {
"urls": [
{
"url": "https://t.co/0oNlec6ZmG",
"expanded_url": "http://www.fastinthe6.com",
"display_url": "fastinthe6.com",
" indices": [
0,
23
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 288,
"friends_count": 278,
"listed_count": 4,
"created_at": "Mon May 08 03:11:37 +0000 2017",
"favourites_count": 93,
"utc_offset": null,
"time_zone": null,
"geo_enabled": false,
"verified": false,
"statuses_count": 202,
"lang": null,
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "F5F8FA",
"profile_background_image_url": null,
"profile_background_image_url_https": null,
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/863911573580111878/im8WL4eb_normal.jpg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/863911573580111878/im8WL4eb_normal.jpg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/8614182807241646081587606431",
"profile_link_color": "1DA1F2",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"has_extended_profile": false,
"default_profile": true,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false,
"translator_type": "none"
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"is_quote_status": false,
"retweet_count": 10,
"favorite_count": 20,
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"lang": "und"
},
"retweet_count": 35,
"favorite_count": 117,
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"lang": "en"
},
{
"created_at": "Fri Apr 24 17:40:18 +0000 2020",
"id": 1253740563855298561,
"id_str": "125374056385529856 1",
"full_text": "Ce #Ramadan de nombreux groupes musulmans canadiens tels que @fastinthe6 trouvent des moyens cru00e9atifs pour organiser virtuellement leurs u00e9vu00e9nements annuels de rupture de jeu00fbne - tout en collectant des fonds pour les banques alimentaires locales. Et tous sont invitu00e9s! #Fastinthe6 https://t.co/5aumG3jkW7",
"truncated": false,
"display_text_range": [
0,
279
],
"entities": {
"hashtags": [
{
"text": "Ramadan",
"indices": [
3,
11
]
},
{
"text": "Fastinthe6",
"indices": [
268,
279
]
}
],
"symbols": [],
"user_mentions": [
{
"screen_name": "fastinthe6",
"name": "Fastinthe6",
"id": 861418280724164608,
"id_str": "861418280724164608",
"indices": [
61,
72
]
}
],
"urls": [
{
"url": "https://t.co/5aumG3jkW7",
"expanded_url": "https://twitter.com/fastinthe6/status/1253012121220194304",
"display_url": "twitter.co m/fastinthe6/stau2026",
"indices": [
280,
303
]
}
]
},
"source": "<a href="http://twitter.com/download/iphone\" rel="nofollow">Twitter for iPhone",
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 203132018,
"id_str": "203132018",
"name": "Chrystia Freeland",
"screen_name": "cafreeland",
"location": "Toronto, ON",
"description": "Deputy Prime Minister of Canada / vice-premiu00e8re ministre du Canada. Liberal MP for Universityu2014Rosedale. Proud mother of three.",
"url": "https://t.co/SvW93Ajaa6",
"entities": {
"url": {
"urls": [
{
"url": "https://t.co/SvW93Ajaa6",
"expanded_url": "http://www.chrystiafreeland.ca",
"display_url": "chrystiafreeland.ca",
"indices": [
0,
23
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 175458,
"friends_count": 4540,
"listed_count": 2561,
"created_at": "Fri Oct 15 16:11:28 +0000 2010",
"favourites_count": 672,
"utc_offset": null,
"time_zone": null,
"geo_enabled": true,
"verified": true,
"statuses_count": 26836,
"lang": null,
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/1110557601463521280/ce7uh8Gv_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1110557601463521280/ce7uh8Gv_normal.png",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/203132018/1585865736",
"profile_link_color": "DD2E44",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"has_extended_profile": false,
"default_profile": false,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false,
"translator_type": "none"
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"is_quote_status": true,
"quoted_status_id": 1253012121220194304,
"quoted_status_id_str": "1253012121220194304",
"quoted_status_permalink": {
"url": "https://t.co/5aumG3jkW7",
"expanded": "https://twitter.com/fastinthe6/status/1253012121220194304",
"display": "twitter. com/fastinthe6/stau2026"
},
"quoted_status": {
"created_at": "Wed Apr 22 17:25:44 +0000 2020",
"id": 1253012121220194304,
"id_str": "1253012121220194304",
"full_text": "https://t.co/raIDZpKo0H",
"truncated": false,
"display_text_range": [
0,
0
],
"entities": {
"hashtags": [],
"symbols": [],
"user_mentions": [],
"urls": [],
"media": [
{
"id": 1253012108293398534,
"id_str": "1253012108293398534",
"indices": [
0,
23
],
"media_url": "http://pbs.twimg.com/media/EWOX364XYAYJ7pg.jpg",
"media_url_https": "https://pbs.twimg.com/media/EWOX364XYAYJ7pg.jpg",
"url": "https://t.co/raIDZpKo0H",
"display_url": "pic.twitter.com/raIDZpKo0H",
"expanded_url": "https://twitter.com/fastinthe6/status/1253012121220194304/photo/1",
"type": "photo",
"sizes": {
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"large": {
"w": 1123,
"h": 1703,
"resize": "fit"
},
"medium": {
"w": 791,
"h": 1200,
"resize": "fit"
},
"small": {
"w": 448,
"h": 680,
"resize": "fit"
}
}
}
]
},
"extended_entities": {
"media": [
{
"id": 1253012108293398534,
"id_str": "1253012108293398534",
"indices": [
0,
23
],
"media_url": "http://pbs.twimg.com/media/EWOX364XYAYJ7pg.jpg",
"media_url_https": "https://pbs.twimg.com/media/EWOX364XYAYJ7pg.jpg",
"url": "https://t.co/raIDZpKo0H",
"display_url": "pic.twitter.com/raIDZpKo0H",
"expanded_url": "https://twitter.com/fastinthe6/status/1253012121220194304/photo/1",
"type": "photo",
"sizes": {
"thumb": {
"w": 150,
"h": 150,
"resize": "crop"
},
"large": {
"w": 1123,
"h": 1703,
"resize": "fit"
},
"medium": {
"w": 791,
"h": 1200,
"resize": "fit"
},
"small": {
"w": 448,
"h": 680,
"resize": "fit"
}
}
}
]
},
"source": "<a href="http://twitter.com/download/iphone\" rel="nofollow">Twitter for iPhone",
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 861418280724164608,
"id_str": "861418280724164608",
"name": "Fastinthe6",
"screen_name": "fastinthe6",
"location": "Toronto, Ontario",
"description": "April 24, 2020 | Join our virtual event to kick-off #Ramadan 2020! Please #StayatHome to #StaySafe and post a message/pic to #Fastinthe6 #ShareYourMeal",
"url": "https://t.co/0oNlec6ZmG",
"entities": {
"url": {
"urls": [
{
"url": "https://t.co/0oNlec6ZmG",
"expanded_url": "http://www.fastinthe6.com",
"display_url": "fastinthe6.com",
"indices": [
0,
23
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 288,
"friends_count": 278,
"listed_count": 4,
"created_at": "Mon May 08 03:11:37 +0000 2017",
"favourites_count": 93,
"utc_offset": null,
"time_zone": null,
"geo_enabled": false,
"verified": false,
"statuses_count": 202,
"lang": null,
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "F5F8FA",
"profile_background_image_url": null,
"profile_background_image_url_https": null,
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/863911573580111878/im8WL4eb_normal.jpg",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/863911573580111878/im8WL4eb_normal.jpg",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/861418280724164608/1587606431",
"profile_link_color": "1DA1F2",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_ text_color": "333333",
"profile_use_background_image": true,
"has_extended_profile": false,
"default_profile": true,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false,
"translator_type": "none"
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"is_quote_status": false,
"retweet_count": 10,
"favorite_count": 20,
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"lang": "und"
},
"retweet_count": 7,
"favorite_count": 24,
"favorited": false,
"retweeted": false,
"possibly_sensitive": false,
"lang": "fr"
},
{
"created_at": "Thu Apr 23 23:34:42 +0000 2020",
"id": 1253467364378714112,
"id_str": "1253467364378714112",
"full_text": "Today marks the beginning of #Ramadan for Muslims in Canada and around the world. This year, families will gather for Iftar meals virt ually. Staying home will help stop the spread of COVID-19 and keep us all safe. Wishing a blessed month to everyone observing! #RamadanMubarak",
"truncated": false,
"display_text_range": [
0,
276
],
"entities": {
"hashtags": [
{
"text": "Ramadan",
"indices": [
29,
37
]
},
{
"text": "RamadanMubarak",
"indices": [
261,
276
]
}
],
"symbols": [],
"user_mentions": [],
"urls": []
},
"source": "<a href="http://twitter.com/download/iphone\" rel="nofollow">Twitter for iPhone",
"in_reply_to_status_id": null,
"in_reply_to_status_id_str": null,
"in_reply_to_user_id": null,
"in_reply_to_user_id_str": null,
"in_reply_to_screen_name": null,
"user": {
"id": 203132018,
"id_str": "203132018",
"name": "Chrystia Freeland",
"screen_name": "cafreeland",
"location": "Toronto, ON",
"description": "Deputy Prime Minister of Canada / vice-premi u00e8re ministre du Canada. Liberal MP for Universityu2014Rosedale. Proud mother of three.",
"url": "https://t.co/SvW93Ajaa6",
"entities": {
"url": {
"urls": [
{
"url": "https://t.co/SvW93Ajaa6",
"expanded_url": "http://www.chrystiafreeland.ca",
"display_url": "chrystiafreeland.ca",
"indices": [
0,
23
]
}
]
},
"description": {
"urls": []
}
},
"protected": false,
"followers_count": 175458,
"friends_count": 4540,
"listed_count": 2561,
"created_at": "Fri Oct 15 16:11:28 +0000 2010",
"favourites_count": 672,
"utc_offset": null,
"time_zone": null,
"geo_enabled": true,
"verified": true,
"statuses_count": 26836,
"lang": null,
"contributors_enabled": false,
"is_translator": false,
"is_translation_enabled": false,
"profile_background_color": "C0DEED",
"profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
"profile_background_tile": false,
"profile_image_url": "http://pbs.twimg.com/profile_images/1110557601463521280/ce7uh8Gv_normal.png",
"profile_image_url_https": "https://pbs.twimg.com/profile_images/1110557601463521280/ce7uh8Gv_normal.png",
"profile_banner_url": "https://pbs.twimg.com/profile_banners/203132018/1585865736",
"profile_link_color": "DD2E44",
"profile_sidebar_border_color": "C0DEED",
"profile_sidebar_fill_color": "DDEEF6",
"profile_text_color": "333333",
"profile_use_background_image": true,
"has_extended_profile": false,
"default_profile": false,
"default_profile_image": false,
"following": false,
"follow_request_sent": false,
"notifications": false,
"translator_type": "none"
},
"geo": null,
"coordinates": null,
"place": null,
"contributors": null,
"is_quote_status": false,
"retweet_count": 74,
"favorite_count": 351,
"favorited": false,
"retweeted": false,
"lang": "en"
}

from tweet_ui.

kawa89 avatar kawa89 commented on July 16, 2024

@ercadev You are probably not on the latest tweet_ui library version. There was a breaking change from version 2.0.0 - check the Changelog ;-)

from tweet_ui.

kawa89 avatar kawa89 commented on July 16, 2024

@ayang99 Bug confirmed. Fix on the way ;)

from tweet_ui.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.