Compare commits

...

413 Commits

Author SHA1 Message Date
Ajay Bura 55c4c25663 v1.7.0 2022-01-26 18:06:07 +05:30
Ajay Bura 202ff53c41 Hide reaction picker for user without permission
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-26 17:16:40 +05:30
Ajay Bura 992da7c7be Refactor navigation
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-26 17:03:26 +05:30
Ajay Bura f47998a553 Fix scroll when switching between home and DM (#243)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-26 15:54:58 +05:30
Ajay Bura f4d24420e7 Fix gap under typing indicator in some device
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-26 15:29:45 +05:30
Justin Shaw 308bdb3d46 Bugfix: Add lazy loading to emoji board (#259)
* add lazy loading to emoji board

* add newline to end of package-lock file
2022-01-26 12:18:11 +05:30
Ajay Bura 20b99dce48 Add support for custom emoji in reactions
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-26 12:06:18 +05:30
Ajay Bura e4f7c6add9 Show underline on link hover
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-25 12:15:47 +05:30
Ajay Bura 80110d1a48 Fix scrollbar padding for safari breaks other component styling
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-24 14:56:36 +05:30
Ajay Bura 0a0b45fb8e twemojify names in reaction tooltip
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-24 14:54:53 +05:30
Ajay Bura 4ef29ae26f Fix username overflow in timeline change messages
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-24 14:53:51 +05:30
Ajay Bura ead4b89874 Update contributing.md
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-17 12:50:58 +05:30
Ajay Bura e827fb2eb2 Fix live read recipt count (#227)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-17 12:20:18 +05:30
Ajay Bura 4f161fb891 Disabe search input in encrypted room
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-17 12:19:35 +05:30
Ajay Bura 8c30a013c7 Disabe search in encrypted room
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-17 10:15:13 +05:30
Ajay Bura 9f3f877bfd Fix type in search icon tooltip
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-17 10:00:19 +05:30
Ajay Bura 84a75788af Update bug report template
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-16 18:20:39 +05:30
Ajay Bura f3615117d8 Add search icon in room header
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-16 18:18:33 +05:30
Ajay Bura 48a701ef87 Update bug report template
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-16 18:18:06 +05:30
Ajay Bura 41c72e0a8e Fix crash in profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-16 18:17:20 +05:30
Ajay Bura a83b875b66 Re-arrange general room settings
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-16 17:55:00 +05:30
Ajay Bura dcef08009d Add ability to search room messages
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-16 14:17:50 +05:30
Ajay Bura eddba3c652 Fix font weight for dark theme
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-16 14:17:23 +05:30
Ajay Bura f0c9a458bb Add broken avatar fallback
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-16 10:41:37 +05:30
Ajay Bura 62c9e271d8 Add padding in scroll view for safari
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-15 20:11:37 +05:30
Ajay Bura 871a25364d Fix typo in room-options
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-14 09:43:35 +05:30
Ajay Bura e67abae3e0 Add afterClose param to reusabel context menu
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 18:43:22 +05:30
Ajay Bura c50565dfda Open room options with right click
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 18:31:56 +05:30
Ajay Bura 60c44da974 Refactor room options
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 18:30:43 +05:30
Ajay Bura ba6d9d0c23 Add option to change reaction permission
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 15:45:27 +05:30
Ajay Bura 8c55f38b07 Add ability to change room permissions
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 13:26:38 +05:30
Ajay Bura 568cf5e2ad Update readme
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 10:48:08 +05:30
Ajay Bura 5e843f7a4f Fix crash in profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 10:33:04 +05:30
Ajay Bura 090ada5807 Add option to unban user in profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 10:28:33 +05:30
Ajay Bura 0e17c57856 Remove mention button from profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 09:46:08 +05:30
Ajay Bura 74464992e6 Redesign session chip in profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-13 09:42:23 +05:30
Ajay Bura a1d9c21337 Add option to ban user in profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-12 18:50:54 +05:30
Ajay Bura 248fc15716 Add option to kick user in profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-12 18:26:52 +05:30
Ajay Bura e38ddebfb6 Refactor code of profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-12 16:46:56 +05:30
Ajay Bura 57fc8b2f1a Fix quote from discord bridge
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-12 15:11:34 +05:30
Ajay Bura b7fac8bcbc Update people drawer on power level change
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-12 13:57:47 +05:30
Ajay Bura 12f2eed5b3 Add ability to change power level in profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-12 13:57:13 +05:30
Ajay Bura 3f39fd487f Fix custom power level selection return NaN
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-12 11:40:55 +05:30
Ajay Bura 950bf14d95 Fix markdown heading formatting
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-12 11:17:44 +05:30
Ajay Bura a279995982 Add action to open reusabel context menu
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-11 20:46:41 +05:30
Ajay Bura a2eb9734f1 Add PowerLevelSelector component
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-11 20:45:10 +05:30
Ajay Bura cb23991841 Add ReusableContextMenu component
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-11 20:43:40 +05:30
Ajay Bura 769d24d196 Add room permissions
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-10 20:34:54 +05:30
Ajay Bura af61f4f1db Refactor SettingTile component
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-10 20:33:40 +05:30
Ajay Bura f8f77075ec Remove error handling from Avatar component
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-09 16:22:04 +05:30
Ajay Bura 34bb5f9928 Fix error on room leave
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-09 10:29:06 +05:30
Ajay Bura ca3cced6ad Fix system theme not working on load
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-07 10:21:35 +05:30
Ajay Bura be905ac7be Hide role dropdown icon in profile viewer (#215)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-05 17:50:50 +05:30
Ajay Bura 53f3ccc888 Fix memory leaks
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-05 17:48:37 +05:30
Ajay Bura c304670f47 Add globe icons in search
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-05 17:47:41 +05:30
Ajay Bura 6388894aa4 Fix focus bug on room-selector
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-05 14:57:11 +05:30
Ajay Bura c27b11bf25 Add room alias or id as fallback in room profile
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-05 14:56:30 +05:30
Gregory Anders 11f395f65f Add toggle to use browser's preferred theme (#224)
* Add Auto theme that uses browser's preferred color scheme

This will use dark mode automatically if the browser requests it.

* fixup! Add Auto theme that uses browser's preferred color scheme

* Use a toggle to use system theme
2022-01-03 18:46:43 +05:30
Ajay Bura 63a0adaa6e Add ability to enable room encryption
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-02 12:08:19 +05:30
Ajay Bura 0ddeb02d23 Add ability to manage room history visibility
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-01 16:27:36 +05:30
Ajay Bura c23acf9e9e Fix context menu margin in auth page
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-01 11:47:53 +05:30
Ajay Bura 54635bf0d3 Add ability to manage room addresses
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2022-01-01 11:43:35 +05:30
Ajay Bura 6fdd9ed48b Remove room-settings hotkeys
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-31 17:39:39 +05:30
Ajay Bura a0399b7f5e Add disabled attribute in Checkbox, Toggle and RadioButton
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-31 17:38:25 +05:30
Ajay Bura 387f6bcad4 Fix font-variant-ligatures
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-31 10:08:29 +05:30
Ajay Bura 0b43431543 Temp EmojiBoard performance improved
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-30 16:37:11 +05:30
Ajay Bura 34862f9ace Fix EmojiBoard styling
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-30 14:17:55 +05:30
Ajay Bura cd465ca35a Fix default checkbox size
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-30 12:47:25 +05:30
Ajay Bura 93251e0029 Show pack icon or first emoji as fallback in EmojiBoard sidebar
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-30 12:46:48 +05:30
Ajay Bura c2402ddb72 Add isImage prop in RawIcon
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-30 12:44:14 +05:30
Ajay Bura d3dcb320f4 Add checkbox component
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-30 11:37:18 +05:30
Emi fd9f734de1 Add custom emoji to emoji board (#210)
* Display custom emoji in picker

Adds a single category at the start of the emoji picker to display the user's custom emoji

* Show any amount of custom emoji packs in the Emoji Board

* Use thumbnails in emoji picker + mark as emoji

* Fix emoji picker stretching when too many packs are available

* Sprinkle in a few comments for good measure

* Remove emoji-less packs from the emoji picker
2021-12-30 09:32:49 +05:30
Emi 9ea9bf4035 Add support for sending room-local emoji (#209)
* Add support for sending room-local emoji

Does not add support for sending a room's emoji outside of that room, but enables users to
send an emoji if the packs in a room support it.  Does not include room emoji in the
picker YET.

* Amend PR #209: Don't freak out if the `pack` tag is missing

* Amending PR:  Refactor emojifier, use better method for retrieving packs

* Amending PR:  Improve resiliance to bad data in emoji state events

* Amend PR: Remove redundant code, fix crash on edit
2021-12-29 09:56:17 +05:30
Ajay Bura f9b70d65d8 Fix message formatting
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-28 10:54:46 +05:30
Emi 90621bb1e3 Add support for sending user emoji using autocomplete (#205)
* Add support for sending user emoji using autocomplete

What's included:
- An implementation for detecting user emojis
- Addition of user emojis to the emoji autocomplete in the command bar
- Translation of shortcodes into image tags on message sending

What's not included:
- Loading emojis from the active room, loading the user's global emoji packs, loading emoji from spaces
- Selecting custom emoji using the emoji picker

This is a predominantly proof-of-concept change, and everything here may be subject to
architectural review and reworking.

* Amending PR:  Allow sending multiple of the same emoji

* Amending PR:  Add support for emojis in edited messages

* Amend PR:  Apply requested revisions

This commit consists of several small changes, including:
- Fix crash when the user doesn't have the im.ponies.user_emotes account data entry
- Add mx-data-emoticon attribute to command bar emoji
- Rewrite alt text in the command bar interface
- Remove "vertical-align" attribute from sent emoji

* Amending PR:  Fix bugs (listed below)

- Fix bug where sending emoji w/ markdown off resulted in a crash
- Fix bug where alt text in the command bar was wrong

* Amending PR:  Add support for replacement of twemoji shortcodes

* Amending PR: Fix & refactor getAllEmoji -> getShortcodeToEmoji

* Amending PR: Fix bug: Sending two of the same emoji corrupts message

* Amending PR:  Stylistic fixes
2021-12-28 08:59:39 +05:30
Emi 6ff339b552 Use jumbo emoji for short emoji-only messages (#207)
* Display messages containing only <7 emoji bigger

* Amending PR: Address mentioned concerns

This fixes several concerns raised during the PR review process.  A summary of the changes
implemented is below:
- Size jumbo emoji using the text-h1 class, instead of hardcoding a size
- Increase the emoji limit to 10
- Re-wrap m.text messages in a p tag, fixing a bug where newlines were lost
2021-12-27 10:24:07 +05:30
Ajay Bura 9854f4eb2d Make contributing guideline short and simple
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-26 20:15:07 +05:30
Ajay Bura d46b046f2d Adjust drawer width in small screen
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-26 16:16:58 +05:30
Ajay Bura d02e8dcd4e Add optoins to change room visibility
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-26 15:34:20 +05:30
Ajay Bura 07b1fe8e47 Add separate icon for public rooms and spaces
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-26 11:26:41 +05:30
Ajay Bura 7c368ae029 Fix spolier click not working on some browser
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-25 12:26:20 +05:30
Ajay Bura d6b5f92d6c Add GeneralSettings component
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-24 15:09:58 +05:30
Ajay Bura 2b70a49e09 Refactor RoomOptions component
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-24 15:09:11 +05:30
Ajay Bura 8cfa20be1e Add RoomNotification component
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-24 15:08:16 +05:30
Ajay Bura 246f6caf20 Add disable prop in IconButton and MenuItem
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-24 15:05:56 +05:30
Ajay Bura 7750366654 Fix RadioButton style
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-24 15:03:57 +05:30
Ajay Bura 0f963a93f1 Fix twemoji scaling
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-24 10:18:07 +05:30
Ajay Bura ea5b63af18 Add RadioButton component
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-23 17:09:09 +05:30
Ajay Bura 5e89675c9c Auto update room profile on change
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-23 10:03:20 +05:30
Ajay Bura 5777c1ab27 Add RoomSettings comp
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-22 20:18:32 +05:30
Ajay Bura 8eda0aeab3 Add room profile comp
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-22 20:17:01 +05:30
Ajay Bura 23c430fadc Add tabs comp
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-21 18:34:13 +05:30
daemonspring aa423cfa5b Removed mixin that was wiping out existing padding (#196)
Line 335 already gives blockquotes their padding. The mixin explicitly sets the right padding back to 0 and the left padding to exactly what it was already set to.
2021-12-20 13:47:38 +05:30
Ajay Bura eb753a3f32 v1.6.1
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-19 20:33:52 +05:30
Ajay Bura 4a300a3cb2 Fix people search icon displacement
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-19 20:32:47 +05:30
Ajay Bura c4e16418e0 Open settings on sidebar user profile click
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-19 20:05:13 +05:30
Ajay Bura 27e7a67a9a Separate jump to unread & mark as read
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-19 19:37:38 +05:30
Ajay Bura ce9f140ddf Refector sass
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-19 10:28:41 +05:30
Ajay Bura 85c3240b54 Fix theme
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-18 10:10:23 +05:30
Ajay Bura 9c12e11375 Fix read receipt count
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-17 17:22:38 +05:30
Ajay Bura 630dbee817 Fix theme
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-17 11:32:21 +05:30
Ajay Bura 18dc02c700 Fix mxid colors for dark theme
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-16 18:39:44 +05:30
Ajay Bura 3d7e509f9a Localize fonts
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-16 17:55:16 +05:30
Ajay Bura ed27e6b8e4 Fix dark theme color
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-15 21:43:23 +05:30
Ajay Bura 631ce7645f Fix msg timeline keep scrolling when not in focus
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-15 17:26:22 +05:30
Ajay Bura 181382b2b7 Fix show msg header after new msgs divider
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-15 17:05:45 +05:30
Ajay Bura ca15e69ae0 Fix multiple new message indicator
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-14 20:47:01 +05:30
Ajay Bura ba64ba0bd0 Fix dialog closing animation jank
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-14 17:26:32 +05:30
Ajay Bura 1df4d32d69 Fix reaction not active
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-14 16:23:41 +05:30
Ajay Bura 5d380453a4 Bugs fixed
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 21:18:23 +05:30
Ajay Bura ba629f1764 v1.6.0
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 21:12:42 +05:30
Ajay Bura f2edcaff85 Updated olm -> v3.2.8, matrix-js-sdk -> v15.2.1
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 21:07:15 +05:30
Ajay Bura 6d358d4087 Bugs fixed
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 21:05:37 +05:30
Ajay Bura 46dd50a744 Fix hide auto fill suggestions on msg send
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 19:38:11 +05:30
Ajay Bura 3c2058f0e1 Updated olm to v3.2.7
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 18:08:09 +05:30
Ajay Bura c22c407ee5 Make spoiler click to toggle (#176)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 15:14:57 +05:30
Ajay Bura 1ed1dfc78a Fix bug
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 14:40:24 +05:30
Ajay Bura 5797a1d8e5 Add typing outside focus on msg feild (#112)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 14:31:43 +05:30
Ajay Bura 6d5d40b8e3 Fix multiple unread divider
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-13 11:03:48 +05:30
Ajay Bura 90c6b18cbb Add btn to hide membership events from timeline
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-12 20:53:32 +05:30
Ajay Bura ecb7d5ef10 Fix theme colors
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-12 19:55:03 +05:30
Ajay Bura e2b347c783 Fix messages white-space
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-12 18:45:43 +05:30
Ajay Bura 88a988d876 Remove goto cmds from msg input also fix #81
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-12 11:31:52 +05:30
Ajay Bura fbeecc0479 Add hotkey ctrl+k for search
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-11 10:50:34 +05:30
Ajay Bura 413188c995 Add recent opened room in search
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-11 09:55:38 +05:30
Ajay Bura 77818f9342 Fix bug
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-10 17:28:29 +05:30
Ajay Bura c9ec161ccc Add search modal (#132)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-10 17:22:53 +05:30
Ajay Bura 20443f8a4d Fix crashes
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-10 11:45:43 +05:30
Ajay Bura 299ceac557 Fix auto load room members
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-10 10:51:32 +05:30
Ajay Bura 9365e5bfb9 Fix bug
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-09 19:01:39 +05:30
Ajay Bura 3e75841a83 Fix crash in E2E rooms
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-09 15:27:59 +05:30
Ajay Bura 74b8a0f10f Fix msg not auto loading backwards
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-09 12:00:19 +05:30
Ajay Bura c291729ed6 Optimize message comp
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-09 11:59:17 +05:30
Ajay Bura a70245a3b1 Fix date in same day
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-08 21:52:25 +05:30
Ajay Bura dde022d179 Add server side aggregated events
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-08 21:23:18 +05:30
Ajay Bura 0d12c64c47 Add animation on profile pic hover
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-08 14:02:44 +05:30
Ajay Bura 27d0a88b36 Fix unable to mark as read some rooms
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-08 13:49:47 +05:30
Ajay Bura ca55141276 Show date for msgs older than a day
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-08 13:37:25 +05:30
Ajay Bura e20b9d054d Add animation on hover in sidebar
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-08 11:11:05 +05:30
Ajay Bura c1e3645d57 Implement sending read receipt in new pagination
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-07 21:04:07 +05:30
Ajay Bura 50db137dea Add export E2E key (#178) 2021-12-06 10:22:45 +05:30
Ajay Bura 5b109c2b79 Improved performance of local timeline pagination
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-04 19:34:22 +05:30
Ajay Bura 25b7093302 Added local timeline pagination
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-04 15:25:14 +05:30
Ajay Bura 38cbb87a62 Added unread indicator (#67), reply link back to original (#96)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-03 18:32:10 +05:30
Ajay Bura 0c0a978886 Parse reply using m.in_reply_to (#134)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-03 18:30:05 +05:30
Ajay Bura fb5f368894 Added primary varient in IconButton
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-03 18:26:18 +05:30
Ajay Bura 9454ffd1af Update UX of Divider comp
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-12-03 18:25:29 +05:30
Ajay Bura 16f35d9a34 Fix bug in creating dm
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-24 10:08:51 +05:30
Ajay Bura bb6a64790d More twemojify text
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-23 17:07:15 +05:30
Ajay Bura b9378118dd Twemojify text
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-23 16:33:35 +05:30
Ajay Bura b6485f91ae Fix crash on room create
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-23 16:24:12 +05:30
Ajay Bura e1e8ca9633 Fix space invite open
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-23 15:51:39 +05:30
Ajay Bura 72f476a750 Fix sinitizeText
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-23 12:30:40 +05:30
Ajay Bura f897809202 Fix emoji size in Avatar
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-23 12:27:01 +05:30
Ajay Bura 647d085c5f Twemojified all text
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-23 11:56:02 +05:30
Ajay Bura 9d0f99c509 Fix checkbox in register flow
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-22 14:37:14 +05:30
Ajay Bura fd25a23d91 Downgraded linkifyjs
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-21 19:21:03 +05:30
Ajay Bura 7fdf165ff3 Allow html in m.text
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-21 18:31:58 +05:30
Ajay Bura b3e27da26d Fix table scroll
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-21 15:27:03 +05:30
Ajay Bura 2479dc4096 Use formatted_body to parse markdown (#133) and partially implement #105, #19
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-21 14:30:21 +05:30
Ajay Bura 7e7a5e692e Refectored Message comp
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-20 13:29:32 +05:30
Ajay Bura f628a6c3d6 Updated dependencies
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-19 13:20:34 +05:30
Ajay Bura 5b0f95fed9 Fix alignment in ProfileViewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-19 10:00:47 +05:30
Ajay Bura 6aa98d5eac Fix message not comming in encrypted rooms
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-19 10:00:07 +05:30
Ajay Bura 8e1fe9558e Specified sha for build script
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-18 18:19:04 +05:30
Ajay Bura 38c3e53ce7 Specified node version to workflows x 2
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-18 18:14:49 +05:30
Ajay Bura 9627766f7d Specified node version to workflows
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-18 18:11:12 +05:30
Ajay Bura 57697142a2 Add pagination in room timeline
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-18 13:32:12 +05:30
Ajay Bura beb32755a3 Allow msg width to span over screen
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-15 09:41:12 +05:30
Ajay Bura cb6e71e544 Save peopleDrawer visibility in localStorage
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-15 09:23:59 +05:30
Ajay Bura 1487dcbadc Fix login with CAS #165
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-14 13:35:01 +05:30
Krishan a4b27fdeab Fixed pull request preview deploys (#166)
* Update and rename pull-request.yml to build-pull-request.yml

* Create deploy-pull-request.yml
2021-11-14 12:54:17 +05:30
Ajay Bura 1137c11c59 Bug fixed
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-14 11:31:22 +05:30
Samuel Dionne-Riel 14cd84dab7 Add basic support for displaying emotes (#161) 2021-11-14 10:32:32 +05:30
Ajay Bura b5c5cd9586 Fix add initial_device_display_name on register
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-11 16:56:36 +05:30
Ajay Bura 85cc4cb8f7 Fix cropped loading and login screen
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-11 16:47:08 +05:30
Ajay Bura cf6732fb29 Fix crash on profile opening
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-11 16:45:55 +05:30
Ajay Bura 1207f5abad Fixed error on register, zoom on safari and removed webpack copying env vars to bundle
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-11 14:09:06 +05:30
Samuel Dionne-Riel 6e9394ec7a Use Unicode aware character-wise slicing (#159) 2021-11-10 13:30:25 +05:30
Ajay Bura 2c9e32b6c4 Readded package-lock.json
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-07 18:17:44 +05:30
Ajay Bura fc470d0622 Minor changes to registration msg
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-07 17:44:09 +05:30
Ajay Bura a3270041e3 Bumped dependencies and v1.5.0
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-07 15:46:36 +05:30
Ajay Bura 956068d0d6 Depd sorted
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-07 10:19:23 +05:30
Samuel Dionne-Riel 3776e32364 Fix commands activating anywhere in the input (#156)
* Fix commands activating anywhere in the input

Writing `The command to leave a channel is /leave` might have had "fun"
consequences for users.

Fixes #155

* Fix go-to commands activating anywhere in the input

While less obtrusive than `/` commands activating anywhere, it seems
logical to only activate completion of those when at the beginning of
the input.
2021-11-07 10:02:50 +05:30
Ajay Bura fb5a54dd17 Re: fix alignment on hsInput in safari
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-06 19:12:45 +05:30
Ajay Bura 916d564f82 fix alignment on hsInput in safari
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-06 18:25:56 +05:30
Ajay Bura 364def188a Removed some servers and fixed shadow on input in safari
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-06 18:09:29 +05:30
Ajay Bura d1228a085b Updated dependencies
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-06 17:56:50 +05:30
Ajay Bura 6c5a29fb48 Updated dependencies and build instructions
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-06 16:26:18 +05:30
Ajay Bura a83aecaa69 Full UIAA implement (#93), #32, #146, #64, #102
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-06 15:15:35 +05:30
Ajay Bura 3d885ec262 Added debounce, throttle, getUrlParams
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-11-06 15:12:36 +05:30
Ajay Bura 6fdace07c8 Automatic update people list
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-29 18:11:02 +05:30
Ajay Bura 8711658e75 Feature: invite/disinvite from profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-29 17:13:33 +05:30
Ajay Bura e25dc46863 Add option to select role on roomCreation
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-29 14:59:16 +05:30
Ajay Bura f53f54af7f Refactor 2194cb65a2
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-29 13:20:27 +05:30
Ajay Bura 763aa8865b Bumped dependencies
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-28 18:39:34 +05:30
Ajay Bura 2194cb65a2 Hide pinned space notification from home icon
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-28 15:30:16 +05:30
Ajay Bura 60435d505f Fix duplicate notification count
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-28 15:08:26 +05:30
Ajay Bura af983c76b8 Fix SOO button sorting
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-28 13:42:57 +05:30
Zalax ef161bbb31 Improve SSO display on login page (#150)
sort SSO providers by alphabetical order, and reset provider list on homeserver change (to avoid having them if the homeserver is invalid)
2021-10-27 19:09:35 +05:30
daemonspring ac364e5ab7 Fixed links splitting across line mid-word (#151)
`break-all` meant that links would split mid-word e.g. I observed `email` become `e\nmail`. `break-word` avoids this but also ensures long links still break before overflowing the line length.
2021-10-27 19:01:45 +05:30
Ajay Bura 2e2b1c6f18 Added variety of msg on loading app
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-27 19:00:31 +05:30
Ajay Bura 1fa1496d7f Added logout in loading screen
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-27 17:08:26 +05:30
Ajay Bura 8fb9365eaa Enhanced invite list UX
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-27 16:48:31 +05:30
Ajay Bura 92ab8331d0 Fix overscroll behavior
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-27 16:06:07 +05:30
Ajay Bura 603d373cee Fix notification minus count
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-27 16:03:41 +05:30
Ajay Bura aca2c3a9dd v1.4.0: SSO login and profile viewer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-25 17:53:25 +05:30
Ajay Bura f544dab3e0 Fix reaction selector doesn't focus msg input (#62)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-25 17:28:14 +05:30
Ajay Bura c489940f8b Fix message menu placement on large screen (#113)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-25 17:19:11 +05:30
Ajay Bura dc7ddeaa9b Fix wildcard matching in emojisearch (#121)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-25 16:46:23 +05:30
Ajay Bura 9b5f42cda9 Fix profile picture inconsistency (#104, #147)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-25 14:25:06 +05:30
Ajay Bura 4022e4969d UI improvement in SSO
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-24 17:33:56 +05:30
Ajay Bura ed62d06b5e SegmentedControl bug fixed
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-23 15:41:16 +05:30
Ajay Bura f11e4f6626 Add option to filter PeopleDrawer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-23 15:27:54 +05:30
Ajay Bura 59eec5241a Enhanced people search UX
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-22 20:02:01 +05:30
Ajay Bura d287486165 Added button reset type.
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-22 17:13:57 +05:30
Ajay Bura f70270a0b3 Fixed inconsistent search in emojiboard.
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-22 17:02:42 +05:30
Ajay Bura 36380fe5fd Add search in People drawer
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-21 17:50:49 +05:30
Ajay Bura dc7fca4f4c SSO login bug fixed
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-19 20:23:15 +05:30
Ajay Bura 977759145e Fix redirect on SSO login (#142), #27, #94
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-19 19:38:09 +05:30
James Julich 76c3660cb2 Address 301 redirect issue and Safari regex issue. (#143)
* Address 301 redirect issue and Safari regex issue.

* Restored login redirect

as this doesn't not fix the sso redirect #143.

Co-authored-by: Ajay Bura <32841439+ajbura@users.noreply.github.com>
2021-10-19 18:09:30 +05:30
Gero Gerke fa10a67811 Implement Profile Viewer (#130)
* Implement Profile Viewer

Fixes #111

* Make user avatar in chat clickable

* design progress

* Refactored code

* progress

* Updated chip comp

Signed-off-by: Ajay Bura <ajbura@gmail.com>

* Refactored ProfileViewer comp

Signed-off-by: Ajay Bura <ajbura@gmail.com>

* Added msg functionality in ProfileViewer

Signed-off-by: Ajay Bura <ajbura@gmail.com>

* Added Ignore functionality in ProfileViewer

Signed-off-by: Ajay Bura <ajbura@gmail.com>

* Fixed Ignore btn bug

Signed-off-by: Ajay Bura <ajbura@gmail.com>

* Refectored ProfileViewer comp

Signed-off-by: Ajay Bura <ajbura@gmail.com>

Co-authored-by: Ajay Bura <ajbura@gmail.com>
2021-10-18 20:55:52 +05:30
Ajay Bura 8d95fd0ca0 Update pull-request.yml 2021-10-14 10:42:07 +05:30
Ajay Bura 332e95701e Update pull-request.yml 2021-10-14 10:34:04 +05:30
Ajay Bura 124b24ab76 Fixed deploy on PR 2021-10-14 10:28:31 +05:30
Ajay Bura 6ccd1e43bc Update pull-request.yml 2021-10-12 15:00:09 +05:30
Ajay Bura 5c09d04912 added action for pull request previews 2021-10-11 15:22:15 +05:30
jamesjulich 119325c3a2 Add support for SSO login. 2021-10-11 11:21:44 +05:30
kfiven 462a559bd3 Fix unable to send msg in DM from IRC users (#135) 2021-10-11 11:19:32 +05:30
Ajay Bura 1bd58a0103 Fix make both user admin on DM create
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-11 11:16:16 +05:30
Ajay Bura 6c97d08027 Updated support link
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-06 13:48:30 +05:30
Ajay Bura 0ebda9d224 v1.3.2
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-06 12:42:48 +05:30
Ajay Bura 808fc8dc0d Fix Password don't match on register page
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-06 12:35:51 +05:30
Ajay Bura aefed73f5a Revert dark theme color changes
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-04 11:01:27 +05:30
Ajay Bura ea47750ea4 Made ContextMenu animation little fast (#114)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-04 11:00:18 +05:30
Ajay Bura 0f02bfd2c3 Merge pull request #128 from Empty2k12/fix/no-public-rooms
Improve message when there are no public rooms on a server
2021-10-03 10:00:23 +05:30
Ajay Bura 8e5a5baf52 Better error handling when server room list is private
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-10-03 09:53:54 +05:30
Krishan 3deb8eb488 Merge pull request #125 from Empty2k12/fix/powerlevel-sending
Disallow sending messages to rooms with insufficient powerlevel
2021-09-30 21:00:00 +05:30
kfiven 1dd7f0371d Changed p to Text component 2021-09-30 20:56:39 +05:30
Gero Gerke 7d032bb684 Improve message when there are no public rooms on a server 2021-09-30 17:24:28 +02:00
Gero Gerke ecc4a40eea Disallow sending to rooms with insufficient powerlevel
Fixes #123
2021-09-30 16:17:01 +02:00
Ajay Bura 83c6914a50 Merge pull request #117 from ajbura/master
v1.3.1: Bug fixes
2021-09-26 18:59:53 +05:30
Ajay Bura 0f06d88e18 v1.3.1
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-09-26 18:51:22 +05:30
Ajay Bura ea5f7b65f3 Fixed #115: High CPU usages while idling
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-09-26 18:47:37 +05:30
Ajay Bura 9ce95da8f4 Fixed #103: Crash when space nesting has a loop
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-09-25 20:18:06 +05:30
Ajay Bura abd1fd3efb fixed dark theme color
Signed-off-by: Ajay Bura <ajbura@gmail.com>
2021-09-25 18:18:58 +05:30
Ajay Bura 90ab8dac27 Merge pull request #116 from jamesjulich/chip
Added chip component.
2021-09-23 16:43:40 +05:30
Ajay Bura c96d556094 Updated Chip.scss property ordering 2021-09-23 16:40:52 +05:30
jamesjulich 26f68a890e Added chip component. 2021-09-20 11:02:15 -05:00
Ajay Bura cd5b7b17f6 Added more options to run locally 2021-09-15 17:17:31 +05:30
Ajay Bura 14cfa69060 Merge pull request #100 from mkljczk/fix-typo
Fix typo
2021-09-14 14:56:27 +05:30
marcin mikołajczak d6d1b0eeef Fix typo
Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
2021-09-14 09:30:37 +02:00
Ajay Bura 393d089229 Merge pull request #99 from ajbura/dev
Release v1.3.0
2021-09-14 10:38:47 +05:30
Ajay Bura 706d9b1f6f Merge branch 'master' into dev 2021-09-14 10:34:18 +05:30
Ajay Bura 0e9228ba7c v1.3.0 2021-09-14 10:24:42 +05:30
Ajay Bura 5a17badfae Added server disconnection message (#35) 2021-09-14 10:10:11 +05:30
Ajay Bura 437c6f8262 Renamed favourite to pin 2021-09-14 09:31:15 +05:30
Ajay Bura 65d55d6660 Added toggle to see password (#73) 2021-09-14 09:01:31 +05:30
Ajay Bura 7ba1aabc09 Fixed scroll issue on login screen 2021-09-14 08:33:17 +05:30
Ajay Bura 470fdd62bb Merge pull request #95 from jamesjulich/paste-image
Support pasting images as attachments. Fixes #87.
2021-09-14 07:50:07 +05:30
jamesjulich 6434d10e52 Support pasting images as attachments. Fixes #87. 2021-09-13 09:34:08 -05:00
Ajay Bura 2ed4fc9fbf Fixed read recipt issue 2021-09-13 19:47:40 +05:30
Ajay Bura b418895d9d Updated dependencies 2021-09-13 17:58:58 +05:30
Ajay Bura 8939927543 Updated matrix-js-sdk to v12.4.1 (Security fix) 2021-09-13 17:32:32 +05:30
Ajay Bura 0bbe6a0a12 Save edited message on enter (#78) 2021-09-13 16:30:23 +05:30
Ajay Bura 767784a79c Added onKeyDown prop to Input comp 2021-09-13 16:29:42 +05:30
Ajay Bura 64abfd4408 Merge pull request #91 from jamesjulich/profile-editor
Add profile editor in settings
2021-09-13 13:39:11 +05:30
Ajay Bura 872e2f9753 Added cancel button and support for empty display name (#91) 2021-09-13 13:33:24 +05:30
Ajay Bura 09f7225eb7 Added progress spinner in ImageUplaod (#91) 2021-09-13 12:27:55 +05:30
James Julich 95bb0ac6d4 Merge branch 'ajbura:dev' into profile-editor 2021-09-12 22:41:42 -05:00
jamesjulich f97596689f Move files and rename classes. 2021-09-12 22:25:58 -05:00
Ajay Bura 204be84c0f Merge pull request #89 from L-as/dev
Add preview to README
2021-09-13 08:09:08 +05:30
kfiven 93d8ba0b0f Replaced preview url with img from site repo (#89) 2021-09-12 21:20:08 +05:30
Ajay Bura b07c50e580 Added unread symbol for Spaces, DMs and Home (#82) 2021-09-12 20:44:13 +05:30
Ajay Bura fc0dc8aea0 Added abbreviateNumber for notfication count (#82) 2021-09-12 20:42:51 +05:30
unknown 284ed9dea1 Fixed NotificationBadge color 2021-09-12 11:20:56 +05:30
unknown 1651a90dea Bug fixed in Postie 2021-09-12 09:12:59 +05:30
unknown a888427777 Added Notification.js for noti mapping (#82) 2021-09-11 19:27:35 +05:30
unknown 6b53b78ee3 Improved roomList 2021-09-10 18:37:52 +05:30
unknown c2faa605d3 Changed prod workflows back on published 2021-09-09 19:08:29 +05:30
unknown 8bf5a6e0bc Added options to control room notifications (#25) 2021-09-09 18:36:39 +05:30
unknown 80551124f1 Added RoomOptions component (#25) 2021-09-09 17:49:57 +05:30
unknown 652f8227b5 Added unread highlight in RoomSelector 2021-09-09 17:35:39 +05:30
unknown 42f68f61c6 Added positive variant in ContextMenu 2021-09-09 17:33:32 +05:30
jamesjulich fcb4104856 Fix warnings related to line length. 2021-09-09 01:06:25 -05:00
jamesjulich a0139f4157 Adds comments. 2021-09-09 00:59:17 -05:00
jamesjulich 6c78060876 Add profile editor in settings 2021-09-09 00:47:26 -05:00
unknown b9b2f9f2c3 Added positive vaiant in button 2021-09-08 19:33:29 +05:30
Las Safin 87d5cb78b2 Add preview to README 2021-09-06 17:05:56 +00:00
unknown cdf421f0f1 Added option to fav spaces (#52) 2021-09-05 18:56:34 +05:30
unknown 2e58757bc9 Build prod on master push 2021-09-05 14:19:55 +05:30
unknown c689836208 Added variants in IconButton comp 2021-09-05 14:04:51 +05:30
unknown 4efc320f23 Added space nesting (#52) 2021-09-03 17:58:01 +05:30
unknown 6c1a602bdc Made tooltip optional in IconButton 2021-09-02 19:17:33 +05:30
unknown 0ae994de56 Added className prop to button comp 2021-09-02 19:15:28 +05:30
unknown e7f4a5bd59 Added workflows for docker/netlify 2021-09-01 21:01:24 +05:30
unknown 180973d49f updated license and readme 2021-09-01 15:47:50 +05:30
unknown 705910d9e0 Renamed channels to rooms (#30) 2021-08-31 18:43:31 +05:30
unknown b5dfc337ec refectored Drawer component and added Postie 2021-08-30 21:12:24 +05:30
unknown 8996b562bc created Postie 2021-08-30 21:03:59 +05:30
unknown 1ae6186647 Updated link 2021-08-30 11:17:08 +05:30
unknown 2848417cf5 refectored navigation 2021-08-30 08:31:13 +05:30
unknown d3506acd94 refactored ChannelSelector component 2021-08-29 13:57:55 +05:30
unknown 9e9ea41bdd updated NotificationBadge component 2021-08-28 18:16:20 +05:30
unknown 7b0aa7b770 input esc btn color changed 2021-08-27 20:06:06 +05:30
unknown 3a25d108fe v1.2.0 2021-08-26 18:30:31 +05:30
unknown d98e213b92 fixed inconsistent disply name 2021-08-26 18:28:33 +05:30
unknown 4d44562ada fixed #75: added esc btn to disable cmd mode 2021-08-26 15:45:31 +05:30
unknown b733b3c59f fixed #56: tab (after last cmd suggestion) and esc will focus back to input 2021-08-26 14:43:14 +05:30
unknown 7b54988514 close #72: Hide unread badge when there aren't any messages 2021-08-26 10:36:41 +05:30
unknown ec4da47af6 fusejs uninstalled 2021-08-25 15:16:07 +05:30
unknown 633d59c13b replaced fusejs in Emojiboard 2021-08-25 15:00:40 +05:30
unknown c06a92e0ae fixed #76 2021-08-25 14:06:13 +05:30
unknown 18bd9d62cb fixed #71 : input autofocus on touch devices 2021-08-25 13:40:38 +05:30
unknown 0bce6c6a46 added focus input on reply click 2021-08-25 13:02:18 +05:30
Ajay Bura 0465442803 changed heading lvl in PR template 2021-08-24 19:02:10 +05:30
unknown eb667bc436 close #2 : added autocomplete for display name & replace fusejs 2021-08-24 15:31:20 +05:30
unknown c81628a66e added async search capability 2021-08-23 21:26:23 +05:30
unknown 50d3631bc4 fixed emojiboard opening 2021-08-22 18:15:20 +05:30
unknown e971069595 chat scrollback performance improved 2021-08-21 18:39:21 +05:30
unknown ac4c0ec1f6 added support for msg editing [#40] 2021-08-20 19:12:57 +05:30
unknown fe3d2e0af4 added msg edit component [#40] 2021-08-20 19:12:07 +05:30
unknown a4b762e1b1 added device key in settings 2021-08-19 22:24:09 +05:30
unknown daa0015fbd fixed bridge reply formatting 2021-08-18 15:51:57 +05:30
unknown 804248d6ad added sticker viewing support 2021-08-18 14:56:23 +05:30
unknown 78c4c67a6c implemented #63 : non kick leave msgs 2021-08-18 14:05:10 +05:30
unknown c23be53bfd fixed crashes on bad media data 2021-08-18 13:55:44 +05:30
unknown d7e3e70430 Fixed #59 : Consistant channel avatar bg 2021-08-17 17:04:21 +05:30
unknown e95a859ee9 Fixed #59 : Updated channel intro 2021-08-17 16:51:22 +05:30
unknown 1a3704e700 Fixed #59 : DM room avatar 2021-08-17 16:37:31 +05:30
unknown f49048c6e1 replaced commonmark with micromark and gfm support 2021-08-17 15:10:44 +05:30
unknown 59226365c5 reworded to seen by 2021-08-16 17:58:46 +05:30
unknown 683ce431db added read receipt support 2021-08-16 17:51:23 +05:30
unknown 8d4e796f42 added ReadReceipts component 2021-08-16 17:37:29 +05:30
unknown 3da1fbf6ca added dialog component 2021-08-16 17:34:19 +05:30
unknown 419e25df23 No known servers on channel join bug fixed 2021-08-15 22:25:07 +05:30
unknown 7fddf80c09 bug fixed attachment related 2021-08-15 18:57:05 +05:30
unknown fa85e61d6f added support for sending reaction 2021-08-15 13:59:09 +05:30
unknown ebac0db0df EmojiBoard bug fixed 2021-08-14 10:29:28 +05:30
unknown 0404f30c87 made EmojiBoard reusable 2021-08-14 10:19:29 +05:30
unknown 769fd7b524 improved EmojiBoard 2021-08-13 16:31:22 +05:30
unknown 4b5553abef removed username regex from login 2021-08-12 16:18:01 +05:30
unknown e730eb3a32 fixed reply formatting 2021-08-12 14:37:00 +05:30
unknown 2933b6e732 reply overflow fixed 2021-08-12 12:12:59 +05:30
unknown 94ae2f2658 v1.1.0 2021-08-12 10:30:26 +05:30
unknown 3453451df9 added msg deletion support 2021-08-12 09:42:12 +05:30
unknown 80d4a2b242 join channel with alias bug fixed 2021-08-11 16:48:39 +05:30
unknown c9b1a062ce show mxId on hover over displayname 2021-08-11 13:58:53 +05:30
unknown 717ffe560f added reply support 2021-08-11 13:29:01 +05:30
unknown 109e2fa82d added markdown toggle 2021-08-11 13:11:55 +05:30
unknown d03fc2fcf1 refactored message compnonent 2021-08-10 16:58:44 +05:30
unknown d0111e7741 added Tooltip component 2021-08-10 16:58:16 +05:30
unknown 5e76d6d865 improved emoji suggestions 2021-08-10 14:12:00 +05:30
unknown 90e67b22b4 clear stores in invalid session bug fixed 2021-08-10 12:10:02 +05:30
unknown 92ba6c9802 added markdown support 2021-08-09 14:44:06 +05:30
unknown 0286a51525 added twemoji in emoji autofill 2021-08-09 14:43:43 +05:30
unknown b552e2cda8 added commands support 2021-08-08 21:56:34 +05:30
unknown 0feb56cb3e added positive color palette 2021-08-08 20:52:09 +05:30
unknown e1a0acdf4a added search term ability in PublicChannels component 2021-08-08 14:45:21 +05:30
unknown 6586f933ff added support for alias search in public channels 2021-08-08 14:28:22 +05:30
unknown 4ec770da63 added search term ability in InviteUser component 2021-08-08 10:23:26 +05:30
Ajay Bura 39b84a083d Merge pull request #43 from arche-dev/Import_Keys
Clarify text in "Import E2E room keys" section
2021-08-07 17:08:38 +05:30
Arche 28857473b2 Clarify text 2021-08-07 01:05:10 +00:00
Arche 2bfc10dab4 Capitalize "password" 2021-08-07 01:03:54 +00:00
unknown 1dce1157f4 notification badge contrast fixed 2021-08-05 08:43:38 +05:30
unknown 08d53d52e7 refactored ChannelView 2021-08-04 15:22:59 +05:30
unknown 2918d97fd0 updated matrix-js-sdk 2021-08-04 09:29:06 +05:30
Ajay Bura 701e170e19 Merge pull request #39 from cremesk/master
nginx example
2021-08-04 07:43:26 +05:30
creme 71ee669fc5 ensure new mime type comes in types. 2021-08-03 19:07:22 +02:00
creme 661ac8c6f4 add example nginx config file 2021-08-03 19:04:45 +02:00
unknown 210f6b51df updated olm to v3.2.4 2021-08-03 19:27:09 +05:30
Ajay Bura 20611b6e4b Merge pull request #38 from Troplo/master
Fix for invalid password bug on Synapse/Official Matrix Server?
2021-08-03 14:28:13 +05:30
Troplo 689e4b8d23 Fix for invalid password bug on Synapse? 2021-08-03 14:23:28 +10:00
unknown d0378ea528 updated package.json 2021-08-03 08:47:11 +05:30
unknown 5454ed3458 configured webpack to copy olm.wasm automatically 2021-08-03 08:42:12 +05:30
unknown 0070d46a20 added dist to gitignore and updated readme 2021-08-03 08:27:41 +05:30
Ajay Bura 540c10aaff Merge pull request #36 from arche-dev/building-patch
Fix building instructions
2021-08-02 19:11:10 +05:30
Arche f5dfc3604a Fix command and add comment formatting
Changed the command from `npm build` to `npm run build`, and changed the codeblock language formatting thing to use `sh`
2021-08-02 11:51:08 +00:00
Krishan b2c5304efe Merge pull request #34 from williamkray/develop
Update README
2021-08-01 21:48:44 +05:30
William Kray fa512f16c6 Merge branch 'master' of https://github.com/ajbura/cinny 2021-08-01 08:57:41 -07:00
William Kray cbfb25b390 fix some wording in README 2021-08-01 08:54:19 -07:00
William Kray b1e55201cf have a more descriptive readme with build/run instructions 2021-08-01 08:51:58 -07:00
Krishan 8beeb64127 Merge pull request #33 from williamkray/master
update dockerfile to include _redirects in container
2021-08-01 21:12:16 +05:30
William Kray 2d2938c8ad update dockerfile to include _redirects in container 2021-08-01 08:27:43 -07:00
unknown e9005d57da updated wording 2021-08-01 20:28:34 +05:30
Ajay Bura 69f7c8a500 Merge pull request #23 from moritzdietz/moritzdietz/fix-typos-and-wording
Fix typos and wording
2021-08-01 20:17:03 +05:30
Ajay Bura 98fd24ffdc Merge pull request #31 from ShadowJonathan/template-fix
Fix some templates' markup
2021-08-01 20:12:21 +05:30
unknown 21c3e90b58 fixed typo 2021-08-01 20:08:46 +05:30
unknown 49281e0d15 removed package-lock.json from gitignore 2021-08-01 19:52:05 +05:30
unknown e597f81b45 added support to decrypt older message 2021-08-01 19:30:35 +05:30
unknown 9f6047aebd added UI component for importing e2e keys 2021-08-01 19:29:15 +05:30
unknown 0745f964c1 add support to decrypt e2e keys 2021-08-01 19:28:09 +05:30
moritzdietz 18b1ad7b62 Merge remote-tracking branch 'upstream/master' into moritzdietz/fix-typos-and-wording 2021-08-01 13:50:56 +02:00
moritzdietz 9448936e32 Fix typos and wording 2021-08-01 13:38:09 +02:00
Jonathan de Jong f1dc436a07 fancify 2021-08-01 11:31:09 +00:00
unknown f163e24201 improved about section in settings 2021-07-31 21:50:15 +05:30
unknown 81f4f1c46f UI bug fixed in PopupWindow drawer 2021-07-31 19:54:43 +05:30
unknown a82e74381f added sub-sections in settings 2021-07-31 19:53:08 +05:30
unknown 7459896bac PopupWindow drawer width decreased 2021-07-31 17:55:15 +05:30
unknown dd2783b040 improved PopupWindow drawer UI 2021-07-31 17:45:33 +05:30
unknown 23ff2c3ab4 added device id in settings 2021-07-31 13:51:19 +05:30
unknown ad51191a77 added redirects 2021-07-31 12:55:20 +05:30
unknown 8ef5ab6fe9 Updated funding.yml 2021-07-31 11:14:09 +05:30
unknown 2218f9781b Removed dist from gitignore 2021-07-31 08:24:07 +05:30
unknown d08d727917 added authorship 2021-07-31 08:21:57 +05:30
unknown 8cf030585f Fixed homeserver delegation issue 2021-07-29 15:31:35 +05:30
unknown c29515db38 Increased pass length to 127 char 2021-07-29 13:58:15 +05:30
unknown d9e27bfaf1 Temporarily fixes CORS header issue while logging in 2021-07-29 13:53:50 +05:30
Ajay Bura 2e8830b9d3 Merge pull request #14 from phildenhoff/phildenhoff/fix-at-sigil-in-localpart
Remove username login requirements and sanitise out leading "@"
2021-07-29 11:22:06 +05:30
Ajay Bura 4d3d6ea9a7 Merge branch 'master' into phildenhoff/fix-at-sigil-in-localpart 2021-07-29 11:21:11 +05:30
Ajay Bura e69f344ab2 Merge pull request #8 from williamkray/master
add dockerfile which builds a cinny container served by nginx
2021-07-29 11:16:45 +05:30
William Kray 313ff8e184 add dockerfile which builds a cinny container served by nginx 2021-07-28 12:43:47 -07:00
unknown 896738dc22 Fixed login username regex 2021-07-28 21:10:47 +05:30
252 changed files with 43683 additions and 4439 deletions
+2 -1
View File
@@ -1 +1,2 @@
liberapay: kfiven
open_collective: cinny
liberapay: ajbura
+10 -9
View File
@@ -7,26 +7,27 @@ assignees: ''
---
**Describe the bug**
#### Describe the bug
A clear and concise description of what the bug is.
**To Reproduce**
#### To Reproduce
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
#### Expected behavior
A clear and concise description of what you expected to happen.
**Screenshots**
#### Screenshots
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
#### Desktop (please complete the following information):
- OS: [e.g. Windows, MacOS]
- Browser: [e.g. chrome, firefox]
- Version: [e.g. 3.22]
- Matrix homeserver: [e.g. matrix.org]
**Additional context**
#### Additional context
Add any other context about the problem here.
+4 -4
View File
@@ -7,14 +7,14 @@ assignees: ''
---
**Is your feature request related to a problem? Please describe.**
#### Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
#### Describe the solution you'd like
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
#### Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
#### Additional context
Add any other context or screenshots about the feature request here.
+4 -4
View File
@@ -1,12 +1,12 @@
<!-- Please read https://github.com/ajbura/cinny/CONTRIBUTING.md before submitting your pull request -->
# Description
### Description
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.
Fixes # (issue)
## Type of change
#### Type of change
Please delete options that are not relevant.
@@ -15,10 +15,10 @@ Please delete options that are not relevant.
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update
# Checklist:
### Checklist:
- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my own code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] My changes generate no new warnings
+32
View File
@@ -0,0 +1,32 @@
name: 'Build PR'
on:
pull_request:
types: ['opened', 'synchronize']
jobs:
build:
runs-on: ubuntu-latest
env:
PR_NUMBER: ${{github.event.number}}
steps:
- uses: actions/checkout@v2
- name: Build
run: npm install && npm run build
- name: Upload Artifact
uses: actions/upload-artifact@v2
with:
name: previewbuild
path: dist
retention-days: 1
- uses: actions/github-script@v3.1.0
with:
script: |
var fs = require('fs');
fs.writeFileSync('${{github.workspace}}/pr.json', JSON.stringify(context.payload.pull_request));
- name: Upload PR Info
uses: actions/upload-artifact@v2
with:
name: pr.json
path: pr.json
retention-days: 1
+78
View File
@@ -0,0 +1,78 @@
name: Upload Preview Build to Netlify
on:
workflow_run:
workflows: ["Build PR"]
types:
- completed
jobs:
build:
runs-on: ubuntu-latest
if: >
${{ github.event.workflow_run.conclusion == 'success' }}
steps:
# There's a 'download artifact' action but it hasn't been updated for the
# workflow_run action (https://github.com/actions/download-artifact/issues/60)
# so instead we get this mess:
- name: 'Download artifact'
uses: actions/github-script@v3.1.0
with:
script: |
var artifacts = await github.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: ${{github.event.workflow_run.id }},
});
var matchArtifact = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "previewbuild"
})[0];
var download = await github.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifact.id,
archive_format: 'zip',
});
var fs = require('fs');
fs.writeFileSync('${{github.workspace}}/previewbuild.zip', Buffer.from(download.data));
var prInfoArtifact = artifacts.data.artifacts.filter((artifact) => {
return artifact.name == "pr.json"
})[0];
var download = await github.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: prInfoArtifact.id,
archive_format: 'zip',
});
var fs = require('fs');
fs.writeFileSync('${{github.workspace}}/pr.json.zip', Buffer.from(download.data));
- name: Extract Artifacts
run: unzip -d dist previewbuild.zip && rm previewbuild.zip && unzip pr.json.zip && rm pr.json.zip
- name: 'Read PR Info'
id: readctx
uses: actions/github-script@v3.1.0
with:
script: |
var fs = require('fs');
var pr = JSON.parse(fs.readFileSync('${{github.workspace}}/pr.json'));
console.log(`::set-output name=prnumber::${pr.number}`);
- name: Deploy to Netlify
id: netlify
uses: nwtgck/actions-netlify@v1.2
with:
publish-dir: dist
deploy-message: "Deploy from GitHub Actions"
# These don't work because we're in workflow_run
enable-pull-request-comment: false
enable-commit-comment: false
env:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE3_ID }}
timeout-minutes: 1
- name: Edit PR Description
uses: velas/pr-description@v1.0.1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
pull-request-number: ${{ steps.readctx.outputs.prnumber }}
description-message: |
Preview: ${{ steps.netlify.outputs.deploy-url }}
⚠️ Do you trust the author of this PR? Maybe this build will steal your keys or give you malware. Exercise caution. Use test accounts.
+34
View File
@@ -0,0 +1,34 @@
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Log in to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v3
with:
images: ajbura/cinny
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
+21
View File
@@ -0,0 +1,21 @@
name: 'Deploy to Netlify (dev)'
on:
push:
branches:
- dev
jobs:
deploy:
name: 'Deploy'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: jsmrcaga/action-netlify-deploy@9cc40dcd499dd1511b3cc99912444f8970411cc6
with:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE2_ID }}
BUILD_DIRECTORY: "dist"
NETLIFY_DEPLOY_MESSAGE: "Dev deploy v${{ github.ref }}"
NETLIFY_DEPLOY_TO_PROD: true
+20
View File
@@ -0,0 +1,20 @@
name: 'Deploy to Netlify (prod)'
on:
release:
types: [published]
jobs:
deploy:
name: 'Deploy'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: jsmrcaga/action-netlify-deploy@9cc40dcd499dd1511b3cc99912444f8970411cc6
with:
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
BUILD_DIRECTORY: "dist"
NETLIFY_DEPLOY_MESSAGE: "Prod deploy v${{ github.ref }}"
NETLIFY_DEPLOY_TO_PROD: true
+3 -2
View File
@@ -1,5 +1,6 @@
experiment
package-lock.json
dist
node_modules
devAssets
devAssets
.DS_Store
+16 -116
View File
@@ -1,139 +1,39 @@
<!-- omit in toc -->
# Contributing to Cinny
First off, thanks for taking the time to contribute! ❤️
All types of contributions are encouraged and valued. See the [Table of Contents](#table-of-contents) for different ways to help and details about how this project handles them. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉
All types of contributions are encouraged and valued. Please make sure to read the relevant section before making your contribution. It will make it a lot easier for us maintainers and smooth out the experience for all involved. The community looks forward to your contributions. 🎉
> And if you like the project, but just don't have time to contribute, that's fine. There are other easy ways to support the project and show your appreciation, which we would also be very happy about:
> - Star the project
> - Tweet about it (tag @cinnyapp)
> - Refer this project in your project's readme
> - Mention the project at local meetups and tell your friends/colleagues
> - [Donate to us](https://liberapay.com/kfiven/donate)
> - [Donate to us](https://cinny.in/#sponsor)
<!-- omit in toc -->
## Table of Contents
## Bug reports
- [I Have a Question](#i-have-a-question)
- [I Want To Contribute](#i-want-to-contribute)
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Enhancements](#suggesting-enhancements)
- [Your First Code Contribution](#your-first-code-contribution)
- [Styleguides](#styleguides)
- [Commit Messages](#commit-messages)
- [Coding conventions](#coding-conventions)
Bug reports and feature suggestions must use descriptive and concise titles and be submitted to [GitHub Issues](https://github.com/ajbura/cinny/issues). Please use the search function to make sure that you are not submitting duplicates, and that a similar report or request has not already been resolved or rejected.
## I Have a Question
## Pull requests
Before you ask a question, it is best to search for existing [Issues](https://github.com/ajbura/cinny/issues) that might help you. In case you have found a suitable issue and still need clarification, you can write your question in this issue.
If you then still feel the need to ask a question and need clarification, we recommend the following:
- Ask in our [Matrix room](https://matrix.to/#/#cinny:matrix.org) or [IRC channel](https://web.libera.chat/?channel=#cinny).
- If no one respond in our channel, please open an [Issue](https://github.com/ajbura/cinny/issues/new).
- Provide as much context as you can about what you're running into.
- Provide project and platform versions (nodejs, npm, etc), depending on what seems relevant.
We will then take care of the issue as soon as possible.
## I Want To Contribute
> ### Legal Notice <!-- omit in toc -->
> ### Legal Notice
> When contributing to this project, you must agree that you have authored 100% of the content, that you have the necessary rights to the content and that the content you contribute may be provided under the project license.
### Reporting Bugs
**NOTE: If you want to add new features, please discuss with maintainers before coding or opening a pull request.** This is to ensure that we are on same track and following our roadmap.
<!-- omit in toc -->
#### Before Submitting a Bug Report
**Please use clean, concise titles for your pull requests.** We use commit squashing, so the final commit in the dev branch will carry the title of the pull request. For easier sorting in changelog, start your pull request titles using one of the verbs "Add", "Change", "Remove", or "Fix" (present tense).
A good bug report shouldn't leave others needing to chase you up for more information. Therefore, we ask you to investigate carefully, collect information and describe the issue in detail in your report. Please complete the following steps in advance to help us fix any potential bug as fast as possible.
Example:
- Make sure that you are using the latest version.
- Determine if your bug is really a bug and not an error on your side. If you are looking for support, you might want to check [this section](#i-have-a-question)).
- To see if other users have experienced (and potentially already solved) the same issue you are having, check if there is not already a bug report existing for your bug or error in the [bug tracker](https://github.com/ajbura/cinny/issues?q=label%3Abug).
- Collect information about the bug:
- OS, Platform and Version (Windows, Linux, macOS, x86, ARM)
- Possibly your input and the output
- Can you reliably reproduce the issue?
|Not ideal|Better|
|---|----|
|Fixed markAllAsRead in RoomTimeline|Fix read marker when paginating room timeline|
<!-- omit in toc -->
#### How Do I Submit a Good Bug Report?
It is not always possible to phrase every change in such a manner, but it is desired.
> You must never report security related issues, vulnerabilities or bugs to the issue tracker, or elsewhere in public. Instead sensitive bugs must be sent by email to <cinnyapp@gmail.com>.
**The smaller the set of changes in the pull request is, the quicker it can be reviewed and merged.** Splitting tasks into multiple smaller pull requests is often preferable.
We use GitHub issues to track bugs and errors. If you run into an issue with the project:
Also, we use [ESLint](https://eslint.org/) for clean and stylistically consistent code syntax, so make sure your pull request follow it.
- Open an [Issue](https://github.com/ajbura/cinny/issues/new). (Since we can't be sure at this point whether it is a bug or not, we ask you not to talk about a bug yet and not to label the issue.)
- Explain the behavior you would expect and the actual behavior.
- Please provide as much context as possible and describe the *reproduction steps* that someone else can follow to recreate the issue on their own. For good bug reports you should isolate the problem and create a reduced test case.
- Provide the information you collected in the previous section.
Once it's filed:
- The project team will label the issue accordingly.
- A team member will try to reproduce the issue with your provided steps. If there are no reproduction steps or no obvious way to reproduce the issue, the team will ask you for those steps and mark the issue as `needs-repro`. Bugs with the `needs-repro` tag will not be addressed until they are reproduced.
- If the team is able to reproduce the issue, it will be marked `needs-fix`, as well as possibly other tags (such as `critical`), and the issue will be left to be [implemented by someone](#your-first-code-contribution).
### Suggesting Enhancements
This section guides you through submitting an enhancement suggestion for Cinny, **including completely new features and minor improvements to existing functionality**. Following these guidelines will help maintainers and the community to understand your suggestion and find related suggestions.
<!-- omit in toc -->
#### Before Submitting an Enhancement
- Make sure that you are using the latest version.
- Perform a [search](https://github.com/ajbura/cinny/issues) to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
- Find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the project's developers of the merits of this feature. Keep in mind that we want features that will be useful to the majority of our users and not just a small subset.
<!-- omit in toc -->
#### How Do I Submit a Good Enhancement Suggestion?
Enhancement suggestions are tracked as [GitHub issues](https://github.com/ajbura/cinny/issues).
- Use a **clear and descriptive title** for the issue to identify the suggestion.
- Provide a **step-by-step description of the suggested enhancement** in as many details as possible.
- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. At this point you can also tell which alternatives do not work for you.
- You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) on Linux.
- **Explain why this enhancement would be useful** to most Cinny users. You may also want to point out the other projects that solved it better and which could serve as inspiration.
### Your First Code Contribution
Please send a [GitHub Pull Request to cinny](https://github.com/ajbura/cinny/pull/new/master) with a clear list of what you've done (read more about [pull requests](http://help.github.com/pull-requests/)).
When proposing a PR:
- Describe what problem it solves, what side effects come with it.
- Adding some screenshots will help.
- Add some documentation if relevant.
- Add some comments around blocks/functions if relevant.
Some reasons why a PR could be refused:
- PR is not meeting one of the previous points.
- PR is not meeting project goals.
- PR is conflicting with another PR, and the latter is being preferred.
- PR slows down Cinny, or it obviously does too many
computations for the task being accomplished. It needs to be optimized.
- PR is using copy-n-paste-programming. It needs to be factorized.
- PR contains commented code: remove it.
- PR adds new features or changes the behavior of Cinny without
having be approved by the current project owners first.
- PR is too big and needs to be splitted in many smaller ones.
- PR contains unnecessary "space/indentations fixes".
If a PR stays in a stale/WIP/POC state for too long, it may be closed
at any time.
## Styleguides
### Commit Messages
Always write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should look like this:
$ git commit -m "A brief summary of the commit
>
> A paragraph describing what changed and its impact."
### Coding conventions
We use [ESLint](https://eslint.org/) for clean and stylistically consistent code syntax.
**For any query or design discussion, join our [Matrix room](https://matrix.to/#/#cinny:matrix.org).**
+20
View File
@@ -0,0 +1,20 @@
## Builder
FROM node:14-alpine as builder
WORKDIR /src
COPY . /src
RUN npm install \
&& npm run build
## App
FROM nginx:alpine
COPY --from=builder /src/dist /app
# Insert wasm type into Nginx mime.types file so they load correctly.
RUN sed -i '3i\ \ \ \ application/wasm wasm\;' /etc/nginx/mime.types
RUN rm -rf /usr/share/nginx/html \
&& ln -s /app /usr/share/nginx/html
+1 -1
View File
@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2021 Ajay Bura (ajbura)
Copyright (c) 2021 Ajay Bura (ajbura) and other contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+55 -1
View File
@@ -8,4 +8,58 @@
## About <a name = "about"></a>
Cinny is a [matrix](https://matrix.org) client focusing primarily on simple, elegant and secure interface.
Cinny is a [Matrix](https://matrix.org) client focusing primarily on simple, elegant and secure interface.
![preview](https://github.com/ajbura/cinny-site/blob/master/assets/preview-light.png)
## Building and Running
### Running pre-compiled
A tarball of pre-compiled version of the app is provided with each [release](https://github.com/ajbura/cinny/releases).
You can serve the application with a webserver of your choosing by simply copying `dist/` directory to the webroot.
### Building from source
Execute the following commands to compile the app from its source code:
```sh
npm ci # Installs all dependencies
npm run build # Compiles the app into the dist/ directory
```
You can then copy the files to a webserver's webroot of your choice.
To serve a development version of the app locally for testing, you may also use the command `npm start`.
### Running with Docker
This repository includes a Dockerfile, which builds the application from source and serves it with Nginx on port 80. To
use this locally, you can build the container like so:
```
docker build -t cinny:latest .
```
You can then run the container you've built with a command similar to this:
```
docker run -p 8080:80 cinny:latest
```
This will forward your `localhost` port 8080 to the container's port 80. You can visit the app in your browser by
navigating to `http://localhost:8080`.
Alternatively you can just pull the [DockerHub image](https://hub.docker.com/r/ajbura/cinny) by `docker pull ajbura/cinny`.
### Configuring default Homeserver
To set default Homeserver on login and register page, place a customized [`config.json`](config.json) in webroot of your choice.
## License
Copyright (c) 2021 Ajay Bura (ajbura) and contributors
Code licensed under the MIT License: <http://opensource.org/licenses/MIT>
Graphics licensed under CC-BY 4.0: <https://creativecommons.org/licenses/by/4.0/>
+3
View File
@@ -0,0 +1,3 @@
# Redirects from what the browser requests to what we serve
/login /
/register /
+12
View File
@@ -0,0 +1,12 @@
{
"defaultHomeserver": 5,
"homeserverList": [
"boba.best",
"converser.eu",
"envs.net",
"halogen.city",
"kde.org",
"matrix.org",
"mozilla.modular.im"
]
}
+12
View File
@@ -0,0 +1,12 @@
# nginx configuration
## Insert wasm type into nginx mime.types file so they load correctly.
`/etc/nginx/mime.types`:
```
types {
..
application/wasm wasm;
..
}
```
+27
View File
@@ -0,0 +1,27 @@
server {
listen 80;
listen [::]:80;
server_name cinny.domain.tld;
location / {
return 301 https://$host$request_uri;
}
location /.well-known/acme-challenge/ {
alias /var/lib/letsencrypt/.well-known/acme-challenge/;
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl;
server_name cinny.domain.tld;
location / {
root /opt/cinny/dist/;
index index.html;
}
location ~* ^\/(login|register) {
try_files $uri $uri/ /index.html;
}
}
BIN
View File
Binary file not shown.
+28205
View File
File diff suppressed because it is too large Load Diff
+19 -17
View File
@@ -1,7 +1,7 @@
{
"name": "cinny",
"version": "1.0.0",
"description": "Organized and powerful matrix client.",
"version": "1.7.0",
"description": "Yet another matrix client",
"main": "index.js",
"engines": {
"npm": ">=6.14.11",
@@ -12,41 +12,43 @@
"build": "webpack --config ./webpack.prod.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"author": "Ajay Bura",
"license": "MIT",
"dependencies": {
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.8.tgz",
"@tippyjs/react": "^4.2.5",
"babel-polyfill": "^6.26.0",
"browser-encrypt-attachment": "^0.3.0",
"dateformat": "^4.5.1",
"emojibase-data": "^6.2.0",
"file-saver": "^2.0.5",
"flux": "^4.0.1",
"fuse.js": "^6.4.6",
"formik": "^2.2.9",
"html-react-parser": "^1.2.7",
"linkifyjs": "^3.0.0-beta.3",
"matrix-js-sdk": "^11.2.0",
"olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz",
"linkifyjs": "^2.1.9",
"matrix-js-sdk": "^15.2.1",
"micromark": "^3.0.3",
"micromark-extension-gfm": "^1.0.0",
"prop-types": "^15.7.2",
"react": "^17.0.2",
"react-autosize-textarea": "^7.1.0",
"react-dom": "^17.0.2",
"react-google-recaptcha": "^2.1.0",
"react-markdown": "^6.0.1",
"react-modal": "^3.13.1",
"react-router-dom": "^5.2.0",
"react-syntax-highlighter": "^15.4.3",
"remark-gfm": "^1.0.0",
"sanitize-html": "^2.5.3",
"tippy.js": "^6.3.1",
"twemoji": "^13.1.0"
},
"devDependencies": {
"@babel/core": "^7.13.13",
"@babel/core": "^7.15.5",
"@babel/preset-env": "^7.13.12",
"@babel/preset-react": "^7.13.13",
"assert": "^2.0.0",
"babel-loader": "^8.2.2",
"browserify-fs": "^1.0.0",
"buffer": "^6.0.3",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^9.0.1",
"crypto-browserify": "^3.12.0",
"css-loader": "^5.2.0",
"css-minimizer-webpack-plugin": "^1.3.0",
@@ -67,10 +69,10 @@
"sass-loader": "^11.0.1",
"stream-browserify": "^3.0.0",
"style-loader": "^2.0.0",
"util": "^0.12.3",
"webpack": "^5.28.0",
"webpack-cli": "^4.5.0",
"webpack-dev-server": "^3.11.2",
"util": "^0.12.4",
"webpack": "^5.62.1",
"webpack-cli": "^4.9.1",
"webpack-dev-server": "^4.4.0",
"webpack-merge": "^5.7.3"
}
}
+4 -4
View File
@@ -3,17 +3,17 @@
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://api.fontshare.com/css?f[]=supreme@300,301,400,401,500,501,700,701&display=swap" rel="stylesheet">
<meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0 user-scalable=no">
<title>Cinny</title>
<meta name="name" content="Cinny">
<meta name="description" content="Yet another matrix client. Where you can enjoy the conversation using simple, elegant and secure interface protected by e2ee with the power of open source.">
<meta name="author" content="Ajay Bura">
<meta name="description" content="A Matrix client where you can enjoy the conversation using simple, elegant and secure interface protected by e2ee with the power of open source.">
<meta name="keywords" content="cinny, cinnyapp, cinnychat, matrix, matrix client, matrix.org, element">
<meta property="og:title" content="Cinny">
<meta property="og:url" content="https://cinny.in">
<meta property="og:image" content="https://cinny.in/assets/favicon-48x48.png">
<meta property="og:description" content="Yet another matrix client. Where you can enjoy the conversation using simple, elegant and secure interface protected by e2ee with the power of open source.">
<meta property="og:description" content="A Matrix client where you can enjoy the conversation using simple, elegant and secure interface protected by e2ee with the power of open source.">
<meta name="theme-color" content="#000000">
</head>
<body id="appBody">
Binary file not shown.
+202
View File
@@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path d="M13.8,4.5l0.7,0.7l-3.4,3.4L7.7,9.7l-1-1l-1.4,1.4l3.5,3.5l-5.7,5.7l1.4,1.4l5.7-5.7l3.5,3.5l1.4-1.4l-1-1l1.1-3.4l3.4-3.4
l0.7,0.7l1.4-1.4l-5.7-5.7L13.8,4.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 612 B

+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<polygon points="12,2 15.1,8.6 22,9.6 17,14.8 18.2,22 12,18.6 5.8,22 7,14.8 2,9.6 8.9,8.6 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 549 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<path d="M12,22c1.1,0,2-0.9,2-2h-4C10,21.1,10.9,22,12,22z"/>
<path d="M20.1,18.1L20.1,18.1L16,14L9.2,7.2L7.8,5.8L5.9,3.9L4.5,5.3l2.1,2.1C6.2,8.2,6,9.1,6,10v6H4v2h13.2l1.5,1.5L20.1,18.1z
M8,16v-6c0-0.4,0.1-0.7,0.1-1l7,7H8z"/>
<path d="M12,6c2.2,0,4,1.8,4,4v1.2l2,2V10c0-3-2.2-5.4-5-5.9V3h-2v1.1c-0.6,0.1-1.1,0.3-1.6,0.5L11,6.1C11.3,6.1,11.6,6,12,6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 810 B

+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<circle cx="17" cy="8" r="3"/>
<path d="M12,22c1.1,0,2-0.9,2-2h-4C10,21.1,10.9,22,12,22z"/>
<path d="M18,12.9C17.7,13,17.3,13,17,13s-0.7,0-1-0.1V16H8v-6c0-2.2,1.8-4,4-4c0.1,0,0.3,0,0.4,0c0.3-0.7,0.7-1.3,1.3-1.8
c-0.2-0.1-0.5-0.1-0.7-0.2V3h-2v1.1C8.2,4.6,6,7,6,10v6H4v2h16v-2h-2V12.9z"/>
<path d="M6.3,4.3L4.9,2.9C3.1,4.7,2,7.2,2,10h2C4,7.8,4.9,5.8,6.3,4.3z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 819 B

+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<path d="M12,22c1.1,0,2-0.9,2-2h-4C10,21.1,10.9,22,12,22z"/>
<path d="M18,10c0-3-2.2-5.4-5-5.9V3h-2v1.1C8.2,4.6,6,7,6,10v6H4v2h16v-2h-2V10z M16,16H8v-6c0-2.2,1.8-4,4-4s4,1.8,4,4V16z"/>
<path d="M6.3,4.3L4.9,2.9C3.1,4.7,2,7.2,2,10h2C4,7.8,4.9,5.8,6.3,4.3z"/>
<path d="M19.1,2.9l-1.4,1.4C19.1,5.8,20,7.8,20,10h2C22,7.2,20.9,4.7,19.1,2.9z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 796 B

+2 -3
View File
@@ -4,8 +4,7 @@
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<path d="M12,4c2.8,0,5,2.2,5,5v4v0.8l0.6,0.6l0.6,0.6H5.8l0.6-0.6L7,13.8V13V9C7,6.2,9.2,4,12,4 M12,2C8.1,2,5,5.1,5,9v4l-2,2v2h18
v-2l-2-2V9C19,5.1,15.9,2,12,2L12,2z"/>
<path d="M9,19c0,1.7,1.3,3,3,3s3-1.3,3-3H9z"/>
<path d="M12,22c1.1,0,2-0.9,2-2h-4C10,21.1,10.9,22,12,22z"/>
<path d="M18,16v-6c0-3-2.2-5.4-5-5.9V3h-2v1.1C8.2,4.6,6,7,6,10v6H4v2h16v-2H18z M16,16H8v-6c0-2.2,1.8-4,4-4s4,1.8,4,4V16z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 671 B

After

Width:  |  Height:  |  Size: 640 B

+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<g>
<g>
<rect x="9" y="8" width="2" height="8"/>
</g>
<g>
<rect x="13" y="8" width="2" height="8"/>
</g>
</g>
<path d="M21,3h-5l-1.4-1.4C14.2,1.2,13.7,1,13.2,1h-2.3c-0.5,0-1,0.2-1.4,0.6L8,3H3v2h2v14c0,1.1,0.9,2,2,2h10c1.1,0,2-0.9,2-2V5h2
V3z M17,19H7V5h10V19z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 735 B

+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<polygon points="9.5,14.1 6,10.6 4.6,12 8.1,15.5 9.5,16.9 19.4,7 18,5.6 "/>
</svg>

After

Width:  |  Height:  |  Size: 520 B

+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<path d="M20,4H4C2.9,4,2,4.9,2,6v12c0,1.1,0.9,2,2,2h16c1.1,0,2-0.9,2-2V6C22,4.9,21.1,4,20,4z M20,18H4V6h16V18z"/>
<polygon points="7.5,16.5 12.1,12 7.5,7.5 6.5,8.5 9.9,12 6.5,15.5 "/>
<rect x="13" y="14.5" width="5" height="1.5"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 688 B

+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<path d="M12,20c-4.4,0-8-3.6-8-8s3.6-8,8-8V2C6.5,2,2,6.5,2,12s4.5,10,10,10s10-4.5,10-10h-2C20,16.4,16.4,20,12,20z"/>
<circle cx="9.5" cy="8.5" r="1.5"/>
<circle cx="14.5" cy="8.5" r="1.5"/>
<path d="M6,12c0,3.3,2.7,6,6,6s6-2.7,6-6h-2c0,2.2-1.8,4-4,4s-4-1.8-4-4H6z"/>
<polygon points="20.8,3.3 20.8,0 19.3,0 19.3,3.3 16,3.3 16,4.8 19.3,4.8 19.3,8 20.8,8 20.8,4.8 24,4.8 24,3.3 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 839 B

+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<g>
<path d="M12,19c-4.4,0-8-4-9.3-5.8c-0.6-0.7-0.6-1.7,0-2.4C4,9,7.6,5,12,5s8,4,9.3,5.8c0.6,0.7,0.6,1.7,0,2.4C20,15,16.4,19,12,19
z M12,7c-3.6,0-6.9,3.8-7.8,5c0.9,1.2,4.2,5,7.8,5s6.9-3.8,7.8-5C18.9,10.8,15.6,7,12,7z"/>
</g>
<circle cx="12" cy="12" r="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 718 B

+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<polygon points="16,12 14,12 14,14 10,14 10,10 12,10 12,8 10,8 10,3 8,3 8,8 3,8 3,10 8,10 8,14 3,14 3,16 8,16 8,21 10,21 10,16
14,16 14,21 16,21 16,16 21,16 21,14 16,14 "/>
<path d="M18.5,1C16,1,14,3,14,5.5s2,4.5,4.5,4.5S23,8,23,5.5S21,1,18.5,1z M17.5,7C17.5,7,17.5,7,17.5,7c-0.2-0.1-0.3-0.1-0.3-0.2
c-0.6-0.5-1.7-1.1-1.8-2c-0.1-0.7,0.8-1.6,1.3-2c0.8-0.6,2.3-1.1,3.2-0.5c0.6,0.4-1.2,1-1.4,1.3c-0.3,0.4-0.3,0.9-0.3,1.4
c0,0.5,0.1,1.2-0.2,1.6C17.9,6.9,17.7,7,17.5,7z M20.8,7.9c-0.4,0.3-0.9,0.2-1.3,0.5c-0.1,0.1-0.2,0.2-0.3,0.2
c-0.2,0.1-0.5-0.1-0.5-0.3c-0.3-0.8,0.3-1.2,0.9-1.3c0.3,0,0.7,0,1,0c0.2,0,0.4,0.1,0.4,0.3C21.1,7.5,20.9,7.7,20.8,7.9z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<path d="M12,2C6.5,2,2,6.5,2,12s4.5,10,10,10s10-4.5,10-10S17.5,2,12,2z M12,20c-4.4,0-8-3.6-8-8s3.6-8,8-8s8,3.6,8,8
S16.4,20,12,20z"/>
<g>
<polygon points="12.8,15.5 12.8,10 12.2,10 11.3,10 10,10 10,11 11.3,11.5 11.3,15.5 10,16 10,17 14,17 14,16 "/>
<circle cx="12" cy="8" r="1"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 749 B

+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<polygon points="12,7 12,7 8,11 4,7 4,7 4,7 2,7 2,17 4,17 4,9.8 8,13.8 12,9.8 12,17 14,17 14,7 12,7 "/>
<path d="M20,14V7h-2v7h-2l3,3c0.1,0,0.5-0.4,1-0.9c0.9-0.9,2-2.1,2-2.1H20z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 637 B

+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path d="M20.6,5.6l-2.2-2.2C18,3,17.5,2.8,17,2.8S16,3,15.6,3.4L3,16v5h5L20.6,8.4C21.4,7.6,21.4,6.4,20.6,5.6z M7.2,19H5v-2.2
l9.2-9.2l2.2,2.2L7.2,19z M15.6,6.2L17,4.8c0,0,0,0,0,0L19.2,7l-1.4,1.4L15.6,6.2z"/>
</svg>

After

Width:  |  Height:  |  Size: 652 B

+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path d="M13.8,4.5l0.7,0.7l-3.4,3.4L7.7,9.7l-1-1l-1.4,1.4l3.5,3.5l-5.7,5.7l1.4,1.4l5.7-5.7l3.5,3.5l1.4-1.4l-1-1l1.1-3.4l3.4-3.4
l0.7,0.7l1.4-1.4l-5.7-5.7L13.8,4.5z M13.7,11.8l-1,2.9l-3.4-3.4l2.9-1l3.7-3.7l1.4,1.4L13.7,11.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 672 B

+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path d="M12,2L3,6v7c0,5,4,9,9,9c5,0,9-4,9-9V6L12,2z M19,13c0,3.9-3.1,7-7,7s-7-3.1-7-7V7.3l7-3.1l7,3.1V13z"/>
</svg>

After

Width:  |  Height:  |  Size: 554 B

+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<path d="M12,2L3,6v7c0,5,4,9,9,9c5,0,9-4,9-9V6L12,2z M19,13c0,3.9-3.1,7-7,7s-7-3.1-7-7V7.3l7-3.1l7,3.1V13z"/>
<circle cx="12" cy="9" r="2"/>
<path d="M15,16H9v-1c0-1.7,1.3-3,3-3h0c1.7,0,3,1.3,3,3V16z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 659 B

+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<path d="M15.4,13.7L14,14l-0.2,1.4c-0.4,2.8-1.3,4.2-1.7,4.6c-0.4-0.3-1.3-1.8-1.7-4.6L10,14l-1.4-0.2c-2.8-0.4-4.2-1.3-4.6-1.7
c0.3-0.4,1.8-1.3,4.6-1.7L10,10l0.2-1.4c0.4-2.8,1.3-4.2,1.7-4.6V2c-1.7,0-3.1,2.6-3.7,6.3C4.6,8.9,2,10.3,2,12s2.6,3.1,6.3,3.7
c0.6,3.7,2,6.3,3.7,6.3s3.1-2.6,3.7-6.3c3.7-0.6,6.3-2,6.3-3.7h-2.1C19.6,12.4,18.2,13.3,15.4,13.7z"/>
<path d="M18.5,1C16,1,14,3,14,5.5s2,4.5,4.5,4.5S23,8,23,5.5S21,1,18.5,1z M17.5,7C17.5,7,17.5,7,17.5,7c-0.2-0.1-0.3-0.1-0.3-0.2
c-0.6-0.5-1.7-1.1-1.8-2c-0.1-0.7,0.8-1.6,1.3-2c0.8-0.6,2.3-1.1,3.2-0.5c0.6,0.4-1.2,1-1.4,1.3c-0.3,0.4-0.3,0.9-0.3,1.4
c0,0.5,0.1,1.2-0.2,1.6C17.9,6.9,17.7,7,17.5,7z M20.8,7.9c-0.4,0.3-0.9,0.2-1.3,0.5c-0.1,0.1-0.2,0.2-0.3,0.2
c-0.2,0.1-0.5-0.1-0.5-0.3c-0.3-0.8,0.3-1.2,0.9-1.3c0.3,0,0.7,0,1,0c0.2,0,0.4,0.1,0.4,0.3C21.1,7.5,20.9,7.7,20.8,7.9z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+8
View File
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<path d="M12,6.7l1.7,3.7l4.1,0.6l-3,3.1l0.7,4.2l-3.5-2l-3.5,2l0.7-4.2l-3-3.1l4.1-0.6L12,6.7 M12,2L8.9,8.6L2,9.6l5,5.1L5.8,22
l6.2-3.4l6.2,3.4L17,14.8l5-5.1l-6.9-1.1L12,2L12,2z"/>
</svg>

After

Width:  |  Height:  |  Size: 624 B

+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 24 24" enable-background="new 0 0 24 24" xml:space="preserve">
<g>
<g>
<polygon fill="#7F7F7F" points="20,7 20,5 18,5 18,7 16,7 16,5 18,5 18,3 16,3 16,2 3,2 3,22 11,22 11,20 19,12 21,12 21,7 "/>
<polygon fill="#7F7F7F" points="19,16 21,16 21,22 15,22 15,20 19,20 "/>
</g>
<polygon fill="#6FBEFF" points="19,9 14,9 14,4 5,4 5,20 11,20 13,20 13,18 15,18 15,16 17,16 17,14 19,14 "/>
<polygon fill="#FFFFFF" points="7,10 12,10 12,8 10,8 10,7 8,7 8,8 7,8 "/>
<g>
<rect x="17" y="18" fill="#00C72C" width="2" height="2"/>
<polygon fill="#00C72C" points="5,20 5,18 7,18 7,16 9,16 9,14 11,14 11,12 13,12 13,14 15,14 15,18 13,18 13,20 "/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+17 -10
View File
@@ -1,35 +1,40 @@
import React, { useState, useEffect } from 'react';
import React from 'react';
import PropTypes from 'prop-types';
import './Avatar.scss';
import { twemojify } from '../../../util/twemojify';
import Text from '../text/Text';
import RawIcon from '../system-icons/RawIcon';
import ImageBrokenSVG from '../../../../public/res/svg/image-broken.svg';
function Avatar({
text, bgColor, iconSrc, imageSrc, size,
text, bgColor, iconSrc, iconColor, imageSrc, size,
}) {
const [image, updateImage] = useState(imageSrc);
let textSize = 's1';
if (size === 'large') textSize = 'h1';
if (size === 'small') textSize = 'b1';
if (size === 'extra-small') textSize = 'b3';
useEffect(() => updateImage(imageSrc), [imageSrc]);
return (
<div className={`avatar-container avatar-container__${size} noselect`}>
{
image !== null
? <img src={image} onError={() => updateImage(null)} alt="avatar" />
imageSrc !== null
? <img draggable="false" src={imageSrc} onError={(e) => { e.target.src = ImageBrokenSVG; }} alt="avatar" />
: (
<span
style={{ backgroundColor: iconSrc === null ? bgColor : 'transparent' }}
className={`avatar__border${iconSrc !== null ? ' avatar__bordered' : ''} inline-flex--center`}
className={`avatar__border${iconSrc !== null ? '--active' : ''}`}
>
{
iconSrc !== null
? <RawIcon size={size} src={iconSrc} />
: text !== null && <Text variant={textSize}>{text}</Text>
? <RawIcon size={size} src={iconSrc} color={iconColor} />
: text !== null && (
<Text variant={textSize} primary>
{twemojify([...text][0])}
</Text>
)
}
</span>
)
@@ -42,6 +47,7 @@ Avatar.defaultProps = {
text: null,
bgColor: 'transparent',
iconSrc: null,
iconColor: null,
imageSrc: null,
size: 'normal',
};
@@ -50,6 +56,7 @@ Avatar.propTypes = {
text: PropTypes.string,
bgColor: PropTypes.string,
iconSrc: PropTypes.string,
iconColor: PropTypes.string,
imageSrc: PropTypes.string,
size: PropTypes.oneOf(['large', 'normal', 'small', 'extra-small']),
};
+10 -7
View File
@@ -1,3 +1,5 @@
@use '../../partials/flex';
.avatar-container {
display: inline-flex;
width: 42px;
@@ -24,19 +26,16 @@
height: var(--av-extra-small);
}
img {
> img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: inherit;
}
.avatar__bordered {
box-shadow: var(--bs-surface-border);
}
.avatar__border {
@extend .cp-fx__row--c-c;
position: absolute;
top: 0;
left: 0;
@@ -46,7 +45,11 @@
border-radius: inherit;
.text {
color: var(--tc-primary-high);
color: white;
}
&--active {
@extend .avatar__border;
box-shadow: var(--bs-surface-border);
}
}
}
+5 -4
View File
@@ -4,25 +4,26 @@ import './NotificationBadge.scss';
import Text from '../text/Text';
function NotificationBadge({ alert, children }) {
function NotificationBadge({ alert, content }) {
const notificationClass = alert ? ' notification-badge--alert' : '';
return (
<div className={`notification-badge${notificationClass}`}>
<Text variant="b3">{children}</Text>
{content !== null && <Text variant="b3" weight="bold">{content}</Text>}
</div>
);
}
NotificationBadge.defaultProps = {
alert: false,
content: null,
};
NotificationBadge.propTypes = {
alert: PropTypes.bool,
children: PropTypes.oneOfType([
content: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
]).isRequired,
]),
};
export default NotificationBadge;
+11 -8
View File
@@ -1,18 +1,21 @@
.notification-badge {
min-width: 18px;
padding: 1px var(--sp-ultra-tight);
background-color: var(--tc-surface-low);
border-radius: 9px;
min-width: 16px;
min-height: 8px;
padding: 0 var(--sp-ultra-tight);
background-color: var(--bg-badge);
border-radius: var(--bo-radius);
.text {
color: var(--bg-surface-low);
color: var(--tc-badge);
text-align: center;
}
&--alert {
background-color: var(--bg-positive);
.text {
color: white;
}
}
&:empty {
min-width: 8px;
margin: 0 var(--sp-ultra-tight);
}
}
+15 -9
View File
@@ -6,27 +6,32 @@ import Text from '../text/Text';
import RawIcon from '../system-icons/RawIcon';
import { blurOnBubbling } from './script';
function Button({
id, variant, iconSrc, type, onClick, children, disabled,
}) {
const Button = React.forwardRef(({
id, className, variant, iconSrc,
type, onClick, children, disabled,
}, ref) => {
const iconClass = (iconSrc === null) ? '' : `btn-${variant}--icon`;
return (
<button
ref={ref}
id={id === '' ? undefined : id}
className={`btn-${variant} ${iconClass} noselect`}
className={`${className ? `${className} ` : ''}btn-${variant} ${iconClass} noselect`}
onMouseUp={(e) => blurOnBubbling(e, `.btn-${variant}`)}
onClick={onClick}
type={type === 'button' ? 'button' : 'submit'}
// eslint-disable-next-line react/button-has-type
type={type}
disabled={disabled}
>
{iconSrc !== null && <RawIcon size="small" src={iconSrc} />}
<Text variant="b1">{ children }</Text>
{typeof children === 'string' && <Text variant="b1">{ children }</Text>}
{typeof children !== 'string' && children }
</button>
);
}
});
Button.defaultProps = {
id: '',
className: null,
variant: 'surface',
iconSrc: null,
type: 'button',
@@ -36,9 +41,10 @@ Button.defaultProps = {
Button.propTypes = {
id: PropTypes.string,
variant: PropTypes.oneOf(['surface', 'primary', 'caution', 'danger']),
className: PropTypes.string,
variant: PropTypes.oneOf(['surface', 'primary', 'positive', 'caution', 'danger']),
iconSrc: PropTypes.string,
type: PropTypes.oneOf(['button', 'submit']),
type: PropTypes.oneOf(['button', 'submit', 'reset']),
onClick: PropTypes.func,
children: PropTypes.node.isRequired,
disabled: PropTypes.bool,
+11 -19
View File
@@ -1,7 +1,9 @@
@use 'state';
@use '../../partials/dir';
.btn-surface,
.btn-primary,
.btn-positive,
.btn-caution,
.btn-danger {
display: inline-flex;
@@ -17,27 +19,10 @@
@include state.disabled;
&--icon {
padding: {
left: var(--sp-tight);
right: var(--sp-loose);
}
[dir=rtl] & {
padding: {
left: var(--sp-loose);
right: var(--sp-tight);
}
}
@include dir.side(padding, var(--sp-tight), var(--sp-loose));
.ic-raw {
margin-right: var(--sp-extra-tight);
[dir=rtl] & {
margin: {
right: 0;
left: var(--sp-extra-tight);
}
}
@include dir.side(margin, 0, var(--sp-extra-tight));
}
}
}
@@ -67,6 +52,13 @@
@include state.focus(var(--bs-primary-outline));
@include state.active(var(--bg-primary-active));
}
.btn-positive {
box-shadow: var(--bs-positive-border);
@include color(var(--tc-positive-high), var(--ic-positive-normal));
@include state.hover(var(--bg-positive-hover));
@include state.focus(var(--bs-positive-outline));
@include state.active(var(--bg-positive-active));
}
.btn-caution {
box-shadow: var(--bs-caution-border);
@include color(var(--tc-caution-high), var(--ic-caution-normal));
+35
View File
@@ -0,0 +1,35 @@
import React from 'react';
import PropTypes from 'prop-types';
import './Checkbox.scss';
function Checkbox({
variant, isActive, onToggle, disabled,
}) {
const className = `checkbox checkbox-${variant}${isActive ? ' checkbox--active' : ''}`;
if (onToggle === null) return <span className={className} />;
return (
// eslint-disable-next-line jsx-a11y/control-has-associated-label
<button
onClick={() => onToggle(!isActive)}
className={className}
type="button"
disabled={disabled}
/>
);
}
Checkbox.defaultProps = {
variant: 'primary',
isActive: false,
onToggle: null,
disabled: false,
};
Checkbox.propTypes = {
variant: PropTypes.oneOf(['primary', 'positive', 'caution', 'danger']),
isActive: PropTypes.bool,
onToggle: PropTypes.func,
disabled: PropTypes.bool,
};
export default Checkbox;
+39
View File
@@ -0,0 +1,39 @@
@use '../../partials/flex';
@use './state';
.checkbox {
width: 20px;
height: 20px;
border-radius: calc(var(--bo-radius) / 2);
background-color: var(--bg-surface-border);
box-shadow: var(--bs-surface-border);
cursor: pointer;
@include state.disabled;
@extend .cp-fx__row--c-c;
&--active {
background-color: black;
&::before {
content: "";
display: inline-block;
width: 12px;
height: 6px;
border: 6px solid white;
border-width: 0 0 3px 3px;
transform: rotateZ(-45deg) translate(1px, -1px);
}
}
}
.checkbox-primary.checkbox--active {
background-color: var(--bg-primary);
}
.checkbox-positive.checkbox--active {
background-color: var(--bg-positive);
}
.checkbox-caution.checkbox--active {
background-color: var(--bg-caution);
}
.checkbox-danger.checkbox--active {
background-color: var(--bg-danger);
}
+32 -27
View File
@@ -2,59 +2,64 @@ import React from 'react';
import PropTypes from 'prop-types';
import './IconButton.scss';
import Tippy from '@tippyjs/react';
import RawIcon from '../system-icons/RawIcon';
import Tooltip from '../tooltip/Tooltip';
import { blurOnBubbling } from './script';
import Text from '../text/Text';
// TODO:
// 1. [done] an icon only button have "src"
// 2. have multiple variant
// 3. [done] should have a smart accessibility "label" arial-label
// 4. [done] have size as RawIcon
const IconButton = React.forwardRef(({
variant, size, type,
tooltip, tooltipPlacement, src, onClick,
}, ref) => (
<Tippy
content={<Text variant="b2">{tooltip}</Text>}
className="ic-btn-tippy"
touch="hold"
arrow={false}
maxWidth={250}
placement={tooltipPlacement}
delay={[0, 0]}
duration={[100, 0]}
>
tooltip, tooltipPlacement, src,
onClick, tabIndex, disabled, isImage,
}, ref) => {
const btn = (
<button
ref={ref}
className={`ic-btn-${variant}`}
className={`ic-btn ic-btn-${variant}`}
onMouseUp={(e) => blurOnBubbling(e, `.ic-btn-${variant}`)}
onClick={onClick}
type={type === 'button' ? 'button' : 'submit'}
// eslint-disable-next-line react/button-has-type
type={type}
tabIndex={tabIndex}
disabled={disabled}
>
<RawIcon size={size} src={src} />
<RawIcon size={size} src={src} isImage={isImage} />
</button>
</Tippy>
));
);
if (tooltip === null) return btn;
return (
<Tooltip
placement={tooltipPlacement}
content={<Text variant="b2">{tooltip}</Text>}
>
{btn}
</Tooltip>
);
});
IconButton.defaultProps = {
variant: 'surface',
size: 'normal',
type: 'button',
tooltip: null,
tooltipPlacement: 'top',
onClick: null,
tabIndex: 0,
disabled: false,
isImage: false,
};
IconButton.propTypes = {
variant: PropTypes.oneOf(['surface']),
variant: PropTypes.oneOf(['surface', 'primary', 'positive', 'caution', 'danger']),
size: PropTypes.oneOf(['normal', 'small', 'extra-small']),
type: PropTypes.oneOf(['button', 'submit']),
tooltip: PropTypes.string.isRequired,
type: PropTypes.oneOf(['button', 'submit', 'reset']),
tooltip: PropTypes.string,
tooltipPlacement: PropTypes.oneOf(['top', 'right', 'bottom', 'left']),
src: PropTypes.string.isRequired,
onClick: PropTypes.func,
tabIndex: PropTypes.number,
disabled: PropTypes.bool,
isImage: PropTypes.bool,
};
export default IconButton;
+25 -14
View File
@@ -1,9 +1,6 @@
@use 'state';
.ic-btn-surface,
.ic-btn-primary,
.ic-btn-caution,
.ic-btn-danger {
.ic-btn {
padding: var(--sp-extra-tight);
border: none;
border-radius: var(--bo-radius);
@@ -32,14 +29,28 @@
@include focus(var(--bg-surface-hover));
@include state.active(var(--bg-surface-active));
}
.ic-btn-tippy {
padding: var(--sp-extra-tight) var(--sp-normal);
background-color: var(--bg-tooltip);
border-radius: var(--bo-radius);
box-shadow: var(--bs-popup);
.text {
color: var(--tc-tooltip);
}
.ic-btn-primary {
@include color(var(--ic-primary-normal));
@include state.hover(var(--bg-primary-hover));
@include focus(var(--bg-primary-hover));
@include state.active(var(--bg-primary-active));
background-color: var(--bg-primary);
}
.ic-btn-positive {
@include color(var(--ic-positive-normal));
@include state.hover(var(--bg-positive-hover));
@include focus(var(--bg-positive-hover));
@include state.active(var(--bg-positive-active));
}
.ic-btn-caution {
@include color(var(--ic-caution-normal));
@include state.hover(var(--bg-caution-hover));
@include focus(var(--bg-caution-hover));
@include state.active(var(--bg-caution-active));
}
.ic-btn-danger {
@include color(var(--ic-danger-normal));
@include state.hover(var(--bg-danger-hover));
@include focus(var(--bg-danger-hover));
@include state.active(var(--bg-danger-active));
}
+30
View File
@@ -0,0 +1,30 @@
import React from 'react';
import PropTypes from 'prop-types';
import './RadioButton.scss';
function RadioButton({ isActive, onToggle, disabled }) {
if (onToggle === null) return <span className={`radio-btn${isActive ? ' radio-btn--active' : ''}`} />;
return (
// eslint-disable-next-line jsx-a11y/control-has-associated-label
<button
onClick={() => onToggle(!isActive)}
className={`radio-btn${isActive ? ' radio-btn--active' : ''}`}
type="button"
disabled={disabled}
/>
);
}
RadioButton.defaultProps = {
isActive: false,
onToggle: null,
disabled: false,
};
RadioButton.propTypes = {
isActive: PropTypes.bool,
onToggle: PropTypes.func,
disabled: PropTypes.bool,
};
export default RadioButton;
+28
View File
@@ -0,0 +1,28 @@
@use '../../partials/flex';
@use './state';
.radio-btn {
@extend .cp-fx__row--c-c;
width: 20px;
height: 20px;
border-radius: 50%;
background-color: var(--bg-surface-border);
border: 2px solid var(--bg-surface-border);
cursor: pointer;
@include state.disabled;
&::before {
content: '';
display: inline-block;
width: 12px;
height: 12px;
background-color: var(--bg-surface-border);
border-radius: 50%;
}
&--active {
border: 2px solid var(--bg-positive);
&::before {
background-color: var(--bg-positive);
}
}
}
+9 -3
View File
@@ -2,24 +2,30 @@ import React from 'react';
import PropTypes from 'prop-types';
import './Toggle.scss';
function Toggle({ isActive, onToggle }) {
function Toggle({ isActive, onToggle, disabled }) {
const className = `toggle${isActive ? ' toggle--active' : ''}`;
if (onToggle === null) return <span className={className} />;
return (
// eslint-disable-next-line jsx-a11y/control-has-associated-label
<button
onClick={() => onToggle(!isActive)}
className={`toggle${isActive ? ' toggle--active' : ''}`}
className={className}
type="button"
disabled={disabled}
/>
);
}
Toggle.defaultProps = {
isActive: false,
disabled: false,
onToggle: null,
};
Toggle.propTypes = {
isActive: PropTypes.bool,
onToggle: PropTypes.func.isRequired,
onToggle: PropTypes.func,
disabled: PropTypes.bool,
};
export default Toggle;
+10 -6
View File
@@ -1,3 +1,6 @@
@use '../../partials/dir';
@use './state';
.toggle {
width: 44px;
height: 24px;
@@ -8,6 +11,7 @@
box-shadow: var(--bs-surface-border);
cursor: pointer;
background-color: var(--bg-surface-low);
@include state.disabled;
transition: background 200ms ease-in-out;
@@ -27,13 +31,13 @@
background-color: var(--bg-positive);
&::before {
background-color: white;
transform: translateX(calc(125%));
opacity: 1;
--ltr: translateX(calc(125%));
--rtl: translateX(calc(-125%));
@include dir.prop(transform, var(--ltr), var(--rtl));
[dir=rtl] & {
transform: translateX(calc(-125%));
}
transform: translateX(calc(125%));
background-color: white;
opacity: 1;
}
}
}
+37
View File
@@ -0,0 +1,37 @@
import React from 'react';
import PropTypes from 'prop-types';
import './Chip.scss';
import Text from '../text/Text';
import RawIcon from '../system-icons/RawIcon';
function Chip({
iconSrc, iconColor, text, children,
onClick,
}) {
return (
<button className="chip" type="button" onClick={onClick}>
{iconSrc != null && <RawIcon src={iconSrc} color={iconColor} size="extra-small" />}
{(text != null && text !== '') && <Text variant="b3">{text}</Text>}
{children}
</button>
);
}
Chip.propTypes = {
iconSrc: PropTypes.string,
iconColor: PropTypes.string,
text: PropTypes.string,
children: PropTypes.element,
onClick: PropTypes.func,
};
Chip.defaultProps = {
iconSrc: null,
iconColor: null,
text: null,
children: null,
onClick: null,
};
export default Chip;
+31
View File
@@ -0,0 +1,31 @@
@use '../../partials/dir';
.chip {
padding: var(--sp-ultra-tight) var(--sp-extra-tight);
display: inline-flex;
flex-direction: row;
align-items: center;
background: var(--bg-surface-low);
border-radius: var(--bo-radius);
box-shadow: var(--bs-surface-border);
cursor: pointer;
@media (hover: hover) {
&:hover {
background-color: var(--bg-surface-hover);
}
}
& > .text {
flex: 1;
color: var(--tc-surface-high);
}
& > .ic-raw {
width: 16px;
height: 16px;
@include dir.side(margin, 0, var(--sp-ultra-tight));
}
}
+20 -8
View File
@@ -1,4 +1,4 @@
import React, { useState } from 'react';
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import './ContextMenu.scss';
@@ -10,12 +10,16 @@ import Button from '../button/Button';
import ScrollView from '../scroll/ScrollView';
function ContextMenu({
content, placement, maxWidth, render,
content, placement, maxWidth, render, afterToggle,
}) {
const [isVisible, setVisibility] = useState(false);
const showMenu = () => setVisibility(true);
const hideMenu = () => setVisibility(false);
useEffect(() => {
if (afterToggle !== null) afterToggle(isVisible);
}, [isVisible]);
return (
<Tippy
animation="scale-extreme"
@@ -27,6 +31,7 @@ function ContextMenu({
interactive
arrow={false}
maxWidth={maxWidth}
duration={200}
>
{render(isVisible ? hideMenu : showMenu)}
</Tippy>
@@ -36,6 +41,7 @@ function ContextMenu({
ContextMenu.defaultProps = {
maxWidth: 'unset',
placement: 'right',
afterToggle: null,
};
ContextMenu.propTypes = {
@@ -49,6 +55,7 @@ ContextMenu.propTypes = {
PropTypes.number,
]),
render: PropTypes.func.isRequired,
afterToggle: PropTypes.func,
};
function MenuHeader({ children }) {
@@ -60,11 +67,12 @@ function MenuHeader({ children }) {
}
MenuHeader.propTypes = {
children: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
};
function MenuItem({
variant, iconSrc, type, onClick, children,
variant, iconSrc, type,
onClick, children, disabled,
}) {
return (
<div className="context-menu__item">
@@ -73,6 +81,7 @@ function MenuItem({
iconSrc={iconSrc}
type={type}
onClick={onClick}
disabled={disabled}
>
{ children }
</Button>
@@ -82,16 +91,19 @@ function MenuItem({
MenuItem.defaultProps = {
variant: 'surface',
iconSrc: 'none',
iconSrc: null,
type: 'button',
disabled: false,
onClick: null,
};
MenuItem.propTypes = {
variant: PropTypes.oneOf(['surface', 'caution', 'danger']),
variant: PropTypes.oneOf(['surface', 'positive', 'caution', 'danger']),
iconSrc: PropTypes.string,
type: PropTypes.oneOf(['button', 'submit']),
onClick: PropTypes.func.isRequired,
children: PropTypes.string.isRequired,
onClick: PropTypes.func,
children: PropTypes.node.isRequired,
disabled: PropTypes.bool,
};
function MenuBorder() {
+25 -15
View File
@@ -1,3 +1,7 @@
@use '../../partials/flex';
@use '../../partials/text';
@use '../../partials/dir';
.context-menu {
background-color: var(--bg-surface);
box-shadow: var(--bs-popup);
@@ -22,46 +26,52 @@
.context-menu__header {
height: 34px;
padding: 0 var(--sp-tight);
padding: 0 var(--sp-normal);
margin-bottom: var(--sp-ultra-tight);
display: flex;
align-items: center;
border-bottom: 1px solid var(--bg-surface-border);
.text {
@extend .cp-txt__ellipsis;
color: var(--tc-surface-low);
}
&:not(:first-child) {
margin-top: var(--sp-normal);
margin-top: var(--sp-extra-tight);
border-top: 1px solid var(--bg-surface-border);
}
}
.context-menu__item {
display: flex;
button[class^="btn"] {
width: 100%;
justify-content: start;
@extend .cp-fx__item-one;
justify-content: flex-start;
border-radius: 0;
box-shadow: none;
white-space: nowrap;
padding: var(--sp-extra-tight) var(--sp-normal);
& > .ic-raw {
@include dir.side(margin, 0, var(--sp-tight));
}
// if item doesn't have icon
.text:first-child {
margin: {
left: calc(var(--ic-small) + var(--sp-ultra-tight));
right: var(--sp-extra-tight);
}
[dir=rtl] & {
margin: {
left: var(--sp-extra-tight);
right: calc(var(--ic-small) + var(--sp-ultra-tight));
}
}
@include dir.side(
margin,
calc(var(--ic-small) + var(--sp-tight)),
0
);
}
}
.btn-surface:focus {
background-color: var(--bg-surface-hover);
}
.btn-positive:focus {
background-color: var(--bg-positive-hover);
}
.btn-caution:focus {
background-color: var(--bg-caution-hover);
}
@@ -0,0 +1,87 @@
import React, { useState, useEffect, useRef } from 'react';
import cons from '../../../client/state/cons';
import navigation from '../../../client/state/navigation';
import ContextMenu from './ContextMenu';
let key = null;
function ReusableContextMenu() {
const [data, setData] = useState(null);
const openerRef = useRef(null);
const closeMenu = () => {
key = null;
if (data) openerRef.current.click();
};
useEffect(() => {
if (data) {
const { cords } = data;
openerRef.current.style.transform = `translate(${cords.x}px, ${cords.y}px)`;
openerRef.current.style.width = `${cords.width}px`;
openerRef.current.style.height = `${cords.height}px`;
openerRef.current.click();
}
const handleContextMenuOpen = (placement, cords, render, afterClose) => {
if (key) {
closeMenu();
return;
}
setData({
placement, cords, render, afterClose,
});
};
navigation.on(cons.events.navigation.REUSABLE_CONTEXT_MENU_OPENED, handleContextMenuOpen);
return () => {
navigation.removeListener(
cons.events.navigation.REUSABLE_CONTEXT_MENU_OPENED,
handleContextMenuOpen,
);
};
}, [data]);
const handleAfterToggle = (isVisible) => {
if (isVisible) {
key = Math.random();
return;
}
data?.afterClose?.();
if (setData) setData(null);
if (key === null) return;
const copyKey = key;
setTimeout(() => {
if (key === copyKey) key = null;
}, 200);
};
return (
<ContextMenu
afterToggle={handleAfterToggle}
placement={data?.placement || 'right'}
content={data?.render(closeMenu) ?? ''}
render={(toggleMenu) => (
<input
ref={openerRef}
onClick={toggleMenu}
type="button"
style={{
width: '32px',
height: '32px',
backgroundColor: 'transparent',
position: 'fixed',
top: 0,
left: 0,
padding: 0,
border: 'none',
visibility: 'hidden',
appearance: 'none',
}}
/>
)}
/>
);
}
export default ReusableContextMenu;
+8 -9
View File
@@ -4,26 +4,25 @@ import './Divider.scss';
import Text from '../text/Text';
function Divider({ text, variant }) {
const dividerClass = ` divider--${variant}`;
function Divider({ text, variant, align }) {
const dividerClass = ` divider--${variant} divider--${align}`;
return (
<div className={`divider${dividerClass}`}>
{text !== false && <Text className="divider__text" variant="b3">{text}</Text>}
{text !== null && <Text className="divider__text" variant="b3" weight="bold">{text}</Text>}
</div>
);
}
Divider.defaultProps = {
text: false,
text: null,
variant: 'surface',
align: 'center',
};
Divider.propTypes = {
text: PropTypes.oneOfType([
PropTypes.string,
PropTypes.bool,
]),
variant: PropTypes.oneOf(['surface', 'primary', 'caution', 'danger']),
text: PropTypes.string,
variant: PropTypes.oneOf(['surface', 'primary', 'positive', 'caution', 'danger']),
align: PropTypes.oneOf(['left', 'center', 'right']),
};
export default Divider;
+39 -39
View File
@@ -1,68 +1,68 @@
.divider {
--local-divider-color: var(--bg-surface-border);
.divider-line {
content: '';
display: inline-block;
flex: 1;
border-bottom: 1px solid var(--local-divider-color);
opacity: var(--local-divider-opacity);
}
margin: var(--sp-extra-tight) var(--sp-normal);
margin-right: var(--sp-extra-tight);
.divider {
display: flex;
align-items: center;
position: relative;
&::before {
content: "";
display: inline-block;
flex: 1;
margin-left: calc(var(--av-small) + var(--sp-tight));
border-bottom: 1px solid var(--local-divider-color);
opacity: 0.18;
[dir=rtl] & {
margin: {
left: 0;
right: calc(var(--av-small) + var(--sp-tight));
}
}
&--center::before,
&--right::before {
@extend .divider-line;
}
&--center::after,
&--left::after {
@extend .divider-line;
}
&__text {
margin-left: var(--sp-normal);
}
[dir=rtl] & {
margin: {
left: var(--sp-extra-tight);
right: var(--sp-normal);
}
&__text {
margin: {
left: 0;
right: var(--sp-normal);
}
}
padding: 2px var(--sp-extra-tight);
border-radius: calc(var(--bo-radius) / 2);
}
}
.divider--surface {
--local-divider-color: var(--tc-surface-low);
--local-divider-color: var(--bg-divider);
--local-divider-opacity: 1;
.divider__text {
color: var(--tc-surface-low);
border: 1px solid var(--bg-divider);
}
}
.divider--primary {
--local-divider-color: var(--bg-primary);
--local-divider-opacity: .8;
.divider__text {
color: var(--bg-primary);
color: var(--tc-primary-high);
background-color: var(--bg-primary);
}
}
.divider--positive {
--local-divider-color: var(--bg-positive);
--local-divider-opacity: .8;
.divider__text {
color: var(--bg-surface);
background-color: var(--bg-positive);
}
}
.divider--danger {
--local-divider-color: var(--bg-danger);
--local-divider-opacity: .8;
.divider__text {
color: var(--bg-danger);
color: var(--bg-surface);
background-color: var(--bg-danger);
}
}
.divider--caution {
--local-divider-color: var(--bg-caution);
--local-divider-opacity: .8;
.divider__text {
color: var(--bg-caution);
color: var(--bg-surface);
background-color: var(--bg-caution);
}
}
}
+11 -31
View File
@@ -1,63 +1,43 @@
@use '../../partials/text';
@use '../../partials/dir';
.header {
padding: {
left: var(--sp-normal);
right: var(--sp-extra-tight);
}
@include dir.side(padding, var(--sp-normal), var(--sp-extra-tight));
width: 100%;
height: var(--header-height);
border-bottom: 1px solid var(--bg-surface-border);
display: flex;
align-items: center;
[dir=rtl] & {
padding: {
left: var(--sp-extra-tight);
right: var(--sp-normal);
}
}
&__title-wrapper {
flex: 1;
min-width: 0;
display: flex;
align-items: center;
margin: 0 var(--sp-tight);
&:first-child {
margin-left: 0;
[dir=rtl] & {
margin-right: 0;
}
@include dir.side(margin, 0, var(--sp-tight));
}
& > .text:first-child {
@extend .cp-txt__ellipsis;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
& > .text-b3{
flex: 1;
min-width: 0;
margin-top: var(--sp-ultra-tight);
margin-left: var(--sp-tight);
padding-left: var(--sp-tight);
border-left: 1px solid var(--bg-surface-border);
@include dir.side(margin, var(--sp-tight), 0);
@include dir.side(padding, var(--sp-tight), 0);
@include dir.side(border, 1px solid var(--bg-surface-border), none);
max-height: calc(2 * var(--lh-b3));
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
display: -webkit-box;
[dir=rtl] & {
margin-left: 0;
padding-left: 0;
border-left: none;
margin-right: var(--sp-tight);
padding-right: var(--sp-tight);
border-right: 1px solid var(--bg-surface-border);
}
}
}
}
+14 -1
View File
@@ -5,9 +5,10 @@ import './Input.scss';
import TextareaAutosize from 'react-autosize-textarea';
function Input({
id, label, value, placeholder,
id, label, name, value, placeholder,
required, type, onChange, forwardRef,
resizable, minHeight, onResize, state,
onKeyDown, disabled,
}) {
return (
<div className="input-container">
@@ -16,6 +17,7 @@ function Input({
? (
<TextareaAutosize
style={{ minHeight: `${minHeight}px` }}
name={name}
id={id}
className={`input input--resizable${state !== 'normal' ? ` input--${state}` : ''}`}
ref={forwardRef}
@@ -26,11 +28,14 @@ function Input({
autoComplete="off"
onChange={onChange}
onResize={onResize}
onKeyDown={onKeyDown}
disabled={disabled}
/>
) : (
<input
ref={forwardRef}
id={id}
name={name}
className={`input ${state !== 'normal' ? ` input--${state}` : ''}`}
type={type}
placeholder={placeholder}
@@ -38,6 +43,8 @@ function Input({
defaultValue={value}
autoComplete="off"
onChange={onChange}
onKeyDown={onKeyDown}
disabled={disabled}
/>
)}
</div>
@@ -46,6 +53,7 @@ function Input({
Input.defaultProps = {
id: null,
name: '',
label: '',
value: '',
placeholder: '',
@@ -57,10 +65,13 @@ Input.defaultProps = {
minHeight: 46,
onResize: null,
state: 'normal',
onKeyDown: null,
disabled: false,
};
Input.propTypes = {
id: PropTypes.string,
name: PropTypes.string,
label: PropTypes.string,
value: PropTypes.string,
placeholder: PropTypes.string,
@@ -72,6 +83,8 @@ Input.propTypes = {
minHeight: PropTypes.number,
onResize: PropTypes.func,
state: PropTypes.oneOf(['normal', 'success', 'error']),
onKeyDown: PropTypes.func,
disabled: PropTypes.bool,
};
export default Input;
+12
View File
@@ -1,7 +1,10 @@
@use '../../atoms/scroll/scrollbar';
.input {
display: block;
width: 100%;
min-width: 0px;
margin: 0;
padding: var(--sp-tight) var(--sp-normal);
background-color: var(--bg-surface-low);
color: var(--tc-surface-normal);
@@ -12,6 +15,11 @@
letter-spacing: var(--ls-b2);
line-height: var(--lh-b2);
:disabled {
opacity: 0.4;
cursor: no-drop;
}
&__label {
display: inline-block;
margin-bottom: var(--sp-ultra-tight);
@@ -20,6 +28,10 @@
&--resizable {
resize: vertical !important;
overflow-y: auto !important;
@include scrollbar.scroll;
@include scrollbar.scroll__v;
@include scrollbar.scroll--auto-hide;
}
&--success {
border: 1px solid var(--bg-positive);
+5
View File
@@ -4,6 +4,8 @@ import './RawModal.scss';
import Modal from 'react-modal';
import navigation from '../../../client/state/navigation';
Modal.setAppElement('#root');
function RawModal({
@@ -23,6 +25,9 @@ function RawModal({
default:
modalClass += 'raw-modal__small ';
}
navigation.setIsRawModalVisible(isOpen);
const modalOverlayClass = (overlayClassName !== null) ? `${overlayClassName} ` : '';
return (
<Modal
+2 -2
View File
@@ -1,6 +1,6 @@
.ReactModal__Overlay {
opacity: 0;
transition: opacity 200ms cubic-bezier(0.13, 0.56, 0.25, 0.99);
transition: opacity 200ms var(--fluid-slide-up);
}
.ReactModal__Overlay--after-open{
opacity: 1;
@@ -11,7 +11,7 @@
.ReactModal__Content {
transform: translateY(100%);
transition: transform 200ms cubic-bezier(0.13, 0.56, 0.25, 0.99);
transition: transform 200ms var(--fluid-slide-up);
}
.ReactModal__Content--after-open{
+9
View File
@@ -1,9 +1,17 @@
@use '../../partials/dir';
@use '_scrollbar';
@mixin paddingForSafari($padding) {
@media not all and (min-resolution:.001dpcm) {
@include dir.side(padding, 0, $padding);
}
}
.scrollbar {
width: 100%;
height: 100%;
@include scrollbar.scroll;
@include paddingForSafari(var(--sp-extra-tight));
&__h {
@include scrollbar.scroll__h;
@@ -18,5 +26,6 @@
}
&--invisible {
@include scrollbar.scroll--invisible;
@include paddingForSafari(0);
}
}
+3
View File
@@ -32,6 +32,8 @@
@mixin scroll {
overflow: hidden;
// Below code stop scroll when x-scrollable content come in timeline
// overscroll-behavior: none;
@extend .firefox-scrollbar;
@extend .webkit-scrollbar;
@extend .webkit-scrollbar-track;
@@ -56,6 +58,7 @@
@mixin scroll--invisible {
-ms-overflow-style: none;
scrollbar-width: none;
&::-webkit-scrollbar {
display: none;
}
@@ -1,4 +1,4 @@
import React, { useState } from 'react';
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import './SegmentedControls.scss';
@@ -17,6 +17,10 @@ function SegmentedControls({
onSelect(segmentIndex);
}
useEffect(() => {
setSelect(selected);
}, [selected]);
return (
<div className="segmented-controls">
{
@@ -1,4 +1,5 @@
@use '../button/state';
@use '../../partials/dir';
.segmented-controls {
background-color: var(--bg-surface-low);
@@ -20,12 +21,7 @@
display: flex;
align-items: center;
justify-content: center;
border-left: 1px solid var(--bg-surface-border);
[dir=rtl] & {
border-left: none;
border-right: 1px solid var(--bg-surface-border);
}
@include dir.side(border, 1px solid var(--bg-surface-border), none);
& .text:nth-child(2) {
margin: 0 var(--sp-extra-tight);
+14 -5
View File
@@ -2,24 +2,33 @@ import React from 'react';
import PropTypes from 'prop-types';
import './RawIcon.scss';
function RawIcon({ color, size, src }) {
const style = {
WebkitMaskImage: `url(${src})`,
maskImage: `url(${src})`,
};
function RawIcon({
color, size, src, isImage,
}) {
const style = {};
if (color !== null) style.backgroundColor = color;
if (isImage) {
style.backgroundColor = 'transparent';
style.backgroundImage = `url(${src})`;
} else {
style.WebkitMaskImage = `url(${src})`;
style.maskImage = `url(${src})`;
}
return <span className={`ic-raw ic-raw-${size}`} style={style}> </span>;
}
RawIcon.defaultProps = {
color: null,
size: 'normal',
isImage: false,
};
RawIcon.propTypes = {
color: PropTypes.string,
size: PropTypes.oneOf(['large', 'normal', 'small', 'extra-small']),
src: PropTypes.string.isRequired,
isImage: PropTypes.bool,
};
export default RawIcon;
+3
View File
@@ -10,6 +10,9 @@
-webkit-mask-size: cover;
mask-size: cover;
background-color: var(--ic-surface-normal);
background-size: cover;
background-repeat: no-repeat;
}
.ic-raw-large {
@include icSize(var(--ic-large));
+87
View File
@@ -0,0 +1,87 @@
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import './Tabs.scss';
import Button from '../button/Button';
import ScrollView from '../scroll/ScrollView';
function TabItem({
selected, iconSrc,
onClick, children, disabled,
}) {
const isSelected = selected ? 'tab-item--selected' : '';
return (
<Button
className={`tab-item ${isSelected}`}
iconSrc={iconSrc}
onClick={onClick}
disabled={disabled}
>
{children}
</Button>
);
}
TabItem.defaultProps = {
selected: false,
iconSrc: null,
onClick: null,
disabled: false,
};
TabItem.propTypes = {
selected: PropTypes.bool,
iconSrc: PropTypes.string,
onClick: PropTypes.func,
children: PropTypes.node.isRequired,
disabled: PropTypes.bool,
};
function Tabs({ items, defaultSelected, onSelect }) {
const [selectedItem, setSelectedItem] = useState(items[defaultSelected]);
const handleTabSelection = (item, index) => {
if (selectedItem === item) return;
setSelectedItem(item);
onSelect(item, index);
};
return (
<div className="tabs">
<ScrollView horizontal vertical={false} invisible>
<div className="tabs__content">
{items.map((item, index) => (
<TabItem
key={item.text}
selected={selectedItem.text === item.text}
iconSrc={item.iconSrc}
disabled={item.disabled}
onClick={() => handleTabSelection(item, index)}
>
{item.text}
</TabItem>
))}
</div>
</ScrollView>
</div>
);
}
Tabs.defaultProps = {
defaultSelected: 0,
};
Tabs.propTypes = {
items: PropTypes.arrayOf(
PropTypes.exact({
iconSrc: PropTypes.string,
text: PropTypes.string,
disabled: PropTypes.bool,
}),
).isRequired,
defaultSelected: PropTypes.number,
onSelect: PropTypes.func.isRequired,
};
export { Tabs as default };
+45
View File
@@ -0,0 +1,45 @@
@use '../../partials/dir';
.tabs {
height: var(--header-height);
box-shadow: inset 0 -1px 0 var(--bg-surface-border);
&__content {
min-width: 100%;
height: 100%;
display: flex;
}
}
.tab-item {
flex-shrink: 0;
@include dir.side(padding, var(--sp-normal), 24px);
border-radius: 0;
height: 100%;
box-shadow: none;
border-radius: var(--bo-radius) var(--bo-radius) 0 0;
&:focus,
&:active {
background-color: var(--bg-surface-active);
box-shadow: none;
}
&--selected {
--bs-tab-selected: inset 0 -2px 0 var(--tc-surface-high);
box-shadow: var(--bs-tab-selected);
& .ic-raw {
background-color: var(--ic-surface-high);
}
& .text {
font-weight: var(--fw-medium);
}
&:focus,
&:active {
background-color: var(--bg-surface-active);
box-shadow: var(--bs-tab-selected);
}
}
}
+23 -9
View File
@@ -3,25 +3,39 @@ import PropTypes from 'prop-types';
import './Text.scss';
function Text({
id, className, variant, children,
className, style, variant, weight,
primary, span, children,
}) {
const cName = className !== '' ? `${className} ` : '';
if (variant === 'h1') return <h1 id={id === '' ? undefined : id} className={`${cName}text text-h1`}>{ children }</h1>;
if (variant === 'h2') return <h2 id={id === '' ? undefined : id} className={`${cName}text text-h2`}>{ children }</h2>;
if (variant === 's1') return <h4 id={id === '' ? undefined : id} className={`${cName}text text-s1`}>{ children }</h4>;
return <p id={id === '' ? undefined : id} className={`${cName}text text-${variant}`}>{ children }</p>;
const classes = [];
if (className) classes.push(className);
classes.push(`text text-${variant} text-${weight}`);
if (primary) classes.push('font-primary');
const textClass = classes.join(' ');
if (span) return <span className={textClass} style={style}>{ children }</span>;
if (variant === 'h1') return <h1 className={textClass} style={style}>{ children }</h1>;
if (variant === 'h2') return <h2 className={textClass} style={style}>{ children }</h2>;
if (variant === 's1') return <h4 className={textClass} style={style}>{ children }</h4>;
return <p className={textClass} style={style}>{ children }</p>;
}
Text.defaultProps = {
id: '',
className: '',
className: null,
style: null,
variant: 'b1',
weight: 'normal',
primary: false,
span: false,
};
Text.propTypes = {
id: PropTypes.string,
className: PropTypes.string,
style: PropTypes.shape({}),
variant: PropTypes.oneOf(['h1', 'h2', 's1', 'b1', 'b2', 'b3']),
weight: PropTypes.oneOf(['light', 'normal', 'medium', 'bold']),
primary: PropTypes.bool,
span: PropTypes.bool,
children: PropTypes.node.isRequired,
};
+36 -16
View File
@@ -1,41 +1,61 @@
@mixin font($type, $weight) {
@mixin font($type) {
font-size: var(--fs-#{$type});
font-weight: $weight;
letter-spacing: var(--ls-#{$type});
line-height: var(--lh-#{$type});
& img.emoji,
& img[data-mx-emoticon] {
height: calc(var(--lh-#{$type}) - .25rem);
}
}
%text {
.text {
margin: 0;
padding: 0;
color: var(--tc-surface-high);
& img.emoji,
& img[data-mx-emoticon] {
margin: 0 !important;
margin-right: 2px !important;
padding: 0 !important;
position: relative;
top: -.1rem;
vertical-align: middle;
}
}
.text-light {
font-weight: var(--fw-light);
}
.text-normal {
font-weight: var(--fw-normal);
}
.text-medium {
font-weight: var(--fw-medium);
}
.text-bold {
font-weight: var(--fw-bold);
}
.text-h1 {
@extend %text;
@include font(h1, 500);
@include font(h1);
}
.text-h2 {
@extend %text;
@include font(h2, 500);
@include font(h2);
}
.text-s1 {
@extend %text;
@include font(s1, 400);
@include font(s1);
}
.text-b1 {
@extend %text;
@include font(b1, 400);
@include font(b1);
color: var(--tc-surface-normal);
}
.text-b2 {
@extend %text;
@include font(b2, 400);
@include font(b2);
color: var(--tc-surface-normal);
}
.text-b3 {
@extend %text;
@include font(b3, 400);
@include font(b3);
color: var(--tc-surface-low);
}
+39
View File
@@ -0,0 +1,39 @@
import React from 'react';
import PropTypes from 'prop-types';
import './Tooltip.scss';
import Tippy from '@tippyjs/react';
function Tooltip({
className, placement, content, delay, children,
}) {
return (
<Tippy
content={content}
className={`tooltip ${className}`}
touch="hold"
arrow={false}
maxWidth={250}
placement={placement}
delay={delay}
duration={[100, 0]}
>
{children}
</Tippy>
);
}
Tooltip.defaultProps = {
placement: 'top',
className: '',
delay: [200, 0],
};
Tooltip.propTypes = {
className: PropTypes.string,
placement: PropTypes.string,
content: PropTypes.node.isRequired,
delay: PropTypes.arrayOf(PropTypes.number),
children: PropTypes.node.isRequired,
};
export default Tooltip;
+10
View File
@@ -0,0 +1,10 @@
.tooltip {
padding: var(--sp-extra-tight) var(--sp-normal);
background-color: var(--bg-tooltip);
border-radius: var(--bo-radius);
box-shadow: var(--bs-popup);
.text {
color: var(--tc-tooltip);
}
}
+10
View File
@@ -0,0 +1,10 @@
/* eslint-disable import/prefer-default-export */
import { useState } from 'react';
export function useForceUpdate() {
const [data, setData] = useState(null);
return [data, function forceUpdateHook() {
setData({});
}];
}
+21
View File
@@ -0,0 +1,21 @@
/* eslint-disable import/prefer-default-export */
import { useState, useEffect } from 'react';
import cons from '../../client/state/cons';
import navigation from '../../client/state/navigation';
export function useSelectedSpace() {
const [spaceId, setSpaceId] = useState(navigation.selectedSpaceId);
useEffect(() => {
const onSpaceSelected = (roomId) => {
setSpaceId(roomId);
};
navigation.on(cons.events.navigation.SPACE_SELECTED, onSpaceSelected);
return () => {
navigation.removeListener(cons.events.navigation.SPACE_SELECTED, onSpaceSelected);
};
}, []);
return [spaceId];
}
+21
View File
@@ -0,0 +1,21 @@
/* eslint-disable import/prefer-default-export */
import { useState, useEffect } from 'react';
import cons from '../../client/state/cons';
import navigation from '../../client/state/navigation';
export function useSelectedTab() {
const [selectedTab, setSelectedTab] = useState(navigation.selectedTab);
useEffect(() => {
const onTabSelected = (tabId) => {
setSelectedTab(tabId);
};
navigation.on(cons.events.navigation.TAB_SELECTED, onTabSelected);
return () => {
navigation.removeListener(cons.events.navigation.TAB_SELECTED, onTabSelected);
};
}, []);
return [selectedTab];
}
+22
View File
@@ -0,0 +1,22 @@
/* eslint-disable import/prefer-default-export */
import { useState, useEffect } from 'react';
import initMatrix from '../../client/initMatrix';
import cons from '../../client/state/cons';
export function useSpaceShortcut() {
const { roomList } = initMatrix;
const [spaceShortcut, setSpaceShortcut] = useState([...roomList.spaceShortcut]);
useEffect(() => {
const onSpaceShortcutUpdated = () => {
setSpaceShortcut([...roomList.spaceShortcut]);
};
roomList.on(cons.events.roomList.SPACE_SHORTCUT_UPDATED, onSpaceShortcutUpdated);
return () => {
roomList.removeListener(cons.events.roomList.SPACE_SHORTCUT_UPDATED, onSpaceShortcutUpdated);
};
}, []);
return [spaceShortcut];
}
+22
View File
@@ -0,0 +1,22 @@
/* eslint-disable import/prefer-default-export */
import { useEffect, useRef } from 'react';
export function useStore(...args) {
const itemRef = useRef(null);
const getItem = () => itemRef.current;
const setItem = (event) => {
itemRef.current = event;
return itemRef.current;
};
useEffect(() => {
itemRef.current = null;
return () => {
itemRef.current = null;
};
}, args);
return { getItem, setItem };
}
@@ -1,46 +0,0 @@
import React from 'react';
import PropTypes from 'prop-types';
import './ChannelIntro.scss';
import Linkify from 'linkifyjs/react';
import colorMXID from '../../../util/colorMXID';
import Text from '../../atoms/text/Text';
import Avatar from '../../atoms/avatar/Avatar';
function linkifyContent(content) {
return <Linkify options={{ target: { url: '_blank' } }}>{content}</Linkify>;
}
function ChannelIntro({
avatarSrc, name, heading, desc, time,
}) {
return (
<div className="channel-intro">
<Avatar imageSrc={avatarSrc} text={name.slice(0, 1)} bgColor={colorMXID(name)} size="large" />
<div className="channel-intro__content">
<Text className="channel-intro__name" variant="h1">{heading}</Text>
<Text className="channel-intro__desc" variant="b1">{linkifyContent(desc)}</Text>
{ time !== null && <Text className="channel-intro__time" variant="b3">{time}</Text>}
</div>
</div>
);
}
ChannelIntro.defaultProps = {
avatarSrc: false,
time: null,
};
ChannelIntro.propTypes = {
avatarSrc: PropTypes.oneOfType([
PropTypes.string,
PropTypes.bool,
]),
name: PropTypes.string.isRequired,
heading: PropTypes.string.isRequired,
desc: PropTypes.string.isRequired,
time: PropTypes.string,
};
export default ChannelIntro;
@@ -1,73 +0,0 @@
import React from 'react';
import PropTypes from 'prop-types';
import './ChannelSelector.scss';
import colorMXID from '../../../util/colorMXID';
import Text from '../../atoms/text/Text';
import Avatar from '../../atoms/avatar/Avatar';
import NotificationBadge from '../../atoms/badge/NotificationBadge';
import { blurOnBubbling } from '../../atoms/button/script';
function ChannelSelector({
selected, unread, notificationCount, alert,
iconSrc, imageSrc, roomId, onClick, children,
}) {
return (
<button
className={`channel-selector__button-wrapper${selected ? ' channel-selector--selected' : ''}`}
type="button"
onClick={onClick}
onMouseUp={(e) => blurOnBubbling(e, '.channel-selector__button-wrapper')}
>
<div className="channel-selector">
<div className="channel-selector__icon flex--center">
<Avatar
text={children.slice(0, 1)}
bgColor={colorMXID(roomId)}
imageSrc={imageSrc}
iconSrc={iconSrc}
size="extra-small"
/>
</div>
<div className="channel-selector__text-container">
<Text variant="b1">{children}</Text>
</div>
<div className="channel-selector__badge-container">
{
notificationCount !== 0
? unread && (
<NotificationBadge alert={alert}>
{notificationCount}
</NotificationBadge>
)
: unread && <div className="channel-selector--unread" />
}
</div>
</div>
</button>
);
}
ChannelSelector.defaultProps = {
selected: false,
unread: false,
notificationCount: 0,
alert: false,
iconSrc: null,
imageSrc: null,
};
ChannelSelector.propTypes = {
selected: PropTypes.bool,
unread: PropTypes.bool,
notificationCount: PropTypes.number,
alert: PropTypes.bool,
iconSrc: PropTypes.string,
imageSrc: PropTypes.string,
roomId: PropTypes.string.isRequired,
onClick: PropTypes.func.isRequired,
children: PropTypes.string.isRequired,
};
export default ChannelSelector;
@@ -1,66 +0,0 @@
.channel-selector__button-wrapper {
display: block;
width: calc(100% - var(--sp-extra-tight));
margin-left: auto;
padding: var(--sp-extra-tight) var(--sp-extra-tight);
border: 1px solid transparent;
border-radius: var(--bo-radius);
cursor: pointer;
[dir=rtl] & {
margin: {
left: 0;
right: auto;
}
}
@media (hover: hover) {
&:hover {
background-color: var(--bg-surface-hover);
}
}
&:focus {
outline: none;
background-color: var(--bg-surface-hover);
}
&:active {
background-color: var(--bg-surface-active);
}
}
.channel-selector {
display: flex;
align-items: center;
&__icon {
width: 24px;
height: 24px;
.avatar__border {
box-shadow: none;
}
}
&__text-container {
flex: 1;
min-width: 0;
margin: 0 var(--sp-extra-tight);
& .text {
color: var(--tc-surface-normal);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
}
}
.channel-selector--unread {
margin: 0 var(--sp-ultra-tight);
height: 8px;
width: 8px;
background-color: var(--tc-surface-low);
border-radius: 50%;
opacity: .4;
}
.channel-selector--selected {
background-color: var(--bg-surface);
border-color: var(--bg-surface-border);
}
+68
View File
@@ -0,0 +1,68 @@
import React from 'react';
import PropTypes from 'prop-types';
import './Dialog.scss';
import { twemojify } from '../../../util/twemojify';
import Text from '../../atoms/text/Text';
import Header, { TitleWrapper } from '../../atoms/header/Header';
import ScrollView from '../../atoms/scroll/ScrollView';
import RawModal from '../../atoms/modal/RawModal';
function Dialog({
className, isOpen, title, onAfterOpen, onAfterClose,
contentOptions, onRequestClose, closeFromOutside, children,
}) {
return (
<RawModal
className={`${className === null ? '' : `${className} `}dialog-model`}
isOpen={isOpen}
onAfterOpen={onAfterOpen}
onAfterClose={onAfterClose}
onRequestClose={onRequestClose}
closeFromOutside={closeFromOutside}
size="small"
>
<div className="dialog">
<div className="dialog__content">
<Header>
<TitleWrapper>
<Text variant="h2" weight="medium" primary>{twemojify(title)}</Text>
</TitleWrapper>
{contentOptions}
</Header>
<div className="dialog__content__wrapper">
<ScrollView autoHide>
<div className="dialog__content-container">
{children}
</div>
</ScrollView>
</div>
</div>
</div>
</RawModal>
);
}
Dialog.defaultProps = {
className: null,
contentOptions: null,
onAfterOpen: null,
onAfterClose: null,
onRequestClose: null,
closeFromOutside: true,
};
Dialog.propTypes = {
className: PropTypes.string,
isOpen: PropTypes.bool.isRequired,
title: PropTypes.string.isRequired,
contentOptions: PropTypes.node,
onAfterOpen: PropTypes.func,
onAfterClose: PropTypes.func,
onRequestClose: PropTypes.func,
closeFromOutside: PropTypes.bool,
children: PropTypes.node.isRequired,
};
export default Dialog;

Some files were not shown because too many files have changed in this diff Show More