├── public ├── notes │ ├── pass.txt │ ├── sublime_search.txt │ ├── electronpackage.txt │ └── delays.js ├── images │ ├── icon.ico │ ├── logo.png │ ├── alert-info.png │ ├── alert-info2.png │ ├── alert-info3.png │ ├── logo_old │ │ ├── favicon.ico │ │ ├── logo_old.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── apple-touch-icon.png │ │ └── android-chrome-192x192.png │ ├── logo_old2 │ │ └── logo_old2.png │ └── backgrounds │ │ └── dark_wall.png └── main.html ├── app ├── modules │ ├── __Drawer__ │ │ ├── Filter │ │ │ ├── index.js │ │ │ ├── Filter.jsx │ │ │ └── Filter.styles.sass │ │ └── Sort │ │ │ ├── index.js │ │ │ ├── SortIcon │ │ │ ├── index.js │ │ │ ├── SortIcon.jsx │ │ │ └── SortIcon.styles.sass │ │ │ └── SortPanel.styles.sass │ ├── Board │ │ ├── tests │ │ │ ├── component.tests.js │ │ │ ├── index.suite.js │ │ │ └── integration.tests.js │ │ ├── assemblies │ │ │ ├── BoardPost │ │ │ │ └── index.js │ │ │ ├── PageGrid │ │ │ │ ├── index.js │ │ │ │ └── PageGrid.jsx │ │ │ ├── BoardToolbar │ │ │ │ └── index.js │ │ │ └── index.js │ │ ├── components │ │ │ ├── TitledIcon │ │ │ │ ├── index.js │ │ │ │ ├── TitledIcon.jsx │ │ │ │ └── TitledIcon.styles.sass │ │ │ ├── BoardPostHeader │ │ │ │ ├── index.js │ │ │ │ ├── BoardPostHeader.styles.sass │ │ │ │ └── BoardPostHeader.jsx │ │ │ ├── NoSearchResults │ │ │ │ ├── index.js │ │ │ │ ├── NoSearchResults.styles.sass │ │ │ │ └── NoSearchResults.jsx │ │ │ ├── SortByArea │ │ │ │ └── styles.sass │ │ │ ├── BoardToolbarMetadata │ │ │ │ ├── index.js │ │ │ │ └── BoardToolbarMetadata.styles.sass │ │ │ ├── BoardSearch │ │ │ │ └── index.jsx │ │ │ ├── BoardSpinner │ │ │ │ ├── index.jsx │ │ │ │ └── styles.sass │ │ │ ├── BoardMetadata │ │ │ │ ├── styles.sass │ │ │ │ └── index.jsx │ │ │ ├── BoardPostImage.jsx │ │ │ ├── index.js │ │ │ └── BoardPostComment.jsx │ │ └── config.js │ ├── Panels │ │ ├── CommentPanel │ │ │ ├── Comment.jsx │ │ │ └── index.js │ │ ├── ArchivePanel │ │ │ ├── ArchivePanel.styles.sass │ │ │ ├── index.js │ │ │ └── ArchivePanel.jsx │ │ ├── components │ │ │ ├── Panel │ │ │ │ ├── index.js │ │ │ │ └── Panel.jsx │ │ │ ├── index.js │ │ │ └── SlideTransition │ │ │ │ └── styles.sass │ │ ├── SettingsPanel │ │ │ └── Tabs │ │ │ │ └── index.js │ │ ├── MenuPanel │ │ │ ├── components │ │ │ │ ├── index.js │ │ │ │ └── MenuPage.jsx │ │ │ └── containers │ │ │ │ ├── index.js │ │ │ │ └── BoardListPage │ │ │ │ ├── BoardListItem.jsx │ │ │ │ └── connect.js │ │ ├── BookmarksPanel │ │ │ ├── styles.sass │ │ │ └── index.jsx │ │ ├── index.js │ │ ├── __Panels.jsx │ │ └── WatchPanel │ │ │ └── connect.js │ ├── Thread │ │ ├── components │ │ │ ├── ControllerButton │ │ │ │ └── styles.sass │ │ │ ├── Overlay │ │ │ │ ├── index.js │ │ │ │ └── Overlay.styles.sass │ │ │ ├── PostToolbar │ │ │ │ └── index.js │ │ │ ├── PostID │ │ │ │ ├── styles.sass │ │ │ │ └── index.js │ │ │ ├── ThreadHeader │ │ │ │ └── index.js │ │ │ ├── Controllers │ │ │ │ ├── index.js │ │ │ │ ├── BookmarkController.jsx │ │ │ │ ├── ArchiveController.jsx │ │ │ │ ├── CommentController.jsx │ │ │ │ └── UpdateController.jsx │ │ │ ├── Comment.jsx │ │ │ ├── Title.jsx │ │ │ ├── index.js │ │ │ ├── References.jsx │ │ │ ├── MediaInfo.jsx │ │ │ └── ThreadMedia │ │ │ │ └── styles.sass │ │ ├── containers │ │ │ ├── ThreadControls │ │ │ │ ├── index.js │ │ │ │ └── ThreadControls.styles.sass │ │ │ └── index.js │ │ └── events │ │ │ └── media.js │ ├── Dashboard │ │ ├── containers │ │ │ ├── FavouriteBoards │ │ │ │ ├── FavouriteBoards.jsx │ │ │ │ └── index.js │ │ │ ├── index.js │ │ │ ├── BoardList │ │ │ │ ├── BoardList.styles.sass │ │ │ │ └── index.js │ │ │ ├── BoardSearch │ │ │ │ ├── BoardSearch.styles.sass │ │ │ │ ├── BoardSearch.jsx │ │ │ │ └── index.js │ │ │ └── BoardSelection │ │ │ │ └── index.js │ │ ├── components │ │ │ ├── HomeBoard │ │ │ │ ├── index.js │ │ │ │ ├── HomeBoard.styles.sass │ │ │ │ └── HomeBoard.jsx │ │ │ ├── BoardListItem │ │ │ │ ├── index.js │ │ │ │ └── BoardListItem.styles.sass │ │ │ └── index.js │ │ ├── Dashboard.styles.sass │ │ └── index.js │ ├── __Navbar │ │ ├── index.js │ │ ├── BoardInfo │ │ │ ├── index.js │ │ │ └── BoardInfo.styles.sass │ │ └── BoardList │ │ │ └── index.js │ ├── __Settings │ │ └── index.js │ ├── Cinema │ │ ├── config.js │ │ ├── components │ │ │ ├── index.js │ │ │ ├── CloseCinema.jsx │ │ │ ├── NextMediaButton.jsx │ │ │ ├── PreviousMediaButton.jsx │ │ │ └── CurrentMedia.jsx │ │ └── connect.jsx │ ├── Header │ │ ├── components │ │ │ ├── FullLogo │ │ │ │ ├── index.js │ │ │ │ └── FullLogo.jsx │ │ │ ├── IconGroup │ │ │ │ ├── index.js │ │ │ │ ├── IconGroup.styles.sass │ │ │ │ └── HeaderIcon.jsx │ │ │ ├── HeaderGroup │ │ │ │ ├── index.js │ │ │ │ ├── HeaderGroup.jsx │ │ │ │ └── HeaderGroup.styles.sass │ │ │ ├── HeaderItem │ │ │ │ ├── index.js │ │ │ │ ├── HeaderItem.jsx │ │ │ │ └── HeaderItem.styles.sass │ │ │ ├── HeaderTitle │ │ │ │ └── index.js │ │ │ ├── SlideDownBG │ │ │ │ ├── index.js │ │ │ │ └── SlideDownBG.jsx │ │ │ ├── TitledIcon │ │ │ │ ├── index.js │ │ │ │ ├── TitledIcon.jsx │ │ │ │ └── TitledIcon.styles.sass │ │ │ ├── HeaderButtonIcon │ │ │ │ ├── index.js │ │ │ │ ├── HeaderButtonIcon.styles.sass │ │ │ │ └── HeaderButtonIcon.jsx │ │ │ ├── ContentButtonGroup │ │ │ │ └── index.js │ │ │ ├── VerticallyTitledIcon │ │ │ │ ├── index.js │ │ │ │ ├── VerticallyTitledIcon.styles.sass │ │ │ │ └── VerticallyTitledIcon.jsx │ │ │ └── index.js │ │ ├── index.js │ │ └── containers │ │ │ └── index.js │ ├── Settings │ │ ├── components │ │ │ ├── Setting │ │ │ │ ├── index.js │ │ │ │ └── Setting.jsx │ │ │ └── index.js │ │ └── index.js │ ├── Post │ │ ├── config.js │ │ ├── PostPositioner.jsx │ │ └── connect.js │ ├── index.test.js │ └── index.js ├── redux │ ├── reducers │ │ ├── tests │ │ │ └── placeholder │ │ ├── apiReducer.js │ │ ├── settingsReducer.js │ │ ├── postReducer.js │ │ ├── index.js │ │ └── cacheReducer.js │ ├── actions │ │ ├── api │ │ │ ├── submitThreadPost.js │ │ │ └── index.js │ │ ├── settings │ │ │ ├── index.js │ │ │ └── setSetting.js │ │ ├── post │ │ │ └── index.js │ │ ├── cache │ │ │ ├── index.js │ │ │ └── cacheCurrentThread.js │ │ ├── cinema │ │ │ └── index.js │ │ ├── watcher │ │ │ ├── index.js │ │ │ └── removeWatchEntity.js │ │ ├── __tests__ │ │ │ └── index.suite.js │ │ ├── index.js │ │ ├── thread │ │ │ ├── index.js │ │ │ ├── destroyThread.js │ │ │ └── monitorThread.js │ │ ├── alert.js │ │ └── board │ │ │ ├── index.js │ │ │ ├── searchBoard.js │ │ │ ├── destroyBoard.js │ │ │ ├── addBoardToFavourites.js │ │ │ └── removeBoardFromFavourites.js │ ├── selectors │ │ ├── cache.js │ │ ├── status.js │ │ ├── index.js │ │ ├── post.js │ │ ├── thread.js │ │ ├── watcher.js │ │ └── settings.js │ └── index.test.js ├── components │ ├── form │ │ ├── ColorInput │ │ │ └── index.jsx │ │ ├── Dropdown │ │ │ ├── index.js │ │ │ └── Dropdown.styles.sass │ │ ├── RadioGroup │ │ │ ├── index.js │ │ │ ├── Radio.jsx │ │ │ └── RadioField.jsx │ │ ├── index.js │ │ ├── Checkbox │ │ │ ├── index.jsx │ │ │ └── styles.sass │ │ ├── SearchBarWithIcons │ │ │ └── styles.sass │ │ └── SearchBar │ │ │ └── styles.sass │ ├── interaction │ │ ├── Alert │ │ │ └── index.jsx │ │ ├── TextSelectionPopup │ │ │ ├── TextSelectionPopup.styles.sass │ │ │ └── index.js │ │ ├── Tooltip │ │ │ └── index.js │ │ ├── Notification │ │ │ ├── index.js │ │ │ └── Notification.jsx │ │ ├── Spinners │ │ │ ├── CircleSpinner │ │ │ │ ├── index.js │ │ │ │ ├── Spinner.jsx │ │ │ │ └── Spinner.styles.sass │ │ │ ├── SquareSpinner │ │ │ │ ├── index.js │ │ │ │ ├── Spinner.jsx │ │ │ │ └── Spinner.styles.sass │ │ │ ├── VideoSpinner │ │ │ │ ├── index.js │ │ │ │ └── Spinner.jsx │ │ │ └── index.js │ │ ├── ContextMenus │ │ │ └── index.js │ │ ├── ActionButton │ │ │ ├── styles.sass │ │ │ └── index.jsx │ │ ├── HoverUnderline │ │ │ ├── index.jsx │ │ │ └── styles.sass │ │ └── index.js │ ├── elements │ │ ├── Icon │ │ │ ├── index.js │ │ │ └── Icon.jsx │ │ ├── Logo │ │ │ ├── index.js │ │ │ ├── Logo.jsx │ │ │ └── Logo.styles.sass │ │ ├── Pipe │ │ │ ├── index.js │ │ │ ├── Pipe.jsx │ │ │ └── Pipe.styles.sass │ │ ├── Button │ │ │ ├── index.js │ │ │ └── Button.jsx │ │ ├── Counter │ │ │ ├── index.js │ │ │ └── Counter.jsx │ │ ├── Elipses │ │ │ └── index.js │ │ ├── Overlay │ │ │ ├── index.js │ │ │ └── Overlay.styles.sass │ │ ├── TimeAgo │ │ │ ├── index.js │ │ │ └── TimeAgo.styles.sass │ │ ├── LogoText │ │ │ ├── index.js │ │ │ ├── LogoText.jsx │ │ │ └── LogoText.styles.sass │ │ ├── TimeAgoShort │ │ │ ├── index.js │ │ │ └── TimeAgo.jsx │ │ ├── ButtonCircle │ │ │ ├── index.js │ │ │ └── Circle │ │ │ │ ├── index.js │ │ │ │ ├── Circle.styles.sass │ │ │ │ └── Circle.jsx │ │ ├── IconCircle │ │ │ ├── index.js │ │ │ └── IconCircle.jsx │ │ ├── Card │ │ │ ├── index.jsx │ │ │ ├── classes.js │ │ │ └── styles.sass │ │ ├── Title │ │ │ ├── classes.js │ │ │ ├── style.sass │ │ │ └── index.jsx │ │ ├── ButtonWithPopout │ │ │ ├── index.jsx │ │ │ └── styles.sass │ │ ├── index.js │ │ └── SidePullout │ │ │ └── styles.sass │ ├── layout │ │ ├── Modal │ │ │ ├── Modal.styles.sass │ │ │ └── index.js │ │ ├── LineBreak │ │ │ ├── index.js │ │ │ ├── Line.jsx │ │ │ └── Line.styles.sass │ │ ├── Container │ │ │ ├── index.js │ │ │ ├── Container.styles.sass │ │ │ └── Container.jsx │ │ ├── Scrollable │ │ │ ├── index.js │ │ │ └── styles.sass │ │ ├── Tabs │ │ │ ├── TabEffects.jsx │ │ │ └── styles.sass │ │ ├── index.js │ │ └── Parallax │ │ │ ├── styles.sass │ │ │ └── index.jsx │ ├── media │ │ ├── Image │ │ │ └── index.js │ │ ├── DualMedia │ │ │ ├── index.js │ │ │ └── DualMedia.styles.sass │ │ ├── ExpandedImage │ │ │ ├── index.js │ │ │ ├── ExpandedImage.styles.sass │ │ │ └── ExpandedImage.jsx │ │ ├── ImageWithChild │ │ │ ├── index.js │ │ │ └── ImageWithChild.jsx │ │ ├── index.js │ │ └── Video │ │ │ ├── aria-label.js │ │ │ └── elements │ │ │ ├── index.js │ │ │ ├── FullScreen.jsx │ │ │ ├── Download.jsx │ │ │ ├── Time.jsx │ │ │ ├── PlayPause.jsx │ │ │ └── Overlay.jsx │ ├── other │ │ ├── Timer │ │ │ └── index.js │ │ ├── ToggleOnClick │ │ │ ├── index.js │ │ │ └── ToggleOnClick.jsx │ │ ├── index.js │ │ └── Theme │ │ │ ├── injectTheme.jsx │ │ │ └── ThemeProvider.jsx │ ├── __old__ │ │ ├── Hierarchy │ │ │ ├── index.js │ │ │ ├── Hierarchy.styles.sass │ │ │ └── Hierarchy.jsx │ │ ├── ScrollableList │ │ │ ├── index.js │ │ │ ├── ScrollableList.styles.sass │ │ │ └── ScrollableList.jsx │ │ ├── hoc │ │ │ └── index.js │ │ └── App │ │ │ ├── index.jsx │ │ │ ├── index.oldtest.jsx │ │ │ └── Routes.jsx │ ├── grid │ │ └── index.js │ ├── index.js │ ├── App.jsx │ └── App.test.jsx ├── sass │ ├── __themes__ │ │ ├── _light.sass │ │ ├── light │ │ │ └── _palette.scss │ │ ├── _dark.sass │ │ ├── dark │ │ │ ├── _greys.scss │ │ │ ├── _base_colors.scss │ │ │ └── _palette.scss │ │ ├── _registery.scss │ │ └── _utils.scss │ ├── vendor │ │ ├── _neutron.sass │ │ └── neutron │ │ │ └── modules │ │ │ └── _utilities.scss │ ├── utils │ │ ├── themes.sass │ │ ├── mixins │ │ │ ├── _other.sass │ │ │ ├── _hover.sass │ │ │ ├── _color.sass │ │ │ ├── _text.sass │ │ │ ├── _maths.sass │ │ │ ├── _icon.sass │ │ │ ├── _fontsize.sass │ │ │ ├── _nano.sass │ │ │ ├── _size.sass │ │ │ ├── _position.sass │ │ │ └── _shadow.sass │ │ ├── mixins.sass │ │ ├── functions.sass │ │ └── z-index.sass │ ├── __icons__ │ │ ├── lurka.eot │ │ ├── lurka.ttf │ │ └── lurka.woff │ ├── fonts │ │ ├── Lato-Regular.ttf │ │ ├── Lurka-Icons.ttf │ │ ├── Lurka-Icons.woff │ │ ├── FaricyNew-Bold.ttf │ │ ├── OpenSans-Bold.ttf │ │ ├── OpenSans-Light.ttf │ │ ├── FaricyNew-Light.ttf │ │ ├── FaricyNew-Regular.ttf │ │ ├── OpenSans-Regular.ttf │ │ ├── OpenSans-Semibold.ttf │ │ ├── Raleway-Regular.ttf │ │ └── OpenSans-ExtraBold.ttf │ ├── base.scss │ ├── utils.scss │ ├── base │ │ └── _typography.sass │ └── README.md ├── themes │ ├── palettes │ │ └── index.js │ ├── index.js │ ├── registry.js │ └── utils.js ├── services │ ├── Alerts │ │ ├── config.js │ │ ├── styles.sass │ │ ├── connect.js │ │ └── AlertIcons.jsx │ ├── index.js │ ├── ServiceComponent.jsx │ ├── Preloader │ │ └── connect.js │ ├── Watcher │ │ └── connect.js │ ├── Theme │ │ └── index.jsx │ └── README ├── api │ ├── index.js │ ├── client.js │ └── parser │ │ └── index.js ├── events │ ├── index.js │ ├── subscribers.test.js │ ├── setup.js │ └── index.test.js ├── views │ ├── CinemaView.jsx │ ├── DashboardView.jsx │ ├── MediaView.jsx │ ├── PostView.jsx │ ├── index.jsx │ ├── __HomeView.jsx │ └── styles.sass ├── index.html └── utils │ ├── designPatterns.js │ ├── index.js │ ├── redux.js │ ├── conversions.js │ └── dom.js ├── config ├── mocha │ ├── index.js │ ├── mocha.opts │ └── helpers.js ├── environment.js ├── gulp │ ├── index.js │ └── utils.js ├── errors.js ├── README ├── alerts.js ├── webpack │ ├── ConsoleClearPlugin.js │ ├── vendors.js │ └── index.js ├── api.4chan.js ├── proxy.js └── paths.js ├── .gitignore ├── electron ├── setup.js ├── events │ ├── handleRedirect.js │ └── handleBeforeSendHeaders.js └── index.js ├── .travis.yml ├── .babelrc └── .appveyor.yml /public/notes/pass.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/modules/__Drawer__/Filter/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/redux/reducers/tests/placeholder: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/components/form/ColorInput/index.jsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/components/interaction/Alert/index.jsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/modules/Board/tests/component.tests.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/modules/Panels/CommentPanel/Comment.jsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/modules/__Drawer__/Filter/Filter.jsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/redux/actions/api/submitThreadPost.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/modules/__Drawer__/Filter/Filter.styles.sass: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/modules/Thread/components/ControllerButton/styles.sass: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/sass/__themes__/_light.sass: -------------------------------------------------------------------------------- 1 | @import 'light/palette' 2 | -------------------------------------------------------------------------------- /app/sass/vendor/_neutron.sass: -------------------------------------------------------------------------------- 1 | @import "neutron/neutron" 2 | -------------------------------------------------------------------------------- /app/modules/Dashboard/containers/FavouriteBoards/FavouriteBoards.jsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/modules/__Navbar/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Navbar' 2 | -------------------------------------------------------------------------------- /app/components/elements/Icon/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Icon' 2 | -------------------------------------------------------------------------------- /app/components/elements/Logo/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Logo' 2 | -------------------------------------------------------------------------------- /app/components/elements/Pipe/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Pipe' 2 | -------------------------------------------------------------------------------- /app/components/layout/Modal/Modal.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | -------------------------------------------------------------------------------- /app/components/layout/Modal/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Modal' 2 | -------------------------------------------------------------------------------- /app/components/media/Image/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Image' 2 | -------------------------------------------------------------------------------- /app/components/other/Timer/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Timer' 2 | -------------------------------------------------------------------------------- /app/modules/__Settings/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Settings' 2 | -------------------------------------------------------------------------------- /app/sass/__themes__/light/_palette.scss: -------------------------------------------------------------------------------- 1 | $light-palette: ( 2 | 3 | ); 4 | -------------------------------------------------------------------------------- /app/components/elements/Button/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Button' 2 | -------------------------------------------------------------------------------- /app/components/elements/Counter/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Counter' 2 | -------------------------------------------------------------------------------- /app/components/elements/Elipses/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Elipses' 2 | -------------------------------------------------------------------------------- /app/components/elements/Overlay/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Overlay' 2 | -------------------------------------------------------------------------------- /app/components/elements/TimeAgo/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './TimeAgo' 2 | -------------------------------------------------------------------------------- /app/components/form/Dropdown/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Dropdown' 2 | -------------------------------------------------------------------------------- /app/components/interaction/TextSelectionPopup/TextSelectionPopup.styles.sass: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/components/layout/LineBreak/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Line' 2 | -------------------------------------------------------------------------------- /app/modules/Cinema/config.js: -------------------------------------------------------------------------------- 1 | export const interfaceFadeOutDelay = 2000 2 | -------------------------------------------------------------------------------- /app/modules/Panels/CommentPanel/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Comment' 2 | -------------------------------------------------------------------------------- /app/modules/__Drawer__/Sort/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './SortPanel' 2 | -------------------------------------------------------------------------------- /app/themes/palettes/index.js: -------------------------------------------------------------------------------- 1 | export {default as darkRed} from './dark-red' 2 | -------------------------------------------------------------------------------- /config/mocha/index.js: -------------------------------------------------------------------------------- 1 | require('babel-register'); 2 | require('./setup') 3 | -------------------------------------------------------------------------------- /app/components/__old__/Hierarchy/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Hierarchy' 2 | -------------------------------------------------------------------------------- /app/components/elements/LogoText/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './LogoText' 2 | -------------------------------------------------------------------------------- /app/components/elements/TimeAgoShort/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './TimeAgo' 2 | -------------------------------------------------------------------------------- /app/components/form/RadioGroup/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './RadioGroup' 2 | -------------------------------------------------------------------------------- /app/components/grid/index.js: -------------------------------------------------------------------------------- 1 | export {default as MasonryGrid} from './masonry' 2 | -------------------------------------------------------------------------------- /app/components/interaction/Tooltip/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Tooltip' 2 | -------------------------------------------------------------------------------- /app/components/layout/Container/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Container' 2 | -------------------------------------------------------------------------------- /app/components/layout/Scrollable/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Scrollable' 2 | -------------------------------------------------------------------------------- /app/components/media/DualMedia/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './DualMedia' 2 | -------------------------------------------------------------------------------- /app/modules/Board/assemblies/BoardPost/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './BoardPost' -------------------------------------------------------------------------------- /app/modules/Dashboard/containers/FavouriteBoards/index.js: -------------------------------------------------------------------------------- 1 | export default {} 2 | -------------------------------------------------------------------------------- /app/modules/Panels/ArchivePanel/ArchivePanel.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | -------------------------------------------------------------------------------- /app/modules/Panels/ArchivePanel/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './ArchivePanel' 2 | -------------------------------------------------------------------------------- /app/modules/Panels/components/Panel/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Panel' 2 | -------------------------------------------------------------------------------- /app/modules/__Navbar/BoardInfo/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './BoardInfo' 2 | -------------------------------------------------------------------------------- /app/modules/__Navbar/BoardList/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './BoardList' 2 | -------------------------------------------------------------------------------- /app/components/elements/ButtonCircle/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './ButtonCircle' 2 | -------------------------------------------------------------------------------- /app/components/elements/IconCircle/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './IconCircle'; 2 | -------------------------------------------------------------------------------- /app/components/media/ExpandedImage/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './ExpandedImage' 2 | -------------------------------------------------------------------------------- /app/components/other/ToggleOnClick/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './ToggleOnClick' 2 | -------------------------------------------------------------------------------- /app/modules/Board/assemblies/PageGrid/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './PageGrid' 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/FullLogo/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './FullLogo'; 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/IconGroup/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './IconGroup' 2 | -------------------------------------------------------------------------------- /app/modules/Settings/components/Setting/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Setting' 2 | -------------------------------------------------------------------------------- /app/modules/Thread/components/Overlay/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Overlay' 2 | -------------------------------------------------------------------------------- /app/modules/__Drawer__/Sort/SortIcon/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './SortIcon' 2 | -------------------------------------------------------------------------------- /app/sass/utils/themes.sass: -------------------------------------------------------------------------------- 1 | @import 'themes/utils' 2 | @import 'themes/registery' 3 | -------------------------------------------------------------------------------- /app/components/__old__/ScrollableList/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './ScrollableList' 2 | -------------------------------------------------------------------------------- /app/components/__old__/hoc/index.js: -------------------------------------------------------------------------------- 1 | export {default as scrollable} from './Scrollable'; 2 | -------------------------------------------------------------------------------- /app/components/elements/ButtonCircle/Circle/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Circle' 2 | -------------------------------------------------------------------------------- /app/components/interaction/Notification/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Notification' 2 | -------------------------------------------------------------------------------- /app/components/media/ImageWithChild/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './ImageWithChild'; 2 | -------------------------------------------------------------------------------- /app/modules/Board/assemblies/BoardToolbar/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './BoardToolbar' 2 | -------------------------------------------------------------------------------- /app/modules/Board/components/TitledIcon/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './TitledIcon' 2 | -------------------------------------------------------------------------------- /app/modules/Dashboard/components/HomeBoard/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './HomeBoard'; 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/HeaderGroup/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './HeaderGroup' 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/HeaderItem/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './HeaderItem' 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/HeaderTitle/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './HeaderTitle' 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/SlideDownBG/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './SlideDownBG' 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/TitledIcon/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './TitledIcon' 2 | -------------------------------------------------------------------------------- /app/modules/Settings/components/index.js: -------------------------------------------------------------------------------- 1 | export {default as Setting} from './Setting' 2 | -------------------------------------------------------------------------------- /app/modules/Thread/components/PostToolbar/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './PostToolbar' 2 | -------------------------------------------------------------------------------- /app/redux/actions/settings/index.js: -------------------------------------------------------------------------------- 1 | export {default as setSetting} from './setSetting'; 2 | -------------------------------------------------------------------------------- /app/sass/utils/mixins/_other.sass: -------------------------------------------------------------------------------- 1 | =will-change($props...) 2 | will-change: $props 3 | -------------------------------------------------------------------------------- /app/components/interaction/Spinners/CircleSpinner/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Spinner' 2 | -------------------------------------------------------------------------------- /app/components/interaction/Spinners/SquareSpinner/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Spinner' 2 | -------------------------------------------------------------------------------- /app/components/interaction/Spinners/VideoSpinner/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './Spinner' 2 | -------------------------------------------------------------------------------- /app/components/layout/Scrollable/styles.sass: -------------------------------------------------------------------------------- 1 | .nano-content 2 | scroll-behavior: smooth 3 | -------------------------------------------------------------------------------- /app/modules/Panels/SettingsPanel/Tabs/index.js: -------------------------------------------------------------------------------- 1 | export {default as ThemeTab} from './ThemeTab'; 2 | -------------------------------------------------------------------------------- /app/modules/Thread/components/PostID/styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .PostID 4 | 5 | -------------------------------------------------------------------------------- /app/modules/Thread/components/ThreadHeader/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './ThreadHeader' 2 | -------------------------------------------------------------------------------- /app/modules/Thread/containers/ThreadControls/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './ThreadControls' 2 | -------------------------------------------------------------------------------- /app/redux/actions/post/index.js: -------------------------------------------------------------------------------- 1 | export {default as togglePostView} from './togglePostView' 2 | -------------------------------------------------------------------------------- /public/images/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/icon.ico -------------------------------------------------------------------------------- /public/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/logo.png -------------------------------------------------------------------------------- /app/components/interaction/TextSelectionPopup/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './TextSelectionPopup' 2 | -------------------------------------------------------------------------------- /app/modules/Board/components/BoardPostHeader/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './BoardPostHeader'; 2 | -------------------------------------------------------------------------------- /app/modules/Board/components/NoSearchResults/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './NoSearchResults' 2 | -------------------------------------------------------------------------------- /app/modules/Board/components/SortByArea/styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .SortByArea 4 | 5 | -------------------------------------------------------------------------------- /app/modules/Dashboard/components/BoardListItem/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './BoardListItem' 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/HeaderButtonIcon/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './HeaderButtonIcon' 2 | -------------------------------------------------------------------------------- /app/modules/Panels/MenuPanel/components/index.js: -------------------------------------------------------------------------------- 1 | export {default as MenuPage} from './MenuPage' 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/ContentButtonGroup/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './ContentButtonGroup' 2 | -------------------------------------------------------------------------------- /app/redux/actions/cache/index.js: -------------------------------------------------------------------------------- 1 | export {default as cacheCurrentThread} from './cacheCurrentThread'; 2 | -------------------------------------------------------------------------------- /app/sass/__icons__/lurka.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/__icons__/lurka.eot -------------------------------------------------------------------------------- /app/sass/__icons__/lurka.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/__icons__/lurka.ttf -------------------------------------------------------------------------------- /public/images/alert-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/alert-info.png -------------------------------------------------------------------------------- /public/notes/sublime_search.txt: -------------------------------------------------------------------------------- 1 | W:\_Projects\_Portfolio\Lurka, -*/node_modules/*, -*/build/*, -*/dist/* 2 | -------------------------------------------------------------------------------- /app/modules/Board/components/BoardToolbarMetadata/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './BoardToolbarMetadata' 2 | -------------------------------------------------------------------------------- /app/modules/Header/components/VerticallyTitledIcon/index.js: -------------------------------------------------------------------------------- 1 | export {default} from './VerticallyTitledIcon' 2 | -------------------------------------------------------------------------------- /app/modules/Panels/MenuPanel/containers/index.js: -------------------------------------------------------------------------------- 1 | export {default as BoardListPage} from './BoardListPage'; 2 | -------------------------------------------------------------------------------- /app/redux/selectors/cache.js: -------------------------------------------------------------------------------- 1 | export const getCachedThread = (state, threadID) => state.cache.thread[threadID] 2 | -------------------------------------------------------------------------------- /app/sass/__icons__/lurka.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/__icons__/lurka.woff -------------------------------------------------------------------------------- /app/sass/fonts/Lato-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/Lato-Regular.ttf -------------------------------------------------------------------------------- /app/sass/fonts/Lurka-Icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/Lurka-Icons.ttf -------------------------------------------------------------------------------- /app/sass/fonts/Lurka-Icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/Lurka-Icons.woff -------------------------------------------------------------------------------- /public/images/alert-info2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/alert-info2.png -------------------------------------------------------------------------------- /public/images/alert-info3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/alert-info3.png -------------------------------------------------------------------------------- /app/components/elements/TimeAgo/TimeAgo.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .TimeAgo 4 | +clickable 5 | -------------------------------------------------------------------------------- /app/sass/fonts/FaricyNew-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/FaricyNew-Bold.ttf -------------------------------------------------------------------------------- /app/sass/fonts/OpenSans-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/OpenSans-Bold.ttf -------------------------------------------------------------------------------- /app/sass/fonts/OpenSans-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/OpenSans-Light.ttf -------------------------------------------------------------------------------- /app/services/Alerts/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | type: 'info', 3 | time: 4000, 4 | icon: false 5 | } 6 | -------------------------------------------------------------------------------- /app/api/index.js: -------------------------------------------------------------------------------- 1 | import Api from './api' 2 | import client from './client'; 3 | 4 | export default new Api(client) 5 | -------------------------------------------------------------------------------- /app/events/index.js: -------------------------------------------------------------------------------- 1 | export * from './publishers' 2 | export * from './subscribers' 3 | export * as types from './types' 4 | -------------------------------------------------------------------------------- /app/sass/fonts/FaricyNew-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/FaricyNew-Light.ttf -------------------------------------------------------------------------------- /app/sass/fonts/FaricyNew-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/FaricyNew-Regular.ttf -------------------------------------------------------------------------------- /app/sass/fonts/OpenSans-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/OpenSans-Regular.ttf -------------------------------------------------------------------------------- /app/sass/fonts/OpenSans-Semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/OpenSans-Semibold.ttf -------------------------------------------------------------------------------- /app/sass/fonts/Raleway-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/Raleway-Regular.ttf -------------------------------------------------------------------------------- /public/images/logo_old/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/logo_old/favicon.ico -------------------------------------------------------------------------------- /public/images/logo_old/logo_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/logo_old/logo_old.png -------------------------------------------------------------------------------- /app/sass/fonts/OpenSans-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/app/sass/fonts/OpenSans-ExtraBold.ttf -------------------------------------------------------------------------------- /public/images/logo_old2/logo_old2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/logo_old2/logo_old2.png -------------------------------------------------------------------------------- /public/images/backgrounds/dark_wall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/backgrounds/dark_wall.png -------------------------------------------------------------------------------- /public/images/logo_old/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/logo_old/favicon-16x16.png -------------------------------------------------------------------------------- /public/images/logo_old/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/logo_old/favicon-32x32.png -------------------------------------------------------------------------------- /app/sass/__themes__/_dark.sass: -------------------------------------------------------------------------------- 1 | @import 'dark/greys' 2 | @import 'dark/base_colors' 3 | @import 'dark/dark' 4 | @import 'dark/palette' 5 | -------------------------------------------------------------------------------- /public/images/logo_old/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/logo_old/apple-touch-icon.png -------------------------------------------------------------------------------- /public/notes/electronpackage.txt: -------------------------------------------------------------------------------- 1 | /* Electron package */ 2 | architectures: ia32, x64, armv7l 3 | platforms: linux, win32, darwin, mas 4 | -------------------------------------------------------------------------------- /app/modules/Post/config.js: -------------------------------------------------------------------------------- 1 | export const postOverlayBreakpoint = 999999999 2 | 3 | export default { 4 | postOverlayBreakpoint 5 | } 6 | -------------------------------------------------------------------------------- /app/sass/utils/mixins/_hover.sass: -------------------------------------------------------------------------------- 1 | =hover-color($color) 2 | transition: color .1s $bezier-fast 3 | &:hover 4 | color: $color 5 | -------------------------------------------------------------------------------- /app/modules/Board/components/NoSearchResults/NoSearchResults.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .NoSearchResults 4 | text-align: center 5 | -------------------------------------------------------------------------------- /public/images/logo_old/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AdamSalma/Lurka/HEAD/public/images/logo_old/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/notes/delays.js: -------------------------------------------------------------------------------- 1 | const delays = [10, 15, 20, 30, 60, 90, 120, 180, 240, 300]; 2 | const diff = [ 0, 5, 5, 10, 30, 30, 30, 60, 60, 60]; 3 | -------------------------------------------------------------------------------- /app/components/layout/Container/Container.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .Container 4 | padding: 60px 15px 0 5 | position: relative 6 | -------------------------------------------------------------------------------- /app/modules/Dashboard/components/index.js: -------------------------------------------------------------------------------- 1 | export {default as BoardListItem} from './BoardListItem' 2 | export {default as HomeBoard} from './HomeBoard' 3 | -------------------------------------------------------------------------------- /app/modules/Panels/components/index.js: -------------------------------------------------------------------------------- 1 | export {default as ClassTransition} from './ClassTransition' 2 | export {default as SlideTransition} from './SlideTransition' 3 | -------------------------------------------------------------------------------- /app/redux/actions/cinema/index.js: -------------------------------------------------------------------------------- 1 | export {default as toggleCinema} from './toggleCinema' 2 | export {default as cycleCinemaTimeline} from './cycleCinemaTimeline' 3 | -------------------------------------------------------------------------------- /app/events/subscribers.test.js: -------------------------------------------------------------------------------- 1 | import subscribers from './subscribers'; 2 | 3 | export default createSuite('Subscribers', () => { 4 | var dispatched; 5 | 6 | }); 7 | -------------------------------------------------------------------------------- /app/api/client.js: -------------------------------------------------------------------------------- 1 | import Axios from 'axios' 2 | 3 | const client = Axios.create() 4 | 5 | // Apply defaults here 6 | // client.defaults.X = Y 7 | 8 | export default client 9 | -------------------------------------------------------------------------------- /app/components/media/DualMedia/DualMedia.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .dual-media 4 | &.toggled 5 | .dual-media-thumbnail 6 | display: none 7 | -------------------------------------------------------------------------------- /app/sass/utils/mixins/_color.sass: -------------------------------------------------------------------------------- 1 | =gradient($color) 2 | $tint: darken($color, 5%) 3 | background: $color 4 | background: linear-gradient(to top left, $tint, $color, $tint) 5 | -------------------------------------------------------------------------------- /app/modules/Header/index.js: -------------------------------------------------------------------------------- 1 | import {MainHeader, SubHeader, DynamicHeader} from "./containers"; 2 | 3 | export default {containers: { 4 | MainHeader, SubHeader, DynamicHeader 5 | }} 6 | -------------------------------------------------------------------------------- /app/services/Alerts/styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .react-alerts 4 | // top: $header-height !important 5 | // left: 44px !important 6 | // margin-top: 0px !important 7 | -------------------------------------------------------------------------------- /app/services/Alerts/connect.js: -------------------------------------------------------------------------------- 1 | import { connect } from 'react-redux'; 2 | 3 | export default connect( 4 | ({status}) => ({ 5 | alertMessage: status.alertMessage 6 | }) 7 | ) 8 | -------------------------------------------------------------------------------- /config/environment.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Runtime environment flags 3 | */ 4 | process.env.ELECTRON = process && process.versions && process.versions['electron'] 5 | process.env.CHROME = !!window.chrome 6 | -------------------------------------------------------------------------------- /app/redux/actions/watcher/index.js: -------------------------------------------------------------------------------- 1 | export updateWatchEntity from './updateWatchEntity'; 2 | export addWatchEntity from './addWatchEntity'; 3 | export removeWatchEntity from './removeWatchEntity'; 4 | -------------------------------------------------------------------------------- /app/services/Alerts/AlertIcons.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | // Uses aliases ( /public/images ) 3 | 4 | export const AlertInfo = () => ( 5 | 6 | ) 7 | -------------------------------------------------------------------------------- /app/components/elements/ButtonCircle/Circle/Circle.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .Circle 4 | display: block 5 | border-radius: 50% 6 | background-color: skyblue 7 | +square(34px) 8 | -------------------------------------------------------------------------------- /app/modules/Thread/containers/index.js: -------------------------------------------------------------------------------- 1 | export {default as ThreadPost} from './ThreadPost'; 2 | export {default as ThreadPosts} from './ThreadPosts'; 3 | export {default as ThreadControls} from './ThreadControls'; 4 | -------------------------------------------------------------------------------- /app/components/index.js: -------------------------------------------------------------------------------- 1 | export * from './elements' 2 | export * from './form' 3 | export * from './other' 4 | export * from './grid' 5 | export * from './interaction' 6 | export * from './layout' 7 | export * from './media' 8 | -------------------------------------------------------------------------------- /app/components/interaction/Spinners/index.js: -------------------------------------------------------------------------------- 1 | export {default as SquareSpinner} from './SquareSpinner' 2 | export {default as CircleSpinner} from './CircleSpinner' 3 | export {default as VideoSpinner} from './VideoSpinner' 4 | -------------------------------------------------------------------------------- /app/modules/Header/containers/index.js: -------------------------------------------------------------------------------- 1 | // export {default as MainHeader} from './MainHeader'; 2 | // export {default as SubHeader} from './SubHeader'; 3 | export {default as DynamicHeader} from './DynamicHeader'; 4 | 5 | 6 | -------------------------------------------------------------------------------- /config/mocha/mocha.opts: -------------------------------------------------------------------------------- 1 | --compilers js:babel-core/register 2 | -r config/mocha/setup.js 3 | -r config/globals 4 | -r app/utils/logger 5 | --use_strict 6 | --colors 7 | --debug 8 | --no-exit 9 | ./app/**/*.test.* 10 | -------------------------------------------------------------------------------- /app/components/interaction/ContextMenus/index.js: -------------------------------------------------------------------------------- 1 | import './styles' 2 | 3 | export { default as ThreadImageContextMenu } from './ThreadImageContextMenu' 4 | export { default as ThreadPostContextMenu } from './ThreadPostContextMenu' 5 | -------------------------------------------------------------------------------- /config/gulp/index.js: -------------------------------------------------------------------------------- 1 | // Some of the tasks use `require('config')` which is an 2 | // alias defined in .babelrc 3 | // which is why they need access to .babelrc through es6: 4 | require('babel-register'); 5 | require('./gulpfile'); 6 | -------------------------------------------------------------------------------- /app/redux/actions/__tests__/index.suite.js: -------------------------------------------------------------------------------- 1 | import boardTests from './board.test'; 2 | import boardListTests from './boardlist.test'; 3 | 4 | export default createSuite("Actions", () => { 5 | boardTests(); 6 | boardListTests(); 7 | }) 8 | -------------------------------------------------------------------------------- /app/components/elements/Pipe/Pipe.jsx: -------------------------------------------------------------------------------- 1 | import './Pipe.styles' 2 | import React from "react" 3 | 4 | export default ({ className }) => { 5 | return
9 | } 10 | -------------------------------------------------------------------------------- /app/components/layout/LineBreak/Line.jsx: -------------------------------------------------------------------------------- 1 | import './Line.styles' 2 | import React from "react" 3 | 4 | export default ({ className }) => { 5 | return
9 | } 10 | -------------------------------------------------------------------------------- /app/modules/Board/assemblies/index.js: -------------------------------------------------------------------------------- 1 | export {default as BoardPost} from './BoardPost' 2 | export {default as BoardHeader} from './BoardHeader' 3 | export {default as BoardToolbar} from './BoardToolbar' 4 | export {default as PageGrid} from './PageGrid' 5 | -------------------------------------------------------------------------------- /app/modules/Panels/BookmarksPanel/styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .BookmarksPanel 4 | // +center(50vh) 5 | background: green 6 | text-align: center 7 | padding: 80px 30px 8 | position: absolute 9 | right: 0 10 | -------------------------------------------------------------------------------- /app/events/setup.js: -------------------------------------------------------------------------------- 1 | import PubSubEs6 from 'pub-sub-es6'; 2 | 3 | PubSubEs6.config.trace = { 4 | dispatch: false, 5 | receive: false, 6 | unsubscribe: false, 7 | not_found_subscriber: false 8 | }; 9 | 10 | global.PubSub = PubSubEs6 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | *.sublime* 4 | *.stackdump 5 | github_token.txt 6 | 7 | # Build folder: everything except 8 | build/* 9 | !build/package.json 10 | !build/index.js 11 | 12 | __img__/ 13 | dist/ 14 | 15 | 16 | package-lock\.json 17 | -------------------------------------------------------------------------------- /app/sass/utils/mixins/_text.sass: -------------------------------------------------------------------------------- 1 | =clickable 2 | cursor: pointer 3 | 4 | =no-select() 5 | user-select: none 6 | 7 | =ellipsis() 8 | text-overflow: ellipsis 9 | word-wrap: break-word 10 | white-space: nowrap 11 | overflow: hidden 12 | -------------------------------------------------------------------------------- /app/events/index.test.js: -------------------------------------------------------------------------------- 1 | import publishers from './publishers.test' 2 | import subscribers from './subscribers.test' 3 | import types from './types.test' 4 | 5 | describe("Events", () => { 6 | publishers() 7 | subscribers() 8 | types() 9 | }) 10 | -------------------------------------------------------------------------------- /electron/setup.js: -------------------------------------------------------------------------------- 1 | // Set global configuration 2 | global.config = require('config'); 3 | 4 | const { app_modules } = require('config/paths'); 5 | 6 | // Enable electron to access app dependencies (not just dev-deps) 7 | require('module').globalPaths.push(app_modules); 8 | -------------------------------------------------------------------------------- /app/modules/Dashboard/containers/index.js: -------------------------------------------------------------------------------- 1 | // export {default as BoardList} from './BoardList' 2 | export {default as BoardSelection} from './BoardSelection' 3 | export {default as BoardSearch} from './BoardSearch' 4 | export {default as FavouriteBoards} from './FavouriteBoards' 5 | -------------------------------------------------------------------------------- /app/redux/actions/api/index.js: -------------------------------------------------------------------------------- 1 | export {default as fetchBoard} from './fetchBoard'; 2 | export {default as fetchThread} from './fetchThread'; 3 | export {default as fetchBoardList} from './fetchBoardList'; 4 | 5 | export {default as submitThreadPost} from './submitThreadPost'; 6 | -------------------------------------------------------------------------------- /app/redux/selectors/status.js: -------------------------------------------------------------------------------- 1 | import { createSelector } from 'reselect' 2 | 3 | export const getAlertMessage = state => state.status.alertMessage 4 | 5 | export const getThreadID = (state) => state.status.threadID 6 | export const getBoardID = (state) => state.status.boardID 7 | -------------------------------------------------------------------------------- /config/errors.js: -------------------------------------------------------------------------------- 1 | module.exports = module.exports.default = { 2 | apiNoResponse: "No response from 4chan. (Are you connected to the internet?)", 3 | apiInternalError: "Internal error occured while preparing to make request. Contact developers if error persists." 4 | } 5 | -------------------------------------------------------------------------------- /app/components/elements/Pipe/Pipe.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .Pipe 4 | padding: 0 5 | 6 | &::after 7 | content: "" 8 | border-right: 1px solid var(--divider) 9 | height: 100% 10 | box-shadow: 0 0 2px var(--divider) 11 | -------------------------------------------------------------------------------- /app/components/layout/Tabs/TabEffects.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cx from 'classnames'; 3 | 4 | export const BarSlideTab = ({ children, isActive }) => ( 5 |
6 | {children} 7 |
8 | ) 9 | -------------------------------------------------------------------------------- /app/redux/index.test.js: -------------------------------------------------------------------------------- 1 | import glob from 'glob' 2 | import path from 'path' 3 | 4 | describe("Redux", () => { 5 | glob.sync('**/*.suite.*', { 6 | cwd: __dirname, absolute: true 7 | }).map(test => { 8 | require(test).default(); 9 | }) 10 | }) 11 | -------------------------------------------------------------------------------- /app/modules/Cinema/components/index.js: -------------------------------------------------------------------------------- 1 | export {default as CurrentMedia} from './CurrentMedia' 2 | export {default as NextMediaButton} from './NextMediaButton' 3 | export {default as PreviousMediaButton} from './PreviousMediaButton' 4 | export {default as CloseCinema} from './CloseCinema' 5 | -------------------------------------------------------------------------------- /app/components/other/index.js: -------------------------------------------------------------------------------- 1 | export {default as Timer} from './Timer' 2 | export {default as ToggleOnClick} from './ToggleOnClick' 3 | 4 | // Theme stuff 5 | export {default as injectTheme} from './Theme/injectTheme' 6 | export {default as ThemeProvider} from './Theme/ThemeProvider' 7 | 8 | -------------------------------------------------------------------------------- /app/modules/Header/components/IconGroup/IconGroup.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .IconGroup 4 | display: block 5 | line-height: 100% 6 | padding: 0 4px 7 | 8 | .Icon 9 | color: var(--textPrimary) 10 | text-shadow: 2px 2px 1px $grey-darkest 11 | -------------------------------------------------------------------------------- /app/redux/actions/index.js: -------------------------------------------------------------------------------- 1 | // Only default functions are exposed for every directory 2 | export * from './api'; 3 | export * from './board'; 4 | export * from './cache'; 5 | export * from './cinema'; 6 | export * from './settings'; 7 | export * from './thread'; 8 | export * from './watcher'; 9 | -------------------------------------------------------------------------------- /app/components/media/index.js: -------------------------------------------------------------------------------- 1 | export {default as DualMedia} from './DualMedia' 2 | export {default as Image} from './Image' 3 | export {default as ExpandedImage} from './ExpandedImage' 4 | export {default as ImageWithChild} from './ImageWithChild' 5 | export {default as Video} from './Video' 6 | 7 | -------------------------------------------------------------------------------- /app/modules/Header/components/VerticallyTitledIcon/VerticallyTitledIcon.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .VerticallyTitledIcon 4 | +clickable 5 | font-size: $subheader-font-size 6 | padding-right: 16px 7 | color: var(--textSecondary) 8 | transition: color .2s ease-out 9 | -------------------------------------------------------------------------------- /app/redux/actions/thread/index.js: -------------------------------------------------------------------------------- 1 | export {default as destroyThread} from './destroyThread'; 2 | export {default as monitorThread} from './monitorThread'; 3 | export {default as unmonitorThread} from './unmonitorThread'; 4 | export {default as updateMonitoredThread} from './updateMonitoredThread'; 5 | -------------------------------------------------------------------------------- /electron/events/handleRedirect.js: -------------------------------------------------------------------------------- 1 | import open from 'open'; 2 | 3 | // Open links in external application (browser) 4 | const handleRedirect = (e, url) => { 5 | console.warn("Opening " + url) 6 | e.preventDefault() 7 | open(url) 8 | } 9 | 10 | export default handleRedirect 11 | -------------------------------------------------------------------------------- /electron/index.js: -------------------------------------------------------------------------------- 1 | if (process.env.NODE_ENV !== "production") { 2 | // Enable es6+ 3 | console.log('Registring babel'); 4 | require('babel-register'); 5 | } 6 | 7 | // Set global variables etc 8 | require('./setup'); 9 | 10 | // Start the application 11 | require('./app'); 12 | -------------------------------------------------------------------------------- /app/api/parser/index.js: -------------------------------------------------------------------------------- 1 | import parseThread from './thread' 2 | import parseBoard from './board' 3 | import parseBoardList from './boardlist' 4 | // export {default as parseArchive} from './archive' 5 | 6 | export default { 7 | parseThread, 8 | parseBoard, 9 | parseBoardList 10 | } 11 | -------------------------------------------------------------------------------- /app/redux/actions/alert.js: -------------------------------------------------------------------------------- 1 | import * as types from '../types' 2 | 3 | 4 | export function alertMessage( message ) { 5 | console.info(`Action alertMessage(): ${message.message}`); 6 | 7 | return { 8 | type: types.ALERT_MESSAGE, 9 | payload: message 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /config/README: -------------------------------------------------------------------------------- 1 | # Lurka/tools 2 | 3 | A collection of tools that is used to build and test Lurka. 4 | 5 | ### Mocha -> Test utils (Tests are alongside src code) 6 | ### Webpack -> Code bundling (joining all depenencies into a single file) 7 | ### Gulp -> Code packaging (Into electron distributables) 8 | -------------------------------------------------------------------------------- /app/components/layout/Tabs/styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .TabGroup 4 | display: flex 5 | flex-direction: column 6 | +size(inherit) 7 | 8 | .TabBar 9 | display: flex 10 | justify-content: space-around 11 | 12 | .Tab 13 | padding: .5em 1em 14 | -------------------------------------------------------------------------------- /app/components/layout/index.js: -------------------------------------------------------------------------------- 1 | export {default as Container} from './Container' 2 | export {default as Line} from './LineBreak' 3 | export {default as Modal} from './Modal' 4 | export {default as Scrollable} from './Scrollable' 5 | export {default as Tabs} from './Tabs' 6 | export * as Parallax from './Parallax' 7 | -------------------------------------------------------------------------------- /app/modules/Thread/components/Controllers/index.js: -------------------------------------------------------------------------------- 1 | export {default as WatchController} from './WatchController' 2 | export {default as BookmarkController} from './BookmarkController' 3 | export {default as CommentController} from './CommentController' 4 | export {default as UpdateController} from './UpdateController' 5 | -------------------------------------------------------------------------------- /app/redux/selectors/index.js: -------------------------------------------------------------------------------- 1 | export * from './board' 2 | export * from './boardlist' 3 | export * from './cache' // TODO: delete this 4 | export * from './cinema' 5 | export * from './post' 6 | export * from './settings' 7 | export * from './status' 8 | export * from './thread' 9 | export * from './watcher' 10 | -------------------------------------------------------------------------------- /app/modules/Thread/components/Comment.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {setHTML} from '~/utils/react'; 3 | 4 | const Comment = ({ comment }) => { 5 | return ( 6 |
7 | ); 8 | }; 9 | 10 | Comment.displayName = 'Comment'; 11 | 12 | export default Comment; 13 | -------------------------------------------------------------------------------- /app/modules/index.test.js: -------------------------------------------------------------------------------- 1 | import glob from 'glob' 2 | import path from 'path' 3 | 4 | describe("Containers", () => { 5 | glob.sync('**/index.suite.*', { 6 | cwd: __dirname, absolute: true 7 | }).map(suite => { 8 | console.error(suite) 9 | require(suite).default(); 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /app/components/media/Video/aria-label.js: -------------------------------------------------------------------------------- 1 | const aria = { 2 | play: 'Play video', 3 | pause: 'Pause video', 4 | mute: 'Mute video', 5 | unmute: 'Unmute video', 6 | fullscreen: 'View video fullscreen', 7 | seek: 'Seek video', 8 | captions: 'Toggle captions' 9 | }; 10 | 11 | export default aria; 12 | -------------------------------------------------------------------------------- /app/modules/Dashboard/containers/BoardList/BoardList.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .BoardList 4 | width: 600px 5 | height: 30vh 6 | top: 0 7 | left: 2vw 8 | margin: 0 auto 9 | position: absolute 10 | background-color: $grey-dark 11 | box-shadow: 0 1px 5px $grey-darkest 12 | 13 | -------------------------------------------------------------------------------- /config/alerts.js: -------------------------------------------------------------------------------- 1 | module.exports = module.exports.default = { 2 | watchEntityAlreadyRemoved: (entityId) => { 3 | return { 4 | 'message': `Entity '${entityId}' is already removed from watch list.`, 5 | 'type': 'warning', 6 | 'duration': 5000 7 | } 8 | }, 9 | 10 | } 11 | -------------------------------------------------------------------------------- /app/components/__old__/ScrollableList/ScrollableList.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .ScrollableList 4 | 5 | &__container 6 | height: 100% 7 | width: 100% 8 | 9 | &:first-child 10 | margin-top: 24px 11 | 12 | &__item 13 | width: 100% 14 | display: block 15 | -------------------------------------------------------------------------------- /app/sass/utils/mixins/_maths.sass: -------------------------------------------------------------------------------- 1 | // Integers only 2 | @function pow($number, $exp) 3 | $value: 1 4 | 5 | @if $exp > 0 6 | @for $i from 1 through $exp 7 | $value: $value * $number 8 | 9 | @else if $exp < 0 10 | @for $i from 1 through -$exp 11 | $value: $value / $number 12 | 13 | @return $value 14 | -------------------------------------------------------------------------------- /app/modules/__Navbar/BoardInfo/BoardInfo.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | $board-info-width: 300px 4 | $board-info-background-color: $grey-lightest 5 | 6 | .BoardInfo 7 | position: absolute 8 | left: 100% 9 | padding: 6px 12px 10 | width: $board-info-width 11 | background: $board-info-background-color 12 | -------------------------------------------------------------------------------- /app/modules/Thread/components/PostID/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import './styles'; 4 | 5 | const PostID = ({ id, tooltip, tooltipPosition="top", className, onClick }) => { 6 | return ( 7 | #{id} 8 | ); 9 | }; 10 | 11 | PostID.displayName = 'PostID'; 12 | 13 | export default PostID; 14 | -------------------------------------------------------------------------------- /app/redux/actions/board/index.js: -------------------------------------------------------------------------------- 1 | export {default as searchBoard} from './searchBoard' 2 | export {default as sortBoard} from './sortBoard' 3 | export {default as destroyBoard} from './destroyBoard' 4 | export {default as addBoardToFavourites} from './addBoardToFavourites' 5 | export {default as removeBoardFromFavourites} from './removeBoardFromFavourites' 6 | -------------------------------------------------------------------------------- /app/redux/actions/thread/destroyThread.js: -------------------------------------------------------------------------------- 1 | import * as types from '~/redux/types'; 2 | 3 | export default function destroyThread () { 4 | return dispatch => { 5 | dispatch(threadDestroyed()); 6 | } 7 | } 8 | 9 | export function threadDestroyed () { 10 | return { 11 | type: types.THREAD_DESTROYED 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /app/sass/base.scss: -------------------------------------------------------------------------------- 1 | // Sass Utilities 2 | @import 'utils'; 3 | 4 | // Vendors 5 | @import "vendor/bootstrap-reboot"; 6 | @import "vendor/nanoscroll"; 7 | 8 | // Fonts 9 | @import 'base/typography'; 10 | @import 'base/icons'; 11 | 12 | // Core styles 13 | @import 'base/reset'; 14 | @import 'base/animations'; 15 | @import 'base/classes'; 16 | 17 | -------------------------------------------------------------------------------- /app/components/elements/Logo/Logo.jsx: -------------------------------------------------------------------------------- 1 | import './Logo.styles' 2 | import React from "react" 3 | import cx from 'classnames' 4 | 5 | const Logo = ({ className }) => ( 6 |
7 | logo 8 |
9 | ) 10 | 11 | export default Logo 12 | -------------------------------------------------------------------------------- /app/components/elements/Counter/Counter.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import classes from "classnames"; 3 | 4 | export default ({value, className}) => { 5 | const counterClasses = classes(className, "counter") 6 | return ( 7 |
8 | {value} 9 |
10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /app/sass/utils.scss: -------------------------------------------------------------------------------- 1 | @import 'variables'; 2 | 3 | // Grid library 4 | @import 'vendor/neutron'; 5 | 6 | // Themes + color palettes 7 | // @import 'utils/themes'; 8 | 9 | 10 | // Other sass helpers 11 | @import 'utils/functions'; 12 | @import 'utils/mixins'; 13 | @import 'utils/animations'; 14 | @import 'utils/typography'; 15 | @import 'utils/z-index'; 16 | -------------------------------------------------------------------------------- /app/components/elements/Logo/Logo.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .Logo 4 | position: relative 5 | backface-visibility: hidden 6 | width: $header-height - 4 7 | height: $header-height - 4 8 | display: inline-block 9 | cursor: pointer 10 | +no-select 11 | 12 | .Logo__content 13 | width: 100% 14 | display: block 15 | -------------------------------------------------------------------------------- /app/modules/Board/components/BoardSearch/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './styles'; 3 | 4 | import { SearchBarWithIcons } from '~/components'; 5 | 6 | const BoardSearch = ({ ...props }) => ( 7 | 8 | ); 9 | 10 | BoardSearch.displayName = 'BoardSearch'; 11 | 12 | export default BoardSearch; 13 | -------------------------------------------------------------------------------- /app/modules/Board/components/BoardToolbarMetadata/BoardToolbarMetadata.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .BoardToolbarMetadata 4 | font-size: $subheader-font-size 5 | color: var(--textSecondary) 6 | 7 | > div 8 | display: inline-block 9 | padding-right: 16px / $golden-ratio 10 | 11 | .highlight 12 | color: $primary-light 13 | -------------------------------------------------------------------------------- /app/modules/Panels/index.js: -------------------------------------------------------------------------------- 1 | import WatchPanel from './WatchPanel' 2 | import BookmarksPanel from './BookmarksPanel' 3 | // import ArchivePanel from './ArchivePanel' 4 | import SettingsPanel from './SettingsPanel' 5 | import MenuPanel from './MenuPanel' 6 | 7 | export default { 8 | WatchPanel, 9 | BookmarksPanel, 10 | SettingsPanel, 11 | MenuPanel 12 | } 13 | -------------------------------------------------------------------------------- /app/components/elements/Card/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cx from 'classnames'; 3 | 4 | import './styles'; 5 | import mapPropsToClasses from './classes'; 6 | 7 | const Card = (props) => { 8 | return
; 11 | }; 12 | 13 | Card.displayName = 'Card'; 14 | 15 | export default Card; 16 | -------------------------------------------------------------------------------- /app/components/media/Video/elements/index.js: -------------------------------------------------------------------------------- 1 | export {default as Time} from './Time'; 2 | export {default as Seek} from './Seek'; 3 | export {default as Volume} from './Volume'; 4 | export {default as PlayPause} from './PlayPause'; 5 | export {default as Fullscreen} from './FullScreen'; 6 | export {default as Overlay} from './Overlay'; 7 | export {default as Download} from './Download'; 8 | -------------------------------------------------------------------------------- /app/redux/selectors/post.js: -------------------------------------------------------------------------------- 1 | import { createSelector } from 'reselect' 2 | 3 | export const getPostIsOpen = state => state.post.isOpen 4 | export const getPostPosition = () => { 5 | const {postPositionLeftBreakpoint} = Lurka.settings; 6 | 7 | if (window.innerWidth < postPositionLeftBreakpoint) { 8 | return "center" 9 | } 10 | 11 | return "left" 12 | } 13 | -------------------------------------------------------------------------------- /app/components/elements/Card/classes.js: -------------------------------------------------------------------------------- 1 | import { createPropToClassMapper } from '~/utils/react'; 2 | 3 | export default createPropToClassMapper("Card", { 4 | size: { 5 | "small": "Card__size-small", 6 | "medium": "Card__size-medium", 7 | "large": "Card__size-large", 8 | }, 9 | isActive: { 10 | true: "Card__is-active" 11 | } 12 | }) 13 | -------------------------------------------------------------------------------- /app/components/interaction/Spinners/VideoSpinner/Spinner.jsx: -------------------------------------------------------------------------------- 1 | import './Spinner.styles' 2 | import React from 'react'; 3 | import cx from 'classnames'; 4 | 5 | export default ({ isSpinning=true, className }) => { 6 | const spinnerClasses = cx("VideoSpinner", className, { 7 | "Spinner-active": isSpinning 8 | }) 9 | 10 | return
11 | } 12 | -------------------------------------------------------------------------------- /app/sass/utils/mixins.sass: -------------------------------------------------------------------------------- 1 | @import 'mixins/maths' 2 | 3 | @import "mixins/color" 4 | @import "mixins/hover" 5 | @import "mixins/ease" 6 | @import "mixins/icon" 7 | @import "mixins/nano" 8 | @import "mixins/other" 9 | @import 'mixins/padding' 10 | @import 'mixins/fontsize' 11 | @import "mixins/position" 12 | @import "mixins/shadow" 13 | @import "mixins/size" 14 | @import "mixins/text" 15 | -------------------------------------------------------------------------------- /app/sass/utils/mixins/_icon.sass: -------------------------------------------------------------------------------- 1 | =center-icon 2 | display: table-cell 3 | vertical-align: middle 4 | text-align: center 5 | 6 | =pseudo-circle($size, $color) 7 | position: relative 8 | &::after 9 | content: '' 10 | z-index: -1 // to not mess with icons 11 | +circle($size) 12 | position: absolute 13 | background-color: $color 14 | -------------------------------------------------------------------------------- /app/components/interaction/Spinners/SquareSpinner/Spinner.jsx: -------------------------------------------------------------------------------- 1 | import './Spinner.styles' 2 | import React from 'react'; 3 | import classes from 'classnames'; 4 | 5 | export default ({ isSpinning=true, className}) => { 6 | const spinnerClasses = classes("Spinner", className, { 7 | "Spinner-active": isSpinning 8 | }) 9 | 10 | return
11 | } 12 | -------------------------------------------------------------------------------- /app/redux/selectors/thread.js: -------------------------------------------------------------------------------- 1 | export const getThreadPosts = (state) => state.thread.posts; 2 | export const getThreadReceivedAt = (state) => state.thread.receivedAt; 3 | 4 | // export const getWatchMetadata = (state) => state.watch.threads; 5 | 6 | export const isThreadBeingWatched = (state, threadID) => 7 | !!getMonitoredThreads(state) 8 | .find(thread => thread.threadID === threadID) 9 | -------------------------------------------------------------------------------- /app/components/interaction/ActionButton/styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .ActionButton 4 | +box-shadow(3) 5 | font-family: $font-main-light 6 | background: transparent 7 | outline: none 8 | border: $primary solid 1px 9 | border-radius: 8px 10 | color: var(--textPrimary) 11 | line-height: 1 12 | position: relative 13 | +clickable 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /app/modules/Board/components/BoardSpinner/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './styles'; 3 | import {CircleSpinner as Spinner} from '~/components' 4 | 5 | const BoardSpinner = () => 6 |
7 | 8 |
9 | 10 | BoardSpinner.displayName = 'BoardSpinner'; 11 | 12 | export default BoardSpinner; 13 | -------------------------------------------------------------------------------- /app/components/form/index.js: -------------------------------------------------------------------------------- 1 | export {default as Checkbox} from './Checkbox' 2 | export {default as FileInput} from './FileInput' 3 | export {default as RadioGroup} from './RadioGroup' 4 | export {default as SearchBar} from './SearchBar' 5 | export {default as SearchBarWithIcons} from './SearchBarWithIcons' 6 | export {default as TextArea} from './TextArea' 7 | export {default as TextField} from './TextField' 8 | -------------------------------------------------------------------------------- /app/modules/Thread/components/Title.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import { setHTML } from '~/utils/react' 3 | 4 | const Title = ({ title }) => { 5 | return title ? ( 6 | 7 | 8 | 9 | 10 | ) : null 11 | } 12 | 13 | Title.displayName = 'Title' 14 | 15 | export default Title 16 | -------------------------------------------------------------------------------- /app/modules/Header/components/HeaderGroup/HeaderGroup.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import cx from 'classnames' 3 | 4 | import './HeaderGroup.styles' 5 | import { Tooltip } from '~/components' 6 | 7 | export default ({children, className, ...restProps}) => { 8 | return ( 9 |
10 | {children} 11 |
12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /app/modules/Header/components/HeaderItem/HeaderItem.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import cx from 'classnames' 3 | 4 | import './HeaderItem.styles' 5 | import Tooltip from '~/components/Tooltip' 6 | 7 | export default ({children, className, ...restProps}) => { 8 | return ( 9 |
10 | {children} 11 |
12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /app/sass/utils/mixins/_fontsize.sass: -------------------------------------------------------------------------------- 1 | $font-ratio: $golden-ratio // 1.618... 2 | $font-ratio: 1.5 // perfect fifth 3 | $font-ratio: 1.25 // major third 4 | $font-ratio: 1.125 // major second 5 | $font-ratio: 1.2 // minor third 6 | 7 | 8 | @mixin font-size($size: 0, $unit: 1rem) 9 | font-size: font-size($size, $unit) 10 | 11 | @function font-size($size, $unit) 12 | @return pow($font-ratio, $size) * $unit 13 | -------------------------------------------------------------------------------- /app/components/__old__/Hierarchy/Hierarchy.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .Hierarchy 4 | display: inline-block 5 | padding: 0 10px 6 | font-size: $font-size-large 7 | 8 | li 9 | display: inline-block 10 | 11 | span 12 | margin: 0 2px 13 | color: var(--textSecondary) 14 | font-family: Consolas 15 | 16 | .threadID 17 | font-family: for-for(Hierarchy__threadID) 18 | -------------------------------------------------------------------------------- /app/components/form/RadioGroup/Radio.jsx: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import cx from 'classnames' 3 | 4 | const Radio = ({ isActive }) => { 5 | return ( 6 |
9 |
10 |
11 | ); 12 | }; 13 | 14 | Radio.displayName = 'Radio'; 15 | 16 | export default Radio; 17 | -------------------------------------------------------------------------------- /app/views/CinemaView.jsx: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import cx from 'classnames' 3 | 4 | import Cinema from '~/modules/Cinema'; 5 | 6 | const CinemaView = ({ className }) => { 7 | return ( 8 |
9 | 10 |
11 | ); 12 | }; 13 | 14 | CinemaView.displayName = 'CinemaView'; 15 | 16 | export default CinemaView; 17 | -------------------------------------------------------------------------------- /app/components/__old__/App/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Provider } from 'react-redux'; 3 | import store from '~/redux/store'; 4 | 5 | import Views from '~/views'; 6 | import Services from '~/services' 7 | 8 | const App = () => ( 9 | 10 |
11 | 12 | 13 |
14 |
15 | ); 16 | 17 | export default App; 18 | -------------------------------------------------------------------------------- /app/modules/Board/components/BoardMetadata/styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .BoardMetadata 4 | width: 100vw 5 | margin: 0 auto 6 | padding: 0 60px 7 | +padding-top(2) 8 | display: flex 9 | justify-content: space-between 10 | font-size: $subheader-font-size 11 | color: var(--textSecondary) 12 | 13 | .highlight 14 | color: $primary-light 15 | 16 | .stat 17 | margin-left: 8px 18 | -------------------------------------------------------------------------------- /app/modules/Board/components/TitledIcon/TitledIcon.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cx from 'classnames'; 3 | import './TitledIcon.styles'; 4 | 5 | import {Icon} from '~/components'; 6 | 7 | export default function TitledIcon ({ name, title, className }) { 8 | return
9 | 10 | {title} 11 |
12 | } 13 | -------------------------------------------------------------------------------- /app/modules/Header/components/TitledIcon/TitledIcon.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cx from 'classnames'; 3 | import './TitledIcon.styles'; 4 | 5 | import {Icon} from '~/components'; 6 | 7 | export default function TitledIcon ({ name, title, className }) { 8 | return
9 | 10 | {title} 11 |
12 | } 13 | -------------------------------------------------------------------------------- /app/modules/Panels/ArchivePanel/ArchivePanel.jsx: -------------------------------------------------------------------------------- 1 | import React, {Component} from 'react' 2 | import classes from 'classnames' 3 | 4 | import Panel from '../../components/Panel' 5 | 6 | 7 | export default function ArchivePanel({isActive}) { 8 | return 9 |

Archive Panel

10 |
    11 |
  • Archive
  • 12 |
13 |
14 | } 15 | -------------------------------------------------------------------------------- /app/redux/reducers/apiReducer.js: -------------------------------------------------------------------------------- 1 | import * as types from '../types' 2 | import initialState from '../initialState'; 3 | import { createReducer, mergeState } from '~/utils/redux'; 4 | 5 | export default createReducer(initialState.api, { 6 | [types.BOARD_LOADED]: (state, action) => 7 | mergeState(state, { 8 | board: { 9 | [action.receivedAt]: action.posts 10 | } 11 | }), 12 | }); 13 | -------------------------------------------------------------------------------- /config/webpack/ConsoleClearPlugin.js: -------------------------------------------------------------------------------- 1 | const clear = require('clear'); 2 | const clc = require('cli-color'); 3 | 4 | function ConsoleClearPlugin() {}; 5 | ConsoleClearPlugin.prototype.apply = function(compiler) { 6 | compiler.plugin("compile", (params) => { 7 | clear(); 8 | console.log(clc.whiteBright("\nLurka is compiling...")); 9 | }); 10 | }; 11 | 12 | module.exports = module.exports.default = ConsoleClearPlugin; 13 | -------------------------------------------------------------------------------- /app/modules/Board/tests/index.suite.js: -------------------------------------------------------------------------------- 1 | // import integrationTests from '..'; 2 | import React from 'react'; 3 | import Board from '..'; 4 | import configureStore from 'redux-mock-store' 5 | 6 | const middlewares = [] 7 | const mockStore = configureStore(middlewares) 8 | 9 | export default createSuite("Board", () => { 10 | // it("mounts", () => { 11 | // shallow(); 12 | // }); 13 | 14 | // integrationTests(); 15 | 16 | }); 17 | -------------------------------------------------------------------------------- /app/redux/reducers/settingsReducer.js: -------------------------------------------------------------------------------- 1 | import * as types from '../types' 2 | import initialState from '../initialState'; 3 | import { createReducer, mergeState } from '~/utils/redux'; 4 | 5 | export default createReducer(initialState.settings, { 6 | [types.SETTING_CHANGED]: (state, action) => 7 | mergeState(state, mergeState({}, state.external, { 8 | [action.payload.setting]: action.payload.value 9 | })) 10 | }); 11 | -------------------------------------------------------------------------------- /app/components/form/Checkbox/index.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import './styles' 3 | 4 | export default ({onChange, isChecked}) => { 5 | const uid = "p"+Date.now() 6 | return ( 7 |
8 | 12 |
14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /app/views/DashboardView.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cx from 'classnames' 3 | 4 | import Dashboard from '~/modules/Dashboard'; 5 | 6 | const DashboardView = ({ className }) => { 7 | return ( 8 |
9 | {/**/} 10 |
11 | ); 12 | }; 13 | 14 | DashboardView.displayName = 'DashboardView'; 15 | 16 | export default DashboardView; 17 | -------------------------------------------------------------------------------- /app/modules/Header/components/VerticallyTitledIcon/VerticallyTitledIcon.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cx from 'classnames'; 3 | import './VerticallyTitledIcon.styles'; 4 | 5 | import {Icon} from '~/components'; 6 | 7 | export default function VerticallyTitledIcon ({ title, children, className }) { 8 | return
9 | {children} 10 | {title} 11 |
12 | } 13 | -------------------------------------------------------------------------------- /app/redux/actions/board/searchBoard.js: -------------------------------------------------------------------------------- 1 | import * as types from '~/redux/types'; 2 | import { getBoardPosts } from '~/redux/selectors/board'; 3 | 4 | export default function searchBoard (searchTerm) { 5 | console.log("Action searchBoard()"); 6 | 7 | return dispatch => 8 | dispatch(boardSearched(searchTerm)); 9 | } 10 | 11 | export const boardSearched = (searchTerm) => ({ 12 | type: types.BOARD_SEARCHED, 13 | payload: searchTerm 14 | }) 15 | -------------------------------------------------------------------------------- /app/components/interaction/Spinners/SquareSpinner/Spinner.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .Spinner 4 | +center(80px, 80px) 5 | background-color: var(--primary) 6 | position: fixed 7 | animation: rotatespinner 1.2s infinite ease-in-out 8 | z-index: 10 9 | display: none 10 | animation-play-state: paused 11 | 12 | &.Spinner-active 13 | display: initial !important 14 | animation-play-state: running !important 15 | -------------------------------------------------------------------------------- /app/modules/Dashboard/components/HomeBoard/HomeBoard.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .HomeBoard 4 | +square(170px) 5 | position: absolute 6 | bottom: 0 7 | right: 100px 8 | background-color: #FFF 9 | font-size: 40px 10 | 11 | &__container 12 | display: table-cell 13 | vertical-align: center 14 | 15 | &__boardName 16 | color: var(--primary) 17 | &__icon 18 | color: var(--primary) 19 | 20 | -------------------------------------------------------------------------------- /app/sass/utils/mixins/_nano.sass: -------------------------------------------------------------------------------- 1 | =nano-can-expand($width) 2 | cursor: grab 3 | transition: width .24s .2s ease-in 4 | 5 | &:hover, &:active 6 | width: $width 7 | transition: width .24s ease(google, out) 8 | box-shadow: inset 2px 0 2px $grey-dark 9 | 10 | .nano-slider 11 | width: 50% 12 | margin: 0 auto 13 | 14 | =nano-rect($width:4px) 15 | width: $width 16 | border-radius: 0 !important 17 | -------------------------------------------------------------------------------- /app/components/elements/Button/Button.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cx from 'classnames'; 3 | import './Button.styles'; 4 | 5 | const Button = ({ className, children, borderAccent, ...restProps }) => { 6 | return 11 | }; 12 | 13 | Button.displayName = 'Button'; 14 | 15 | export default Button; 16 | -------------------------------------------------------------------------------- /app/components/elements/ButtonCircle/Circle/Circle.jsx: -------------------------------------------------------------------------------- 1 | import './Circle.styles' 2 | import React, { PropTypes } from 'react'; 3 | 4 | const Circle = ({ className, children }) => { 5 | return ( 6 |
7 | {children} 8 |
9 | ); 10 | }; 11 | 12 | Circle.displayName = 'Circle'; 13 | 14 | Circle.propTypes = { 15 | className: PropTypes.string, 16 | }; 17 | 18 | export default Circle; 19 | -------------------------------------------------------------------------------- /app/components/interaction/HoverUnderline/index.jsx: -------------------------------------------------------------------------------- 1 | import {cloneElement, Children} from 'react'; 2 | import cx from 'classnames'; 3 | 4 | import './styles'; 5 | 6 | const HoverUnderline = ({ className, children }) => { 7 | return cloneElement( Children.only(children), { 8 | className: cx(className, children.props.className, 'HoverUnderline') 9 | }); 10 | }; 11 | 12 | HoverUnderline.displayName = 'HoverUnderline'; 13 | 14 | export default HoverUnderline; 15 | -------------------------------------------------------------------------------- /app/modules/__Drawer__/Sort/SortPanel.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | $drawer-sort-height: 150px 4 | 5 | .SortPanel 6 | width: 100% 7 | display: block 8 | height: $drawer-sort-height 9 | 10 | &:hover h3 11 | color: var(--primary) 12 | transition: color $key-animation-duration $key-bezier-animation-out 13 | 14 | h3 15 | margin-bottom: 6px 16 | font-size: $font-size-medium 17 | color: var(--textSecondary) 18 | -------------------------------------------------------------------------------- /app/components/interaction/index.js: -------------------------------------------------------------------------------- 1 | export {default as ActionButton} from './ActionButton' 2 | export {default as Alert} from './Alert' 3 | export {default as HoverUnderline} from './HoverUnderline' 4 | export {default as Notification} from './Notification' 5 | export {default as TextSelectionPopup} from './TextSelectionPopup' 6 | export {default as Tooltip} from './Tooltip' 7 | export {default as Zoom} from './Zoom' 8 | export * from './Spinners' 9 | export * from './ContextMenus' 10 | -------------------------------------------------------------------------------- /app/modules/Header/components/HeaderButtonIcon/HeaderButtonIcon.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .HeaderButtonIcon 4 | font-size: $subheader-icon-size 5 | margin: 0 4px 6 | padding: 2px 4px 7 | background: none 8 | outline: none 9 | color: var(--textSecondary) 10 | border: none 11 | line-height: 1 12 | vertical-align: center 13 | vertical-align: middle 14 | cursor: pointer 15 | 16 | &:hover 17 | color: var(--primary) 18 | -------------------------------------------------------------------------------- /app/sass/base/_typography.sass: -------------------------------------------------------------------------------- 1 | /** 2 | * Typography 3 | * 4 | * Loops through a list of font names to generate application fonts 5 | */ 6 | 7 | @mixin create-font($font-name) 8 | @font-face 9 | font-family: $font-name 10 | src: url( $font-dir + $font-name + '.ttf' ) format('truetype') 11 | font-weight: normal 12 | font-style: normal 13 | 14 | // see /utils/typography for `$font-list` 15 | @each $font in $font-list 16 | +create-font($font) 17 | -------------------------------------------------------------------------------- /config/gulp/utils.js: -------------------------------------------------------------------------------- 1 | import { packageBuild } from './tasks' 2 | 3 | // Allows defining tasks in any order 4 | export const register = (gulp) => { 5 | gulp.registry(require("undertaker-forward-reference")()); 6 | } 7 | 8 | 9 | /** 10 | * Small helper for injecting cmd arguments to packager 11 | * @return {Function} 12 | */ 13 | export const createPackager = (platforms) => function packager(done) { 14 | return packageBuild(done, platforms.split(' ').map(p => `--${p}`)); 15 | } -------------------------------------------------------------------------------- /app/sass/README.md: -------------------------------------------------------------------------------- 1 | # sass 2 | 3 | This is the foundation of all Lurka's styles. There are two main sections: 4 | 5 | #### core 6 | Contains core styles that transpile to CSS. Imported once in `app/index.jsx` 7 | 8 | #### utils 9 | Contains sass abstractions that do not transpile to CSS. 10 | 11 | These utils are then imported throughout Lurka to create custom styles using shared code. 12 | 13 | ## variables.sass 14 | Contains CSS4 colors, layout dimensions and other shared variables. 15 | -------------------------------------------------------------------------------- /app/modules/Dashboard/containers/BoardSearch/BoardSearch.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | $bg-color: var(--primary) 4 | $text-color: invert($bg-color) 5 | 6 | .BoardSearch 7 | background-color: $bg-color 8 | color: $text-color 9 | width: 68.1% 10 | height: 60px 11 | top: 60px 12 | left: 0 13 | right: 0 14 | margin: 0 auto 15 | position: absolute 16 | box-shadow: 0 1px 5px $grey-darkest 17 | border-radius: 6px 18 | text-align: center 19 | -------------------------------------------------------------------------------- /app/modules/Panels/MenuPanel/components/MenuPage.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Scrollable, Title } from '~/components' 3 | 4 | const MenuPage = ({ title, children, className }) => { 5 | return ( 6 | 7 | 8 | {title} 9 | 10 | {children} 11 | 12 | ); 13 | } 14 | 15 | export default MenuPage 16 | -------------------------------------------------------------------------------- /app/components/__old__/Hierarchy/Hierarchy.jsx: -------------------------------------------------------------------------------- 1 | import './Hierarchy.styles' 2 | import React from "react"; 3 | 4 | export default ({provider, boardID, threadID}) => { 5 | return ( 6 |
    7 | {provider &&
  • {provider}
  • } 8 | {boardID &&
  • /{boardID}
  • } 9 | {threadID &&
  • /{threadID}
  • } 10 |
11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /app/components/interaction/HoverUnderline/styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .HoverUnderline 4 | position: relative 5 | 6 | &::before 7 | content: "" 8 | position: absolute 9 | bottom: -2px 10 | left: 0 11 | right: 0 12 | height: 2px 13 | width: 100% 14 | background: $text-primary 15 | transition: transform .24s 16 | transform: scaleX(0) 17 | 18 | &:hover::before 19 | transform: scaleX(1) 20 | -------------------------------------------------------------------------------- /app/services/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import Alerts from './Alerts' 4 | import ContextMenu from './ContextMenu' 5 | import Preloader from './Preloader' 6 | import Theme from './Theme' 7 | import Watcher from './Watcher' 8 | 9 | const {alertPosition} = window.Lurka; 10 | 11 | export default () => ( 12 |
13 | 14 | 15 | 16 | 17 | 18 |
19 | ) 20 | -------------------------------------------------------------------------------- /app/components/media/ExpandedImage/ExpandedImage.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .ExpandedImage 4 | // use flex to fix 7px extra height bug 5 | display: flex 6 | position: relative 7 | 8 | .ExpandedImage__blurred-thumbnail 9 | overflow: hidden 10 | filter: blur(10px) 11 | background-size: cover 12 | +size(100%) 13 | position: absolute 14 | top: 0 15 | 16 | .ExpandedImage__expanded 17 | position: relative 18 | 19 | 20 | -------------------------------------------------------------------------------- /app/components/elements/Card/styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .Card 4 | display: inline-block 5 | padding: 1rem 6 | +box-shadow(1) 7 | // background: $grey-lightest 8 | transition: box-shadow .24s ease-out 9 | text-align: center 10 | 11 | &:hover 12 | +box-shadow(2) 13 | 14 | 15 | &.Card__size-medium 16 | padding: 1em 17 | margin: .5em 18 | +font-size(1) 19 | 20 | &.Card__is-active 21 | border: 2px solid $primary-dark 22 | -------------------------------------------------------------------------------- /app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Lurka 6 | 11 | 12 | 13 | 14 |
15 | 16 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/modules/Board/assemblies/PageGrid/PageGrid.jsx: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import cx from 'classnames' 3 | 4 | // import {Page} from '../../components'; 5 | 6 | const PageGrid = ({ className, children }) => { 7 | return ( 8 | React.Children.map(children, (child, index) => { 9 | 10 | }) 11 | ); 12 | }; 13 | 14 | PageGrid.displayName = 'PageGrid'; 15 | 16 | PageGrid.propTypes = { 17 | className: PropTypes.string, 18 | }; 19 | 20 | export default PageGrid; 21 | -------------------------------------------------------------------------------- /app/modules/Header/components/HeaderItem/HeaderItem.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .HeaderItem 4 | display: inline-block 5 | 6 | &.breadcrumb 7 | margin: 0 8 | 9 | &.shift-right 10 | margin-left: auto 11 | 12 | &.header-icon:last-child 13 | margin-right: 20px !important 14 | 15 | &:hover 16 | background: $grey-light 17 | border-color: var(--primary) 18 | 19 | &.active 20 | background: var(--primary) 21 | -------------------------------------------------------------------------------- /app/components/other/Theme/injectTheme.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import PropTypes from 'prop-types'; 3 | 4 | const injectTheme = (Component) => { 5 | return class ComponentWithTheme extends React.Component { 6 | 7 | static contextTypes = { 8 | theme: PropTypes.object.isRequired 9 | } 10 | 11 | render() { 12 | return 16 | } 17 | } 18 | } 19 | 20 | export default injectTheme; 21 | -------------------------------------------------------------------------------- /app/modules/Thread/components/Overlay/Overlay.styles.sass: -------------------------------------------------------------------------------- 1 | @import '~sass/utils' 2 | 3 | .ThreadOverlay 4 | +set-dims(100%, 100%) 5 | z-index: 10 6 | position: absolute 7 | background-color: $grey-darkest 8 | top: 0 9 | left: 0 10 | opacity: 0 11 | transition: opacity .2s ease-out 12 | pointer-events: none 13 | background-image: radial-gradient(rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0.9)); 14 | 15 | &.Overlay-active 16 | pointer-events: auto 17 | opacity: .95 18 | -------------------------------------------------------------------------------- /app/components/interaction/ActionButton/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import cx from 'classnames'; 3 | import './styles'; 4 | import { Button } from '~/components'; 5 | 6 | const ActionButton = ({ className, children, ...restProps }) => { 7 | return ( 8 | 11 | ); 12 | }; 13 | 14 | ActionButton.displayName = 'ActionButton'; 15 | 16 | export default ActionButton; 17 | -------------------------------------------------------------------------------- /app/modules/Cinema/components/CloseCinema.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import cx from 'classnames'; 3 | import * as components from '~/components' 4 | 5 | const i = Lurka.icons; 6 | 7 | const CloseCinema = ({ className, onClick }) => { 8 | return ( 9 |
10 | 11 |
12 | ); 13 | }; 14 | 15 | CloseCinema.displayName = 'CloseCinema'; 16 | 17 | export default CloseCinema; 18 | -------------------------------------------------------------------------------- /app/sass/utils/functions.sass: -------------------------------------------------------------------------------- 1 | // Add percentage of white to a color 2 | @function tint($color, $percent) 3 | @return mix(white, $color, $percent) 4 | 5 | // Add percentage of black to a color 6 | @function shade($color, $percent) 7 | @return mix(black, $color, $percent) 8 | 9 | @function primary-opacity($opacity) 10 | @return rgba(red(color(primary)), green(color(primary)), blue(color(primary)), $opacity) 11 | 12 | @function calculateRem($size) 13 | $remSize: $size / 16px 14 | @return $remSize * 1rem 15 | -------------------------------------------------------------------------------- /app/views/MediaView.jsx: -------------------------------------------------------------------------------- 1 | import React, { PropTypes } from 'react'; 2 | import cx from 'classnames' 3 | 4 | import MediaViewer from '~/modules/MediaViewer'; 5 | 6 | const MediaView = ({ className }) => { 7 | return ( 8 |
9 | 10 |
11 | ); 12 | }; 13 | 14 | MediaView.displayName = 'MediaView'; 15 | 16 | MediaView.propTypes = { 17 | className: PropTypes.string, 18 | }; 19 | 20 | export default MediaView; 21 | -------------------------------------------------------------------------------- /app/components/elements/Icon/Icon.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import classes from 'classnames' 3 | 4 | const packName = Lurka.iconPackName; 5 | 6 | export default function ( props ) { 7 | // add default class prefix eg 'mdi mdi-icon' 8 | const iconName = props.name ? `${packName} ${packName}-${props.name}` : `` 9 | const newProps = Object.assign({}, props, { 10 | className: classes('Icon', props.className, iconName) 11 | }) 12 | 13 | return