Showing preview only (2,927K chars total). Download the full file or copy to clipboard to get everything.
Repository: hooram/ownphotos-frontend
Branch: dev
Commit: 7be274e84b8e
Files: 542
Total size: 2.7 MB
Directory structure:
gitextract_apboy4kv/
├── .dockerignore
├── .gitignore
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── docker-compose.yml
├── nginx.conf
├── package.json
├── public/
│ ├── index.html
│ └── manifest.json
├── run.sh
├── semantic/
│ ├── gulpfile.js
│ ├── src/
│ │ ├── definitions/
│ │ │ ├── behaviors/
│ │ │ │ ├── api.js
│ │ │ │ ├── form.js
│ │ │ │ └── visibility.js
│ │ │ ├── collections/
│ │ │ │ ├── breadcrumb.less
│ │ │ │ ├── form.less
│ │ │ │ ├── grid.less
│ │ │ │ ├── menu.less
│ │ │ │ ├── message.less
│ │ │ │ └── table.less
│ │ │ ├── elements/
│ │ │ │ ├── button.less
│ │ │ │ ├── container.less
│ │ │ │ ├── divider.less
│ │ │ │ ├── flag.less
│ │ │ │ ├── header.less
│ │ │ │ ├── icon.less
│ │ │ │ ├── image.less
│ │ │ │ ├── input.less
│ │ │ │ ├── label.less
│ │ │ │ ├── list.less
│ │ │ │ ├── loader.less
│ │ │ │ ├── rail.less
│ │ │ │ ├── reveal.less
│ │ │ │ ├── segment.less
│ │ │ │ └── step.less
│ │ │ ├── globals/
│ │ │ │ ├── reset.less
│ │ │ │ ├── site.js
│ │ │ │ └── site.less
│ │ │ ├── modules/
│ │ │ │ ├── accordion.js
│ │ │ │ ├── accordion.less
│ │ │ │ ├── checkbox.js
│ │ │ │ ├── checkbox.less
│ │ │ │ ├── dimmer.js
│ │ │ │ ├── dimmer.less
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── dropdown.less
│ │ │ │ ├── embed.js
│ │ │ │ ├── embed.less
│ │ │ │ ├── modal.js
│ │ │ │ ├── modal.less
│ │ │ │ ├── nag.js
│ │ │ │ ├── nag.less
│ │ │ │ ├── popup.js
│ │ │ │ ├── popup.less
│ │ │ │ ├── progress.js
│ │ │ │ ├── progress.less
│ │ │ │ ├── rating.js
│ │ │ │ ├── rating.less
│ │ │ │ ├── search.js
│ │ │ │ ├── search.less
│ │ │ │ ├── shape.js
│ │ │ │ ├── shape.less
│ │ │ │ ├── sidebar.js
│ │ │ │ ├── sidebar.less
│ │ │ │ ├── sticky.js
│ │ │ │ ├── sticky.less
│ │ │ │ ├── tab.js
│ │ │ │ ├── tab.less
│ │ │ │ ├── transition.js
│ │ │ │ └── transition.less
│ │ │ └── views/
│ │ │ ├── ad.less
│ │ │ ├── card.less
│ │ │ ├── comment.less
│ │ │ ├── feed.less
│ │ │ ├── item.less
│ │ │ └── statistic.less
│ │ ├── semantic.less
│ │ ├── site/
│ │ │ ├── collections/
│ │ │ │ ├── breadcrumb.overrides
│ │ │ │ ├── breadcrumb.variables
│ │ │ │ ├── form.overrides
│ │ │ │ ├── form.variables
│ │ │ │ ├── grid.overrides
│ │ │ │ ├── grid.variables
│ │ │ │ ├── menu.overrides
│ │ │ │ ├── menu.variables
│ │ │ │ ├── message.overrides
│ │ │ │ ├── message.variables
│ │ │ │ ├── table.overrides
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── container.overrides
│ │ │ │ ├── container.variables
│ │ │ │ ├── divider.overrides
│ │ │ │ ├── divider.variables
│ │ │ │ ├── flag.overrides
│ │ │ │ ├── flag.variables
│ │ │ │ ├── header.overrides
│ │ │ │ ├── header.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ ├── icon.variables
│ │ │ │ ├── image.overrides
│ │ │ │ ├── image.variables
│ │ │ │ ├── input.overrides
│ │ │ │ ├── input.variables
│ │ │ │ ├── label.overrides
│ │ │ │ ├── label.variables
│ │ │ │ ├── list.overrides
│ │ │ │ ├── list.variables
│ │ │ │ ├── loader.overrides
│ │ │ │ ├── loader.variables
│ │ │ │ ├── rail.overrides
│ │ │ │ ├── rail.variables
│ │ │ │ ├── reveal.overrides
│ │ │ │ ├── reveal.variables
│ │ │ │ ├── segment.overrides
│ │ │ │ ├── segment.variables
│ │ │ │ ├── step.overrides
│ │ │ │ └── step.variables
│ │ │ ├── globals/
│ │ │ │ ├── reset.overrides
│ │ │ │ ├── reset.variables
│ │ │ │ ├── site.overrides
│ │ │ │ └── site.variables
│ │ │ ├── modules/
│ │ │ │ ├── accordion.overrides
│ │ │ │ ├── accordion.variables
│ │ │ │ ├── chatroom.overrides
│ │ │ │ ├── chatroom.variables
│ │ │ │ ├── checkbox.overrides
│ │ │ │ ├── checkbox.variables
│ │ │ │ ├── dimmer.overrides
│ │ │ │ ├── dimmer.variables
│ │ │ │ ├── dropdown.overrides
│ │ │ │ ├── dropdown.variables
│ │ │ │ ├── embed.overrides
│ │ │ │ ├── embed.variables
│ │ │ │ ├── modal.overrides
│ │ │ │ ├── modal.variables
│ │ │ │ ├── nag.overrides
│ │ │ │ ├── nag.variables
│ │ │ │ ├── popup.overrides
│ │ │ │ ├── popup.variables
│ │ │ │ ├── progress.overrides
│ │ │ │ ├── progress.variables
│ │ │ │ ├── rating.overrides
│ │ │ │ ├── rating.variables
│ │ │ │ ├── search.overrides
│ │ │ │ ├── search.variables
│ │ │ │ ├── shape.overrides
│ │ │ │ ├── shape.variables
│ │ │ │ ├── sidebar.overrides
│ │ │ │ ├── sidebar.variables
│ │ │ │ ├── sticky.overrides
│ │ │ │ ├── sticky.variables
│ │ │ │ ├── tab.overrides
│ │ │ │ ├── tab.variables
│ │ │ │ ├── transition.overrides
│ │ │ │ └── transition.variables
│ │ │ └── views/
│ │ │ ├── ad.overrides
│ │ │ ├── ad.variables
│ │ │ ├── card.overrides
│ │ │ ├── card.variables
│ │ │ ├── comment.overrides
│ │ │ ├── comment.variables
│ │ │ ├── feed.overrides
│ │ │ ├── feed.variables
│ │ │ ├── item.overrides
│ │ │ ├── item.variables
│ │ │ ├── statistic.overrides
│ │ │ └── statistic.variables
│ │ ├── theme.config
│ │ ├── theme.less
│ │ └── themes/
│ │ ├── amazon/
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ └── button.variables
│ │ │ └── globals/
│ │ │ └── site.variables
│ │ ├── basic/
│ │ │ ├── collections/
│ │ │ │ ├── table.overrides
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ ├── icon.variables
│ │ │ │ ├── step.overrides
│ │ │ │ └── step.variables
│ │ │ ├── globals/
│ │ │ │ ├── reset.overrides
│ │ │ │ └── reset.variables
│ │ │ ├── modules/
│ │ │ │ ├── progress.overrides
│ │ │ │ └── progress.variables
│ │ │ └── views/
│ │ │ ├── card.overrides
│ │ │ └── card.variables
│ │ ├── bookish/
│ │ │ └── elements/
│ │ │ ├── header.overrides
│ │ │ └── header.variables
│ │ ├── bootstrap3/
│ │ │ └── elements/
│ │ │ ├── button.overrides
│ │ │ └── button.variables
│ │ ├── chubby/
│ │ │ ├── collections/
│ │ │ │ ├── form.overrides
│ │ │ │ ├── form.variables
│ │ │ │ ├── menu.overrides
│ │ │ │ └── menu.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── header.overrides
│ │ │ │ └── header.variables
│ │ │ ├── modules/
│ │ │ │ ├── accordion.overrides
│ │ │ │ └── accordion.variables
│ │ │ └── views/
│ │ │ ├── comment.overrides
│ │ │ └── comment.variables
│ │ ├── classic/
│ │ │ ├── collections/
│ │ │ │ ├── table.overrides
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── header.overrides
│ │ │ │ └── header.variables
│ │ │ ├── modules/
│ │ │ │ ├── progress.overrides
│ │ │ │ └── progress.variables
│ │ │ └── views/
│ │ │ ├── card.overrides
│ │ │ └── card.variables
│ │ ├── colored/
│ │ │ └── modules/
│ │ │ ├── checkbox.overrides
│ │ │ └── checkbox.variables
│ │ ├── default/
│ │ │ ├── collections/
│ │ │ │ ├── breadcrumb.overrides
│ │ │ │ ├── breadcrumb.variables
│ │ │ │ ├── form.overrides
│ │ │ │ ├── form.variables
│ │ │ │ ├── grid.overrides
│ │ │ │ ├── grid.variables
│ │ │ │ ├── menu.overrides
│ │ │ │ ├── menu.variables
│ │ │ │ ├── message.overrides
│ │ │ │ ├── message.variables
│ │ │ │ ├── table.overrides
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── container.overrides
│ │ │ │ ├── container.variables
│ │ │ │ ├── divider.overrides
│ │ │ │ ├── divider.variables
│ │ │ │ ├── flag.overrides
│ │ │ │ ├── flag.variables
│ │ │ │ ├── header.overrides
│ │ │ │ ├── header.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ ├── icon.variables
│ │ │ │ ├── image.overrides
│ │ │ │ ├── image.variables
│ │ │ │ ├── input.overrides
│ │ │ │ ├── input.variables
│ │ │ │ ├── label.overrides
│ │ │ │ ├── label.variables
│ │ │ │ ├── list.overrides
│ │ │ │ ├── list.variables
│ │ │ │ ├── loader.overrides
│ │ │ │ ├── loader.variables
│ │ │ │ ├── rail.overrides
│ │ │ │ ├── rail.variables
│ │ │ │ ├── reveal.overrides
│ │ │ │ ├── reveal.variables
│ │ │ │ ├── segment.overrides
│ │ │ │ ├── segment.variables
│ │ │ │ ├── step.overrides
│ │ │ │ └── step.variables
│ │ │ ├── globals/
│ │ │ │ ├── reset.overrides
│ │ │ │ ├── reset.variables
│ │ │ │ ├── site.overrides
│ │ │ │ └── site.variables
│ │ │ ├── modules/
│ │ │ │ ├── accordion.overrides
│ │ │ │ ├── accordion.variables
│ │ │ │ ├── chatroom.overrides
│ │ │ │ ├── chatroom.variables
│ │ │ │ ├── checkbox.overrides
│ │ │ │ ├── checkbox.variables
│ │ │ │ ├── dimmer.overrides
│ │ │ │ ├── dimmer.variables
│ │ │ │ ├── dropdown.overrides
│ │ │ │ ├── dropdown.variables
│ │ │ │ ├── embed.overrides
│ │ │ │ ├── embed.variables
│ │ │ │ ├── modal.overrides
│ │ │ │ ├── modal.variables
│ │ │ │ ├── nag.overrides
│ │ │ │ ├── nag.variables
│ │ │ │ ├── popup.overrides
│ │ │ │ ├── popup.variables
│ │ │ │ ├── progress.overrides
│ │ │ │ ├── progress.variables
│ │ │ │ ├── rating.overrides
│ │ │ │ ├── rating.variables
│ │ │ │ ├── search.overrides
│ │ │ │ ├── search.variables
│ │ │ │ ├── shape.overrides
│ │ │ │ ├── shape.variables
│ │ │ │ ├── sidebar.overrides
│ │ │ │ ├── sidebar.variables
│ │ │ │ ├── sticky.overrides
│ │ │ │ ├── sticky.variables
│ │ │ │ ├── tab.overrides
│ │ │ │ ├── tab.variables
│ │ │ │ ├── transition.overrides
│ │ │ │ └── transition.variables
│ │ │ └── views/
│ │ │ ├── ad.overrides
│ │ │ ├── ad.variables
│ │ │ ├── card.overrides
│ │ │ ├── card.variables
│ │ │ ├── comment.overrides
│ │ │ ├── comment.variables
│ │ │ ├── feed.overrides
│ │ │ ├── feed.variables
│ │ │ ├── item.overrides
│ │ │ ├── item.variables
│ │ │ ├── statistic.overrides
│ │ │ └── statistic.variables
│ │ ├── duo/
│ │ │ └── elements/
│ │ │ ├── loader.overrides
│ │ │ └── loader.variables
│ │ ├── fixed-width/
│ │ │ ├── collections/
│ │ │ │ ├── grid.overrides
│ │ │ │ └── grid.variables
│ │ │ └── modules/
│ │ │ ├── modal.overrides
│ │ │ └── modal.variables
│ │ ├── flat/
│ │ │ ├── collections/
│ │ │ │ ├── form.overrides
│ │ │ │ └── form.variables
│ │ │ └── globals/
│ │ │ ├── site.overrides
│ │ │ └── site.variables
│ │ ├── github/
│ │ │ ├── collections/
│ │ │ │ ├── breadcrumb.variables
│ │ │ │ ├── form.overrides
│ │ │ │ ├── form.variables
│ │ │ │ ├── grid.variables
│ │ │ │ ├── menu.overrides
│ │ │ │ ├── menu.variables
│ │ │ │ ├── message.overrides
│ │ │ │ ├── message.variables
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── header.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ ├── icon.variables
│ │ │ │ ├── image.variables
│ │ │ │ ├── input.overrides
│ │ │ │ ├── input.variables
│ │ │ │ ├── label.overrides
│ │ │ │ ├── label.variables
│ │ │ │ ├── segment.overrides
│ │ │ │ ├── segment.variables
│ │ │ │ ├── step.overrides
│ │ │ │ └── step.variables
│ │ │ ├── globals/
│ │ │ │ └── site.variables
│ │ │ └── modules/
│ │ │ ├── dropdown.overrides
│ │ │ ├── dropdown.variables
│ │ │ └── popup.variables
│ │ ├── gmail/
│ │ │ └── collections/
│ │ │ ├── message.overrides
│ │ │ └── message.variables
│ │ ├── instagram/
│ │ │ └── views/
│ │ │ ├── card.overrides
│ │ │ └── card.variables
│ │ ├── material/
│ │ │ ├── collections/
│ │ │ │ ├── menu.overrides
│ │ │ │ └── menu.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── header.overrides
│ │ │ │ ├── header.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ └── icon.variables
│ │ │ ├── globals/
│ │ │ │ ├── site.overrides
│ │ │ │ └── site.variables
│ │ │ └── modules/
│ │ │ ├── dropdown.overrides
│ │ │ ├── dropdown.variables
│ │ │ ├── modal.overrides
│ │ │ └── modal.variables
│ │ ├── pulsar/
│ │ │ └── elements/
│ │ │ ├── loader.overrides
│ │ │ └── loader.variables
│ │ ├── raised/
│ │ │ └── elements/
│ │ │ ├── button.overrides
│ │ │ └── button.variables
│ │ ├── resetcss/
│ │ │ └── globals/
│ │ │ ├── reset.overrides
│ │ │ └── reset.variables
│ │ ├── round/
│ │ │ └── elements/
│ │ │ ├── button.overrides
│ │ │ └── button.variables
│ │ ├── rtl/
│ │ │ └── globals/
│ │ │ ├── site.overrides
│ │ │ └── site.variables
│ │ ├── striped/
│ │ │ └── modules/
│ │ │ ├── progress.overrides
│ │ │ └── progress.variables
│ │ ├── timeline/
│ │ │ └── views/
│ │ │ ├── feed.overrides
│ │ │ └── feed.variables
│ │ └── twitter/
│ │ └── elements/
│ │ ├── button.overrides
│ │ └── button.variables
│ └── tasks/
│ ├── README.md
│ ├── admin/
│ │ ├── components/
│ │ │ ├── create.js
│ │ │ ├── init.js
│ │ │ └── update.js
│ │ ├── distributions/
│ │ │ ├── create.js
│ │ │ ├── init.js
│ │ │ └── update.js
│ │ ├── publish.js
│ │ ├── register.js
│ │ └── release.js
│ ├── build/
│ │ ├── assets.js
│ │ ├── css.js
│ │ └── javascript.js
│ ├── build.js
│ ├── check-install.js
│ ├── clean.js
│ ├── collections/
│ │ ├── README.md
│ │ ├── admin.js
│ │ ├── build.js
│ │ ├── internal.js
│ │ └── rtl.js
│ ├── config/
│ │ ├── admin/
│ │ │ ├── github.js
│ │ │ ├── oauth.example.js
│ │ │ ├── release.js
│ │ │ └── templates/
│ │ │ ├── README.md
│ │ │ ├── bower.json
│ │ │ ├── component-package.js
│ │ │ ├── composer.json
│ │ │ ├── css-package.js
│ │ │ ├── less-package.js
│ │ │ └── package.json
│ │ ├── defaults.js
│ │ ├── docs.js
│ │ ├── npm/
│ │ │ └── gulpfile.js
│ │ ├── project/
│ │ │ ├── config.js
│ │ │ ├── install.js
│ │ │ └── release.js
│ │ ├── tasks.js
│ │ └── user.js
│ ├── docs/
│ │ ├── build.js
│ │ ├── metadata.js
│ │ └── serve.js
│ ├── install.js
│ ├── rtl/
│ │ ├── build.js
│ │ └── watch.js
│ ├── version.js
│ └── watch.js
├── semantic.json
└── src/
├── App.css
├── App.js
├── App.test.js
├── actions/
│ ├── albumsActions.js
│ ├── authActions.js
│ ├── facesActions.js
│ ├── peopleActions.js
│ ├── photosActions.js
│ ├── publicActions.js
│ ├── searchActions.js
│ ├── uiActions.js
│ ├── userActions.js
│ └── utilActions.js
├── api_client/
│ ├── apiClient.js
│ └── apiClientDeploy.js
├── components/
│ ├── LightBoxV2.js
│ ├── ModalAlbumShare.js
│ ├── ModalPhotosShare.js
│ ├── SecuredImage.js
│ ├── album.js
│ ├── authenticatedImage.js
│ ├── charts/
│ │ ├── countryPiChart.js
│ │ └── wordCloud.js
│ ├── chartyPhotosScrollbar.js
│ ├── egoGraph.js
│ ├── eventCountMonthGraph.js
│ ├── faceClusterGraph.js
│ ├── faces.js
│ ├── imageInfoTable.js
│ ├── lightBox.js
│ ├── locationDurationStackedBar.js
│ ├── locationLink.js
│ ├── maps.js
│ ├── modalPhotoView.js
│ ├── people.js
│ ├── socialGraph.js
│ └── statistics.js
├── containers/
│ └── login.js
├── history.js
├── index.css
├── index.js
├── layouts/
│ ├── AdminPage.js
│ ├── Bench.js
│ ├── DataVisualization.js
│ ├── FaceDashboardV3.js
│ ├── FavoritePhotos.js
│ ├── HiddenPhotos.js
│ ├── PublicUserList.js
│ ├── RVListExample.js
│ ├── RecentlyAddedPhotos.js
│ ├── ReusablePhotoListView.js
│ ├── SharedFromMe.js
│ ├── SharedToMe.js
│ ├── SignUpPage.js
│ ├── UserManagement.js
│ ├── UserPublicPage.js
│ ├── \
│ ├── albumAuto.js
│ ├── albumAutoGalleryView.js
│ ├── albumAutoMonths.js
│ ├── albumAutoRV.js
│ ├── albumDateGalleryView.js
│ ├── albumDateMonths.js
│ ├── albumPeople.js
│ ├── albumPersonGallery.js
│ ├── albumPlace.js
│ ├── albumPlaceGallery.js
│ ├── albumThing.js
│ ├── albumUser.js
│ ├── albumUserGallery.js
│ ├── albums.js
│ ├── albumsAutoListCardView.js
│ ├── albumsAutoListCardViewMonthGroup.js
│ ├── allPhotosGroupedByDate.js
│ ├── allPhotosView.js
│ ├── allPhotosViewHash.js
│ ├── allPhotosViewHashRV.js
│ ├── allPhotosViewLL.js
│ ├── allPhotosViewRV.js
│ ├── favoriteAutoAlbums.js
│ ├── loginPage.js
│ ├── menubars.js
│ ├── noTimestampPhotosView.js
│ ├── notImplementedPlaceholder.js
│ ├── peopleDashboard.js
│ ├── privateRoute.js
│ ├── searchMultipleResultsCategories.js
│ ├── searchRV.js
│ ├── settings.js
│ ├── statistics.js
│ └── vigTest.js
├── middleware.js
├── pig.js
├── reducers/
│ ├── albumsReducer.js
│ ├── authReducer.js
│ ├── facesReducer.js
│ ├── index.js
│ ├── peopleReducer.js
│ ├── photosReducer.js
│ ├── publicReducer.js
│ ├── searchReducer.js
│ ├── uiReducer.js
│ ├── userReducer.js
│ └── utilReducer.js
├── registerServiceWorker.js
├── routerExample.js
├── routes/
│ └── index.js
├── store.js
└── util/
├── countryNames.js
├── fuzzyMatch.js
├── gridUtils.js
├── scrollUtils.js
└── util.js
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
.gitignore
Dockerfile
Makefile
README.md
screenshots/
tags
================================================
FILE: .gitignore
================================================
# See https://help.github.com/ignore-files/ for more about ignoring files.
# dependencies
/node_modules
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
tags
================================================
FILE: Dockerfile
================================================
FROM ubuntu:16.04
MAINTAINER ViViDboarder <vividboarder@gmail.com>
RUN apt-get update && \
apt-get install -y curl git xsel && \
curl --silent --location https://deb.nodesource.com/setup_10.x | bash && \
apt-get install -y nodejs && \
apt-get remove --purge -y curl && \
rm -rf /var/lib/apt/lists/*
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
ENV CLI_WIDTH 80
COPY package.json /usr/src/app
RUN npm install && npm cache clean --force
RUN npm install -g serve
EXPOSE 3000
COPY . /usr/src/app
CMD [ "./run.sh" ]
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2017 Hooram Nam
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Makefile
================================================
.PHONY: default build run shell
DOCKER_TAG ?= ownphotos-frontend
default: build
build:
docker build -t $(DOCKER_TAG) .
run: build
docker run $(DOCKER_TAG)
shell: build
docker run --rm -it $(DOCKER_TAG) /bin/bash
================================================
FILE: README.md
================================================
<div style="text-align:center"><img width="100" src ="/screenshots/logo.png"/></div>
# Ownphotos
## What is it?
- Self hosted wannabe Google Photos clone, with a slight focus on cool graphs
- Django backend & React frontend.
- In development.
[More detailed info on the backend repo readme](https://github.com/hooram/ownphotos-backend)
================================================
FILE: docker-compose.yml
================================================
version: '2'
services:
proxy:
image: guysoft/ownphotos-proxy
tty: true
container_name: ownphotos-proxy
restart: always
links:
- "backend:backend"
- "frontend:frontend"
ports:
- "3000:80"
ownphotos-db:
image: postgres
container_name: ownphotos-db
restart: always
environment:
# This db password is internal, you can change it if you want, but also change it in ownphotos-backend container
- POSTGRES_PASSWORD=AaAa1234
- POSTGRES_DB=ownphotos
volumes:
- ownphotos-data:/var/lib/postgresql/data
frontend:
container_name: ownphotos-frontend
image: guysoft/ownphotos-frontend:dev
# For development uncomment this and comment the image name above
#build: .
tty: true
environment:
# This is the path to the backend host public facing. if your website is ownphotos.org then this should be "ownphotos.org".
# Default here is assuming you are running on localhost on port 3000 as given in ownphotos-proxy service
- BACKEND_HOST=localhost:3000
links:
- "backend:backend"
backend:
image: hooram/ownphotos:dev
container_name: ownphotos-backend
volumes:
# Your photos go here
- $HOME/Pictures/:/data
- media:/code/media
environment:
- SECRET_KEY=change_meme
# This is backend host from within the service, you dont need to change this
- BACKEND_HOST=backend
- ADMIN_EMAIL=admin@example.com
- ADMIN_USERNAME=admin
# Change your admin password!
- ADMIN_PASSWORD=admin
- DEBUG=true
- DB_BACKEND=postgresql
- DB_NAME=ownphotos
- DB_USER=postgres
# This db password is internal, you can change it if you want, but also change it in ownphotos-db container
- DB_PASS=AaAa1234
- DB_HOST=ownphotos-db
- DB_PORT=5432
- REDIS_HOST=ownphotos-redis
- REDIS_PORT=6379
- MAPBOX_API_KEY=CHANGE_MEAAAA
links:
- "ownphotos-db:ownphotos-db"
- "ownphotos-redis:ownphotos-redis"
ownphotos-redis:
image: redis
container_name: ownphotos-redis
volumes:
ownphotos-data:
media:
================================================
FILE: nginx.conf
================================================
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log debug;
events {
worker_connections 1024;
}
http {
server {
listen 80;
location / {
proxy_pass http://frontend:3000/;
}
location /api {
proxy_pass http://backend/api;
}
}
}
================================================
FILE: package.json
================================================
{
"name": "ownphotos-frontend",
"version": "0.1.0",
"private": true,
"dependencies": {
"@vx/gradient": "0.0.161",
"@vx/group": "0.0.161",
"@vx/hierarchy": "0.0.161",
"@vx/shape": "0.0.162",
"axios": "^0.18.0",
"bootstrap": "^4.1.1",
"calendar-months": "^1.0.1",
"d3-hierarchy": "^1.1.6",
"d3-shape": "^1.2.0",
"eslint-plugin-import": "^2.13.0",
"eslint-plugin-jsx-a11y": "^6.0.3",
"file-loader": "^1.1.11",
"font-awesome": "^4.7.0",
"immutable": "^3.8.1",
"jwt-decode": "^2.2.0",
"leaflet": "^1.3.1",
"leaflet.markercluster": "^1.3.0",
"lodash": "^4.17.10",
"material-icons-react": "^1.0.0",
"moment": "^2.22.2",
"moment-precise-range-plugin": "^1.3.0",
"prop-types": "^15.6.2",
"react": "^16.4.1",
"react-avatar-editor": "^11.0.4",
"react-calendar-heatmap": "^1.6.3",
"react-content-loader": "^3.1.2",
"react-cookie": "^2.2.0",
"react-d3-graph": "1.2.1",
"react-dimensions": "^1.3.0",
"react-dom": "^16.4.1",
"react-draggable": "^3.0.5",
"react-dropzone": "^4.2.12",
"react-grid-gallery": "^0.4.11",
"react-grid-layout": "^0.16.6",
"react-image-lightbox": "https://github.com/hooram/react-image-lightbox",
"react-keydown": "^1.9.4",
"react-lazyload": "^2.2.7",
"react-leaflet": "^1.9.1",
"react-leaflet-markercluster": "^1.1.8",
"react-modal": "^3.4.5",
"react-placeholder": "^3.0.1",
"react-redux": "^5.0.5",
"react-router-dom": "^4.3.1",
"react-router-redux": "^5.0.0-alpha.9",
"react-scripts": "^1.1.4",
"react-sortable-tree": "^2.2.0",
"react-sortable-tree-theme-file-explorer": "^1.1.2",
"react-transition-group": "^2.3.1",
"react-virtualized": "^9.20.0",
"react-virtualized-item-grid": "^1.0.0",
"react-vis": "^1.9.4",
"react-visibility-sensor": "^3.10.0",
"reapop": "^1.2.0",
"reapop-theme-wybo": "^1.0.2",
"redux": "^4.0.0",
"redux-api-middleware": "^2.3.0",
"redux-logger": "^3.0.6",
"redux-persist": "^5.10.0",
"redux-persist-transform-filter": "0.0.16",
"redux-promise-middleware": "^5.1.1",
"redux-thunk": "^2.3.0",
"rumble-charts": "^2.0.0",
"semantic-ui-css": "^2.3.2",
"semantic-ui-react": "^0.80.2"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test --env=jsdom",
"eject": "react-scripts eject"
},
"proxy": "http://192.168.1.100:8000/",
"devDependencies": {
"eslint": "^4.19.1",
"eslint-plugin-react": "^7.10.0"
}
}
================================================
FILE: public/index.html
================================================
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<!--
manifest.json provides metadata used when your web app is added to the
homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
-->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.1.0/leaflet.css" />
<!-- <link rel="stylesheet" href="https://unpkg.com/react-leaflet-markercluster/dist/styles.min.css" /> -->
<style type="text/css">
.leaflet-container {
height: 250px;
width: 100%;
z-index: 2;
position: relative;
}
</style>
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>Ownphotos</title>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>
================================================
FILE: public/manifest.json
================================================
{
"short_name": "Ownphotos",
"name": "Ownphotos",
"icons": [
{
"src": "favicon.ico",
"sizes": "192x192",
"type": "image/png"
}
],
"start_url": "./index.html",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
================================================
FILE: run.sh
================================================
#!/usr/bin/env bash
sed -i "s@http://192.168.1.100@//${BACKEND_HOST}@g" src/api_client/apiClient.js
sed -i "s@http://192.168.1.100:8000/@http://backend/@g" package.json
# echo "building frontend"
# npm run build
# echo "serving frontend"
# serve build -d -l 3000
DANGEROUSLY_DISABLE_HOST_CHECK=true HOST=0.0.0.0 npm start
================================================
FILE: semantic/gulpfile.js
================================================
/*******************************
Set-up
*******************************/
var
gulp = require('gulp-help')(require('gulp')),
// read user config to know what task to load
config = require('./tasks/config/user'),
// watch changes
watch = require('./tasks/watch'),
// build all files
build = require('./tasks/build'),
buildJS = require('./tasks/build/javascript'),
buildCSS = require('./tasks/build/css'),
buildAssets = require('./tasks/build/assets'),
// utility
clean = require('./tasks/clean'),
version = require('./tasks/version'),
// docs tasks
serveDocs = require('./tasks/docs/serve'),
buildDocs = require('./tasks/docs/build'),
// rtl
buildRTL = require('./tasks/rtl/build'),
watchRTL = require('./tasks/rtl/watch')
;
/*******************************
Tasks
*******************************/
gulp.task('default', false, [
'watch'
]);
gulp.task('watch', 'Watch for site/theme changes', watch);
gulp.task('build', 'Builds all files from source', build);
gulp.task('build-javascript', 'Builds all javascript from source', buildJS);
gulp.task('build-css', 'Builds all css from source', buildCSS);
gulp.task('build-assets', 'Copies all assets from source', buildAssets);
gulp.task('clean', 'Clean dist folder', clean);
gulp.task('version', 'Displays current version of Semantic', version);
/*--------------
Docs
---------------*/
/*
Lets you serve files to a local documentation instance
https://github.com/Semantic-Org/Semantic-UI-Docs/
*/
gulp.task('serve-docs', 'Serve file changes to SUI Docs', serveDocs);
gulp.task('build-docs', 'Build all files and add to SUI Docs', buildDocs);
/*--------------
RTL
---------------*/
if(config.rtl) {
gulp.task('watch-rtl', 'Watch files as RTL', watchRTL);
gulp.task('build-rtl', 'Build all files as RTL', buildRTL);
}
================================================
FILE: semantic/src/definitions/behaviors/api.js
================================================
/*!
* # Semantic UI - API
* http://github.com/semantic-org/semantic-ui/
*
*
* Released under the MIT license
* http://opensource.org/licenses/MIT
*
*/
;(function ($, window, document, undefined) {
'use strict';
var
window = (typeof window != 'undefined' && window.Math == Math)
? window
: (typeof self != 'undefined' && self.Math == Math)
? self
: Function('return this')()
;
$.api = $.fn.api = function(parameters) {
var
// use window context if none specified
$allModules = $.isFunction(this)
? $(window)
: $(this),
moduleSelector = $allModules.selector || '',
time = new Date().getTime(),
performance = [],
query = arguments[0],
methodInvoked = (typeof query == 'string'),
queryArguments = [].slice.call(arguments, 1),
returnedValue
;
$allModules
.each(function() {
var
settings = ( $.isPlainObject(parameters) )
? $.extend(true, {}, $.fn.api.settings, parameters)
: $.extend({}, $.fn.api.settings),
// internal aliases
namespace = settings.namespace,
metadata = settings.metadata,
selector = settings.selector,
error = settings.error,
className = settings.className,
// define namespaces for modules
eventNamespace = '.' + namespace,
moduleNamespace = 'module-' + namespace,
// element that creates request
$module = $(this),
$form = $module.closest(selector.form),
// context used for state
$context = (settings.stateContext)
? $(settings.stateContext)
: $module,
// request details
ajaxSettings,
requestSettings,
url,
data,
requestStartTime,
// standard module
element = this,
context = $context[0],
instance = $module.data(moduleNamespace),
module
;
module = {
initialize: function() {
if(!methodInvoked) {
module.bind.events();
}
module.instantiate();
},
instantiate: function() {
module.verbose('Storing instance of module', module);
instance = module;
$module
.data(moduleNamespace, instance)
;
},
destroy: function() {
module.verbose('Destroying previous module for', element);
$module
.removeData(moduleNamespace)
.off(eventNamespace)
;
},
bind: {
events: function() {
var
triggerEvent = module.get.event()
;
if( triggerEvent ) {
module.verbose('Attaching API events to element', triggerEvent);
$module
.on(triggerEvent + eventNamespace, module.event.trigger)
;
}
else if(settings.on == 'now') {
module.debug('Querying API endpoint immediately');
module.query();
}
}
},
decode: {
json: function(response) {
if(response !== undefined && typeof response == 'string') {
try {
response = JSON.parse(response);
}
catch(e) {
// isnt json string
}
}
return response;
}
},
read: {
cachedResponse: function(url) {
var
response
;
if(window.Storage === undefined) {
module.error(error.noStorage);
return;
}
response = sessionStorage.getItem(url);
module.debug('Using cached response', url, response);
response = module.decode.json(response);
return response;
}
},
write: {
cachedResponse: function(url, response) {
if(response && response === '') {
module.debug('Response empty, not caching', response);
return;
}
if(window.Storage === undefined) {
module.error(error.noStorage);
return;
}
if( $.isPlainObject(response) ) {
response = JSON.stringify(response);
}
sessionStorage.setItem(url, response);
module.verbose('Storing cached response for url', url, response);
}
},
query: function() {
if(module.is.disabled()) {
module.debug('Element is disabled API request aborted');
return;
}
if(module.is.loading()) {
if(settings.interruptRequests) {
module.debug('Interrupting previous request');
module.abort();
}
else {
module.debug('Cancelling request, previous request is still pending');
return;
}
}
// pass element metadata to url (value, text)
if(settings.defaultData) {
$.extend(true, settings.urlData, module.get.defaultData());
}
// Add form content
if(settings.serializeForm) {
settings.data = module.add.formData(settings.data);
}
// call beforesend and get any settings changes
requestSettings = module.get.settings();
// check if before send cancelled request
if(requestSettings === false) {
module.cancelled = true;
module.error(error.beforeSend);
return;
}
else {
module.cancelled = false;
}
// get url
url = module.get.templatedURL();
if(!url && !module.is.mocked()) {
module.error(error.missingURL);
return;
}
// replace variables
url = module.add.urlData( url );
// missing url parameters
if( !url && !module.is.mocked()) {
return;
}
requestSettings.url = settings.base + url;
// look for jQuery ajax parameters in settings
ajaxSettings = $.extend(true, {}, settings, {
type : settings.method || settings.type,
data : data,
url : settings.base + url,
beforeSend : settings.beforeXHR,
success : function() {},
failure : function() {},
complete : function() {}
});
module.debug('Querying URL', ajaxSettings.url);
module.verbose('Using AJAX settings', ajaxSettings);
if(settings.cache === 'local' && module.read.cachedResponse(url)) {
module.debug('Response returned from local cache');
module.request = module.create.request();
module.request.resolveWith(context, [ module.read.cachedResponse(url) ]);
return;
}
if( !settings.throttle ) {
module.debug('Sending request', data, ajaxSettings.method);
module.send.request();
}
else {
if(!settings.throttleFirstRequest && !module.timer) {
module.debug('Sending request', data, ajaxSettings.method);
module.send.request();
module.timer = setTimeout(function(){}, settings.throttle);
}
else {
module.debug('Throttling request', settings.throttle);
clearTimeout(module.timer);
module.timer = setTimeout(function() {
if(module.timer) {
delete module.timer;
}
module.debug('Sending throttled request', data, ajaxSettings.method);
module.send.request();
}, settings.throttle);
}
}
},
should: {
removeError: function() {
return ( settings.hideError === true || (settings.hideError === 'auto' && !module.is.form()) );
}
},
is: {
disabled: function() {
return ($module.filter(selector.disabled).length > 0);
},
expectingJSON: function() {
return settings.dataType === 'json' || settings.dataType === 'jsonp';
},
form: function() {
return $module.is('form') || $context.is('form');
},
mocked: function() {
return (settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync);
},
input: function() {
return $module.is('input');
},
loading: function() {
return (module.request)
? (module.request.state() == 'pending')
: false
;
},
abortedRequest: function(xhr) {
if(xhr && xhr.readyState !== undefined && xhr.readyState === 0) {
module.verbose('XHR request determined to be aborted');
return true;
}
else {
module.verbose('XHR request was not aborted');
return false;
}
},
validResponse: function(response) {
if( (!module.is.expectingJSON()) || !$.isFunction(settings.successTest) ) {
module.verbose('Response is not JSON, skipping validation', settings.successTest, response);
return true;
}
module.debug('Checking JSON returned success', settings.successTest, response);
if( settings.successTest(response) ) {
module.debug('Response passed success test', response);
return true;
}
else {
module.debug('Response failed success test', response);
return false;
}
}
},
was: {
cancelled: function() {
return (module.cancelled || false);
},
succesful: function() {
return (module.request && module.request.state() == 'resolved');
},
failure: function() {
return (module.request && module.request.state() == 'rejected');
},
complete: function() {
return (module.request && (module.request.state() == 'resolved' || module.request.state() == 'rejected') );
}
},
add: {
urlData: function(url, urlData) {
var
requiredVariables,
optionalVariables
;
if(url) {
requiredVariables = url.match(settings.regExp.required);
optionalVariables = url.match(settings.regExp.optional);
urlData = urlData || settings.urlData;
if(requiredVariables) {
module.debug('Looking for required URL variables', requiredVariables);
$.each(requiredVariables, function(index, templatedString) {
var
// allow legacy {$var} style
variable = (templatedString.indexOf('$') !== -1)
? templatedString.substr(2, templatedString.length - 3)
: templatedString.substr(1, templatedString.length - 2),
value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
? urlData[variable]
: ($module.data(variable) !== undefined)
? $module.data(variable)
: ($context.data(variable) !== undefined)
? $context.data(variable)
: urlData[variable]
;
// remove value
if(value === undefined) {
module.error(error.requiredParameter, variable, url);
url = false;
return false;
}
else {
module.verbose('Found required variable', variable, value);
value = (settings.encodeParameters)
? module.get.urlEncodedValue(value)
: value
;
url = url.replace(templatedString, value);
}
});
}
if(optionalVariables) {
module.debug('Looking for optional URL variables', requiredVariables);
$.each(optionalVariables, function(index, templatedString) {
var
// allow legacy {/$var} style
variable = (templatedString.indexOf('$') !== -1)
? templatedString.substr(3, templatedString.length - 4)
: templatedString.substr(2, templatedString.length - 3),
value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
? urlData[variable]
: ($module.data(variable) !== undefined)
? $module.data(variable)
: ($context.data(variable) !== undefined)
? $context.data(variable)
: urlData[variable]
;
// optional replacement
if(value !== undefined) {
module.verbose('Optional variable Found', variable, value);
url = url.replace(templatedString, value);
}
else {
module.verbose('Optional variable not found', variable);
// remove preceding slash if set
if(url.indexOf('/' + templatedString) !== -1) {
url = url.replace('/' + templatedString, '');
}
else {
url = url.replace(templatedString, '');
}
}
});
}
}
return url;
},
formData: function(data) {
var
canSerialize = ($.fn.serializeObject !== undefined),
formData = (canSerialize)
? $form.serializeObject()
: $form.serialize(),
hasOtherData
;
data = data || settings.data;
hasOtherData = $.isPlainObject(data);
if(hasOtherData) {
if(canSerialize) {
module.debug('Extending existing data with form data', data, formData);
data = $.extend(true, {}, data, formData);
}
else {
module.error(error.missingSerialize);
module.debug('Cant extend data. Replacing data with form data', data, formData);
data = formData;
}
}
else {
module.debug('Adding form data', formData);
data = formData;
}
return data;
}
},
send: {
request: function() {
module.set.loading();
module.request = module.create.request();
if( module.is.mocked() ) {
module.mockedXHR = module.create.mockedXHR();
}
else {
module.xhr = module.create.xhr();
}
settings.onRequest.call(context, module.request, module.xhr);
}
},
event: {
trigger: function(event) {
module.query();
if(event.type == 'submit' || event.type == 'click') {
event.preventDefault();
}
},
xhr: {
always: function() {
// nothing special
},
done: function(response, textStatus, xhr) {
var
context = this,
elapsedTime = (new Date().getTime() - requestStartTime),
timeLeft = (settings.loadingDuration - elapsedTime),
translatedResponse = ( $.isFunction(settings.onResponse) )
? module.is.expectingJSON()
? settings.onResponse.call(context, $.extend(true, {}, response))
: settings.onResponse.call(context, response)
: false
;
timeLeft = (timeLeft > 0)
? timeLeft
: 0
;
if(translatedResponse) {
module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response);
response = translatedResponse;
}
if(timeLeft > 0) {
module.debug('Response completed early delaying state change by', timeLeft);
}
setTimeout(function() {
if( module.is.validResponse(response) ) {
module.request.resolveWith(context, [response, xhr]);
}
else {
module.request.rejectWith(context, [xhr, 'invalid']);
}
}, timeLeft);
},
fail: function(xhr, status, httpMessage) {
var
context = this,
elapsedTime = (new Date().getTime() - requestStartTime),
timeLeft = (settings.loadingDuration - elapsedTime)
;
timeLeft = (timeLeft > 0)
? timeLeft
: 0
;
if(timeLeft > 0) {
module.debug('Response completed early delaying state change by', timeLeft);
}
setTimeout(function() {
if( module.is.abortedRequest(xhr) ) {
module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);
}
else {
module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);
}
}, timeLeft);
}
},
request: {
done: function(response, xhr) {
module.debug('Successful API Response', response);
if(settings.cache === 'local' && url) {
module.write.cachedResponse(url, response);
module.debug('Saving server response locally', module.cache);
}
settings.onSuccess.call(context, response, $module, xhr);
},
complete: function(firstParameter, secondParameter) {
var
xhr,
response
;
// have to guess callback parameters based on request success
if( module.was.succesful() ) {
response = firstParameter;
xhr = secondParameter;
}
else {
xhr = firstParameter;
response = module.get.responseFromXHR(xhr);
}
module.remove.loading();
settings.onComplete.call(context, response, $module, xhr);
},
fail: function(xhr, status, httpMessage) {
var
// pull response from xhr if available
response = module.get.responseFromXHR(xhr),
errorMessage = module.get.errorFromRequest(response, status, httpMessage)
;
if(status == 'aborted') {
module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);
settings.onAbort.call(context, status, $module, xhr);
return true;
}
else if(status == 'invalid') {
module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);
}
else if(status == 'error') {
if(xhr !== undefined) {
module.debug('XHR produced a server error', status, httpMessage);
// make sure we have an error to display to console
if( xhr.status != 200 && httpMessage !== undefined && httpMessage !== '') {
module.error(error.statusMessage + httpMessage, ajaxSettings.url);
}
settings.onError.call(context, errorMessage, $module, xhr);
}
}
if(settings.errorDuration && status !== 'aborted') {
module.debug('Adding error state');
module.set.error();
if( module.should.removeError() ) {
setTimeout(module.remove.error, settings.errorDuration);
}
}
module.debug('API Request failed', errorMessage, xhr);
settings.onFailure.call(context, response, $module, xhr);
}
}
},
create: {
request: function() {
// api request promise
return $.Deferred()
.always(module.event.request.complete)
.done(module.event.request.done)
.fail(module.event.request.fail)
;
},
mockedXHR: function () {
var
// xhr does not simulate these properties of xhr but must return them
textStatus = false,
status = false,
httpMessage = false,
responder = settings.mockResponse || settings.response,
asyncResponder = settings.mockResponseAsync || settings.responseAsync,
asyncCallback,
response,
mockedXHR
;
mockedXHR = $.Deferred()
.always(module.event.xhr.complete)
.done(module.event.xhr.done)
.fail(module.event.xhr.fail)
;
if(responder) {
if( $.isFunction(responder) ) {
module.debug('Using specified synchronous callback', responder);
response = responder.call(context, requestSettings);
}
else {
module.debug('Using settings specified response', responder);
response = responder;
}
// simulating response
mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);
}
else if( $.isFunction(asyncResponder) ) {
asyncCallback = function(response) {
module.debug('Async callback returned response', response);
if(response) {
mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);
}
else {
mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]);
}
};
module.debug('Using specified async response callback', asyncResponder);
asyncResponder.call(context, requestSettings, asyncCallback);
}
return mockedXHR;
},
xhr: function() {
var
xhr
;
// ajax request promise
xhr = $.ajax(ajaxSettings)
.always(module.event.xhr.always)
.done(module.event.xhr.done)
.fail(module.event.xhr.fail)
;
module.verbose('Created server request', xhr, ajaxSettings);
return xhr;
}
},
set: {
error: function() {
module.verbose('Adding error state to element', $context);
$context.addClass(className.error);
},
loading: function() {
module.verbose('Adding loading state to element', $context);
$context.addClass(className.loading);
requestStartTime = new Date().getTime();
}
},
remove: {
error: function() {
module.verbose('Removing error state from element', $context);
$context.removeClass(className.error);
},
loading: function() {
module.verbose('Removing loading state from element', $context);
$context.removeClass(className.loading);
}
},
get: {
responseFromXHR: function(xhr) {
return $.isPlainObject(xhr)
? (module.is.expectingJSON())
? module.decode.json(xhr.responseText)
: xhr.responseText
: false
;
},
errorFromRequest: function(response, status, httpMessage) {
return ($.isPlainObject(response) && response.error !== undefined)
? response.error // use json error message
: (settings.error[status] !== undefined) // use server error message
? settings.error[status]
: httpMessage
;
},
request: function() {
return module.request || false;
},
xhr: function() {
return module.xhr || false;
},
settings: function() {
var
runSettings
;
runSettings = settings.beforeSend.call(context, settings);
if(runSettings) {
if(runSettings.success !== undefined) {
module.debug('Legacy success callback detected', runSettings);
module.error(error.legacyParameters, runSettings.success);
runSettings.onSuccess = runSettings.success;
}
if(runSettings.failure !== undefined) {
module.debug('Legacy failure callback detected', runSettings);
module.error(error.legacyParameters, runSettings.failure);
runSettings.onFailure = runSettings.failure;
}
if(runSettings.complete !== undefined) {
module.debug('Legacy complete callback detected', runSettings);
module.error(error.legacyParameters, runSettings.complete);
runSettings.onComplete = runSettings.complete;
}
}
if(runSettings === undefined) {
module.error(error.noReturnedValue);
}
if(runSettings === false) {
return runSettings;
}
return (runSettings !== undefined)
? $.extend(true, {}, runSettings)
: $.extend(true, {}, settings)
;
},
urlEncodedValue: function(value) {
var
decodedValue = window.decodeURIComponent(value),
encodedValue = window.encodeURIComponent(value),
alreadyEncoded = (decodedValue !== value)
;
if(alreadyEncoded) {
module.debug('URL value is already encoded, avoiding double encoding', value);
return value;
}
module.verbose('Encoding value using encodeURIComponent', value, encodedValue);
return encodedValue;
},
defaultData: function() {
var
data = {}
;
if( !$.isWindow(element) ) {
if( module.is.input() ) {
data.value = $module.val();
}
else if( module.is.form() ) {
}
else {
data.text = $module.text();
}
}
return data;
},
event: function() {
if( $.isWindow(element) || settings.on == 'now' ) {
module.debug('API called without element, no events attached');
return false;
}
else if(settings.on == 'auto') {
if( $module.is('input') ) {
return (element.oninput !== undefined)
? 'input'
: (element.onpropertychange !== undefined)
? 'propertychange'
: 'keyup'
;
}
else if( $module.is('form') ) {
return 'submit';
}
else {
return 'click';
}
}
else {
return settings.on;
}
},
templatedURL: function(action) {
action = action || $module.data(metadata.action) || settings.action || false;
url = $module.data(metadata.url) || settings.url || false;
if(url) {
module.debug('Using specified url', url);
return url;
}
if(action) {
module.debug('Looking up url for action', action, settings.api);
if(settings.api[action] === undefined && !module.is.mocked()) {
module.error(error.missingAction, settings.action, settings.api);
return;
}
url = settings.api[action];
}
else if( module.is.form() ) {
url = $module.attr('action') || $context.attr('action') || false;
module.debug('No url or action specified, defaulting to form action', url);
}
return url;
}
},
abort: function() {
var
xhr = module.get.xhr()
;
if( xhr && xhr.state() !== 'resolved') {
module.debug('Cancelling API request');
xhr.abort();
}
},
// reset state
reset: function() {
module.remove.error();
module.remove.loading();
},
setting: function(name, value) {
module.debug('Changing setting', name, value);
if( $.isPlainObject(name) ) {
$.extend(true, settings, name);
}
else if(value !== undefined) {
if($.isPlainObject(settings[name])) {
$.extend(true, settings[name], value);
}
else {
settings[name] = value;
}
}
else {
return settings[name];
}
},
internal: function(name, value) {
if( $.isPlainObject(name) ) {
$.extend(true, module, name);
}
else if(value !== undefined) {
module[name] = value;
}
else {
return module[name];
}
},
debug: function() {
if(!settings.silent && settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
module.debug.apply(console, arguments);
}
}
},
verbose: function() {
if(!settings.silent && settings.verbose && settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
module.verbose.apply(console, arguments);
}
}
},
error: function() {
if(!settings.silent) {
module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
module.error.apply(console, arguments);
}
},
performance: {
log: function(message) {
var
currentTime,
executionTime,
previousTime
;
if(settings.performance) {
currentTime = new Date().getTime();
previousTime = time || currentTime;
executionTime = currentTime - previousTime;
time = currentTime;
performance.push({
'Name' : message[0],
'Arguments' : [].slice.call(message, 1) || '',
//'Element' : element,
'Execution Time' : executionTime
});
}
clearTimeout(module.performance.timer);
module.performance.timer = setTimeout(module.performance.display, 500);
},
display: function() {
var
title = settings.name + ':',
totalTime = 0
;
time = false;
clearTimeout(module.performance.timer);
$.each(performance, function(index, data) {
totalTime += data['Execution Time'];
});
title += ' ' + totalTime + 'ms';
if(moduleSelector) {
title += ' \'' + moduleSelector + '\'';
}
if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
console.groupCollapsed(title);
if(console.table) {
console.table(performance);
}
else {
$.each(performance, function(index, data) {
console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
});
}
console.groupEnd();
}
performance = [];
}
},
invoke: function(query, passedArguments, context) {
var
object = instance,
maxDepth,
found,
response
;
passedArguments = passedArguments || queryArguments;
context = element || context;
if(typeof query == 'string' && object !== undefined) {
query = query.split(/[\. ]/);
maxDepth = query.length - 1;
$.each(query, function(depth, value) {
var camelCaseValue = (depth != maxDepth)
? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
: query
;
if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
object = object[camelCaseValue];
}
else if( object[camelCaseValue] !== undefined ) {
found = object[camelCaseValue];
return false;
}
else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
object = object[value];
}
else if( object[value] !== undefined ) {
found = object[value];
return false;
}
else {
module.error(error.method, query);
return false;
}
});
}
if ( $.isFunction( found ) ) {
response = found.apply(context, passedArguments);
}
else if(found !== undefined) {
response = found;
}
if($.isArray(returnedValue)) {
returnedValue.push(response);
}
else if(returnedValue !== undefined) {
returnedValue = [returnedValue, response];
}
else if(response !== undefined) {
returnedValue = response;
}
return found;
}
};
if(methodInvoked) {
if(instance === undefined) {
module.initialize();
}
module.invoke(query);
}
else {
if(instance !== undefined) {
instance.invoke('destroy');
}
module.initialize();
}
})
;
return (returnedValue !== undefined)
? returnedValue
: this
;
};
$.api.settings = {
name : 'API',
namespace : 'api',
debug : false,
verbose : false,
performance : true,
// object containing all templates endpoints
api : {},
// whether to cache responses
cache : true,
// whether new requests should abort previous requests
interruptRequests : true,
// event binding
on : 'auto',
// context for applying state classes
stateContext : false,
// duration for loading state
loadingDuration : 0,
// whether to hide errors after a period of time
hideError : 'auto',
// duration for error state
errorDuration : 2000,
// whether parameters should be encoded with encodeURIComponent
encodeParameters : true,
// API action to use
action : false,
// templated URL to use
url : false,
// base URL to apply to all endpoints
base : '',
// data that will
urlData : {},
// whether to add default data to url data
defaultData : true,
// whether to serialize closest form
serializeForm : false,
// how long to wait before request should occur
throttle : 0,
// whether to throttle first request or only repeated
throttleFirstRequest : true,
// standard ajax settings
method : 'get',
data : {},
dataType : 'json',
// mock response
mockResponse : false,
mockResponseAsync : false,
// aliases for mock
response : false,
responseAsync : false,
// callbacks before request
beforeSend : function(settings) { return settings; },
beforeXHR : function(xhr) {},
onRequest : function(promise, xhr) {},
// after request
onResponse : false, // function(response) { },
// response was successful, if JSON passed validation
onSuccess : function(response, $module) {},
// request finished without aborting
onComplete : function(response, $module) {},
// failed JSON success test
onFailure : function(response, $module) {},
// server error
onError : function(errorMessage, $module) {},
// request aborted
onAbort : function(errorMessage, $module) {},
successTest : false,
// errors
error : {
beforeSend : 'The before send function has aborted the request',
error : 'There was an error with your request',
exitConditions : 'API Request Aborted. Exit conditions met',
JSONParse : 'JSON could not be parsed during error handling',
legacyParameters : 'You are using legacy API success callback names',
method : 'The method you called is not defined',
missingAction : 'API action used but no url was defined',
missingSerialize : 'jquery-serialize-object is required to add form data to an existing data object',
missingURL : 'No URL specified for api event',
noReturnedValue : 'The beforeSend callback must return a settings object, beforeSend ignored.',
noStorage : 'Caching responses locally requires session storage',
parseError : 'There was an error parsing your request',
requiredParameter : 'Missing a required URL parameter: ',
statusMessage : 'Server gave an error: ',
timeout : 'Your request timed out'
},
regExp : {
required : /\{\$*[A-z0-9]+\}/g,
optional : /\{\/\$*[A-z0-9]+\}/g,
},
className: {
loading : 'loading',
error : 'error'
},
selector: {
disabled : '.disabled',
form : 'form'
},
metadata: {
action : 'action',
url : 'url'
}
};
})( jQuery, window, document );
================================================
FILE: semantic/src/definitions/behaviors/form.js
================================================
/*!
* # Semantic UI - Form Validation
* http://github.com/semantic-org/semantic-ui/
*
*
* Released under the MIT license
* http://opensource.org/licenses/MIT
*
*/
;(function ($, window, document, undefined) {
'use strict';
window = (typeof window != 'undefined' && window.Math == Math)
? window
: (typeof self != 'undefined' && self.Math == Math)
? self
: Function('return this')()
;
$.fn.form = function(parameters) {
var
$allModules = $(this),
moduleSelector = $allModules.selector || '',
time = new Date().getTime(),
performance = [],
query = arguments[0],
legacyParameters = arguments[1],
methodInvoked = (typeof query == 'string'),
queryArguments = [].slice.call(arguments, 1),
returnedValue
;
$allModules
.each(function() {
var
$module = $(this),
element = this,
formErrors = [],
keyHeldDown = false,
// set at run-time
$field,
$group,
$message,
$prompt,
$submit,
$clear,
$reset,
settings,
validation,
metadata,
selector,
className,
regExp,
error,
namespace,
moduleNamespace,
eventNamespace,
instance,
module
;
module = {
initialize: function() {
// settings grabbed at run time
module.get.settings();
if(methodInvoked) {
if(instance === undefined) {
module.instantiate();
}
module.invoke(query);
}
else {
if(instance !== undefined) {
instance.invoke('destroy');
}
module.verbose('Initializing form validation', $module, settings);
module.bindEvents();
module.set.defaults();
module.instantiate();
}
},
instantiate: function() {
module.verbose('Storing instance of module', module);
instance = module;
$module
.data(moduleNamespace, module)
;
},
destroy: function() {
module.verbose('Destroying previous module', instance);
module.removeEvents();
$module
.removeData(moduleNamespace)
;
},
refresh: function() {
module.verbose('Refreshing selector cache');
$field = $module.find(selector.field);
$group = $module.find(selector.group);
$message = $module.find(selector.message);
$prompt = $module.find(selector.prompt);
$submit = $module.find(selector.submit);
$clear = $module.find(selector.clear);
$reset = $module.find(selector.reset);
},
submit: function() {
module.verbose('Submitting form', $module);
$module
.submit()
;
},
attachEvents: function(selector, action) {
action = action || 'submit';
$(selector)
.on('click' + eventNamespace, function(event) {
module[action]();
event.preventDefault();
})
;
},
bindEvents: function() {
module.verbose('Attaching form events');
$module
.on('submit' + eventNamespace, module.validate.form)
.on('blur' + eventNamespace, selector.field, module.event.field.blur)
.on('click' + eventNamespace, selector.submit, module.submit)
.on('click' + eventNamespace, selector.reset, module.reset)
.on('click' + eventNamespace, selector.clear, module.clear)
;
if(settings.keyboardShortcuts) {
$module
.on('keydown' + eventNamespace, selector.field, module.event.field.keydown)
;
}
$field
.each(function() {
var
$input = $(this),
type = $input.prop('type'),
inputEvent = module.get.changeEvent(type, $input)
;
$(this)
.on(inputEvent + eventNamespace, module.event.field.change)
;
})
;
},
clear: function() {
$field
.each(function () {
var
$field = $(this),
$element = $field.parent(),
$fieldGroup = $field.closest($group),
$prompt = $fieldGroup.find(selector.prompt),
defaultValue = $field.data(metadata.defaultValue) || '',
isCheckbox = $element.is(selector.uiCheckbox),
isDropdown = $element.is(selector.uiDropdown),
isErrored = $fieldGroup.hasClass(className.error)
;
if(isErrored) {
module.verbose('Resetting error on field', $fieldGroup);
$fieldGroup.removeClass(className.error);
$prompt.remove();
}
if(isDropdown) {
module.verbose('Resetting dropdown value', $element, defaultValue);
$element.dropdown('clear');
}
else if(isCheckbox) {
$field.prop('checked', false);
}
else {
module.verbose('Resetting field value', $field, defaultValue);
$field.val('');
}
})
;
},
reset: function() {
$field
.each(function () {
var
$field = $(this),
$element = $field.parent(),
$fieldGroup = $field.closest($group),
$prompt = $fieldGroup.find(selector.prompt),
defaultValue = $field.data(metadata.defaultValue),
isCheckbox = $element.is(selector.uiCheckbox),
isDropdown = $element.is(selector.uiDropdown),
isErrored = $fieldGroup.hasClass(className.error)
;
if(defaultValue === undefined) {
return;
}
if(isErrored) {
module.verbose('Resetting error on field', $fieldGroup);
$fieldGroup.removeClass(className.error);
$prompt.remove();
}
if(isDropdown) {
module.verbose('Resetting dropdown value', $element, defaultValue);
$element.dropdown('restore defaults');
}
else if(isCheckbox) {
module.verbose('Resetting checkbox value', $element, defaultValue);
$field.prop('checked', defaultValue);
}
else {
module.verbose('Resetting field value', $field, defaultValue);
$field.val(defaultValue);
}
})
;
},
determine: {
isValid: function() {
var
allValid = true
;
$.each(validation, function(fieldName, field) {
if( !( module.validate.field(field, fieldName, true) ) ) {
allValid = false;
}
});
return allValid;
}
},
is: {
bracketedRule: function(rule) {
return (rule.type && rule.type.match(settings.regExp.bracket));
},
shorthandFields: function(fields) {
var
fieldKeys = Object.keys(fields),
firstRule = fields[fieldKeys[0]]
;
return module.is.shorthandRules(firstRule);
},
// duck type rule test
shorthandRules: function(rules) {
return (typeof rules == 'string' || $.isArray(rules));
},
empty: function($field) {
if(!$field || $field.length === 0) {
return true;
}
else if($field.is('input[type="checkbox"]')) {
return !$field.is(':checked');
}
else {
return module.is.blank($field);
}
},
blank: function($field) {
return $.trim($field.val()) === '';
},
valid: function(field) {
var
allValid = true
;
if(field) {
module.verbose('Checking if field is valid', field);
return module.validate.field(validation[field], field, false);
}
else {
module.verbose('Checking if form is valid');
$.each(validation, function(fieldName, field) {
if( !module.is.valid(fieldName) ) {
allValid = false;
}
});
return allValid;
}
}
},
removeEvents: function() {
$module
.off(eventNamespace)
;
$field
.off(eventNamespace)
;
$submit
.off(eventNamespace)
;
$field
.off(eventNamespace)
;
},
event: {
field: {
keydown: function(event) {
var
$field = $(this),
key = event.which,
isInput = $field.is(selector.input),
isCheckbox = $field.is(selector.checkbox),
isInDropdown = ($field.closest(selector.uiDropdown).length > 0),
keyCode = {
enter : 13,
escape : 27
}
;
if( key == keyCode.escape) {
module.verbose('Escape key pressed blurring field');
$field
.blur()
;
}
if(!event.ctrlKey && key == keyCode.enter && isInput && !isInDropdown && !isCheckbox) {
if(!keyHeldDown) {
$field
.one('keyup' + eventNamespace, module.event.field.keyup)
;
module.submit();
module.debug('Enter pressed on input submitting form');
}
keyHeldDown = true;
}
},
keyup: function() {
keyHeldDown = false;
},
blur: function(event) {
var
$field = $(this),
$fieldGroup = $field.closest($group),
validationRules = module.get.validation($field)
;
if( $fieldGroup.hasClass(className.error) ) {
module.debug('Revalidating field', $field, validationRules);
if(validationRules) {
module.validate.field( validationRules );
}
}
else if(settings.on == 'blur') {
if(validationRules) {
module.validate.field( validationRules );
}
}
},
change: function(event) {
var
$field = $(this),
$fieldGroup = $field.closest($group),
validationRules = module.get.validation($field)
;
if(validationRules && (settings.on == 'change' || ( $fieldGroup.hasClass(className.error) && settings.revalidate) )) {
clearTimeout(module.timer);
module.timer = setTimeout(function() {
module.debug('Revalidating field', $field, module.get.validation($field));
module.validate.field( validationRules );
}, settings.delay);
}
}
}
},
get: {
ancillaryValue: function(rule) {
if(!rule.type || (!rule.value && !module.is.bracketedRule(rule))) {
return false;
}
return (rule.value !== undefined)
? rule.value
: rule.type.match(settings.regExp.bracket)[1] + ''
;
},
ruleName: function(rule) {
if( module.is.bracketedRule(rule) ) {
return rule.type.replace(rule.type.match(settings.regExp.bracket)[0], '');
}
return rule.type;
},
changeEvent: function(type, $input) {
if(type == 'checkbox' || type == 'radio' || type == 'hidden' || $input.is('select')) {
return 'change';
}
else {
return module.get.inputEvent();
}
},
inputEvent: function() {
return (document.createElement('input').oninput !== undefined)
? 'input'
: (document.createElement('input').onpropertychange !== undefined)
? 'propertychange'
: 'keyup'
;
},
fieldsFromShorthand: function(fields) {
var
fullFields = {}
;
$.each(fields, function(name, rules) {
if(typeof rules == 'string') {
rules = [rules];
}
fullFields[name] = {
rules: []
};
$.each(rules, function(index, rule) {
fullFields[name].rules.push({ type: rule });
});
});
return fullFields;
},
prompt: function(rule, field) {
var
ruleName = module.get.ruleName(rule),
ancillary = module.get.ancillaryValue(rule),
$field = module.get.field(field.identifier),
value = $field.val(),
prompt = $.isFunction(rule.prompt)
? rule.prompt(value)
: rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule,
requiresValue = (prompt.search('{value}') !== -1),
requiresName = (prompt.search('{name}') !== -1),
$label,
name
;
if(requiresValue) {
prompt = prompt.replace('{value}', $field.val());
}
if(requiresName) {
$label = $field.closest(selector.group).find('label').eq(0);
name = ($label.length == 1)
? $label.text()
: $field.prop('placeholder') || settings.text.unspecifiedField
;
prompt = prompt.replace('{name}', name);
}
prompt = prompt.replace('{identifier}', field.identifier);
prompt = prompt.replace('{ruleValue}', ancillary);
if(!rule.prompt) {
module.verbose('Using default validation prompt for type', prompt, ruleName);
}
return prompt;
},
settings: function() {
if($.isPlainObject(parameters)) {
var
keys = Object.keys(parameters),
isLegacySettings = (keys.length > 0)
? (parameters[keys[0]].identifier !== undefined && parameters[keys[0]].rules !== undefined)
: false,
ruleKeys
;
if(isLegacySettings) {
// 1.x (ducktyped)
settings = $.extend(true, {}, $.fn.form.settings, legacyParameters);
validation = $.extend({}, $.fn.form.settings.defaults, parameters);
module.error(settings.error.oldSyntax, element);
module.verbose('Extending settings from legacy parameters', validation, settings);
}
else {
// 2.x
if(parameters.fields && module.is.shorthandFields(parameters.fields)) {
parameters.fields = module.get.fieldsFromShorthand(parameters.fields);
}
settings = $.extend(true, {}, $.fn.form.settings, parameters);
validation = $.extend({}, $.fn.form.settings.defaults, settings.fields);
module.verbose('Extending settings', validation, settings);
}
}
else {
settings = $.fn.form.settings;
validation = $.fn.form.settings.defaults;
module.verbose('Using default form validation', validation, settings);
}
// shorthand
namespace = settings.namespace;
metadata = settings.metadata;
selector = settings.selector;
className = settings.className;
regExp = settings.regExp;
error = settings.error;
moduleNamespace = 'module-' + namespace;
eventNamespace = '.' + namespace;
// grab instance
instance = $module.data(moduleNamespace);
// refresh selector cache
module.refresh();
},
field: function(identifier) {
module.verbose('Finding field with identifier', identifier);
identifier = module.escape.string(identifier);
if($field.filter('#' + identifier).length > 0 ) {
return $field.filter('#' + identifier);
}
else if( $field.filter('[name="' + identifier +'"]').length > 0 ) {
return $field.filter('[name="' + identifier +'"]');
}
else if( $field.filter('[name="' + identifier +'[]"]').length > 0 ) {
return $field.filter('[name="' + identifier +'[]"]');
}
else if( $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]').length > 0 ) {
return $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]');
}
return $('<input/>');
},
fields: function(fields) {
var
$fields = $()
;
$.each(fields, function(index, name) {
$fields = $fields.add( module.get.field(name) );
});
return $fields;
},
validation: function($field) {
var
fieldValidation,
identifier
;
if(!validation) {
return false;
}
$.each(validation, function(fieldName, field) {
identifier = field.identifier || fieldName;
if( module.get.field(identifier)[0] == $field[0] ) {
field.identifier = identifier;
fieldValidation = field;
}
});
return fieldValidation || false;
},
value: function (field) {
var
fields = [],
results
;
fields.push(field);
results = module.get.values.call(element, fields);
return results[field];
},
values: function (fields) {
var
$fields = $.isArray(fields)
? module.get.fields(fields)
: $field,
values = {}
;
$fields.each(function(index, field) {
var
$field = $(field),
type = $field.prop('type'),
name = $field.prop('name'),
value = $field.val(),
isCheckbox = $field.is(selector.checkbox),
isRadio = $field.is(selector.radio),
isMultiple = (name.indexOf('[]') !== -1),
isChecked = (isCheckbox)
? $field.is(':checked')
: false
;
if(name) {
if(isMultiple) {
name = name.replace('[]', '');
if(!values[name]) {
values[name] = [];
}
if(isCheckbox) {
if(isChecked) {
values[name].push(value || true);
}
else {
values[name].push(false);
}
}
else {
values[name].push(value);
}
}
else {
if(isRadio) {
if(values[name] === undefined || values[name] == false) {
values[name] = (isChecked)
? value || true
: false
;
}
}
else if(isCheckbox) {
if(isChecked) {
values[name] = value || true;
}
else {
values[name] = false;
}
}
else {
values[name] = value;
}
}
}
});
return values;
}
},
has: {
field: function(identifier) {
module.verbose('Checking for existence of a field with identifier', identifier);
identifier = module.escape.string(identifier);
if(typeof identifier !== 'string') {
module.error(error.identifier, identifier);
}
if($field.filter('#' + identifier).length > 0 ) {
return true;
}
else if( $field.filter('[name="' + identifier +'"]').length > 0 ) {
return true;
}
else if( $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]').length > 0 ) {
return true;
}
return false;
}
},
escape: {
string: function(text) {
text = String(text);
return text.replace(regExp.escape, '\\$&');
}
},
add: {
// alias
rule: function(name, rules) {
module.add.field(name, rules);
},
field: function(name, rules) {
var
newValidation = {}
;
if(module.is.shorthandRules(rules)) {
rules = $.isArray(rules)
? rules
: [rules]
;
newValidation[name] = {
rules: []
};
$.each(rules, function(index, rule) {
newValidation[name].rules.push({ type: rule });
});
}
else {
newValidation[name] = rules;
}
validation = $.extend({}, validation, newValidation);
module.debug('Adding rules', newValidation, validation);
},
fields: function(fields) {
var
newValidation
;
if(fields && module.is.shorthandFields(fields)) {
newValidation = module.get.fieldsFromShorthand(fields);
}
else {
newValidation = fields;
}
validation = $.extend({}, validation, newValidation);
},
prompt: function(identifier, errors) {
var
$field = module.get.field(identifier),
$fieldGroup = $field.closest($group),
$prompt = $fieldGroup.children(selector.prompt),
promptExists = ($prompt.length !== 0)
;
errors = (typeof errors == 'string')
? [errors]
: errors
;
module.verbose('Adding field error state', identifier);
$fieldGroup
.addClass(className.error)
;
if(settings.inline) {
if(!promptExists) {
$prompt = settings.templates.prompt(errors);
$prompt
.appendTo($fieldGroup)
;
}
$prompt
.html(errors[0])
;
if(!promptExists) {
if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
module.verbose('Displaying error with css transition', settings.transition);
$prompt.transition(settings.transition + ' in', settings.duration);
}
else {
module.verbose('Displaying error with fallback javascript animation');
$prompt
.fadeIn(settings.duration)
;
}
}
else {
module.verbose('Inline errors are disabled, no inline error added', identifier);
}
}
},
errors: function(errors) {
module.debug('Adding form error messages', errors);
module.set.error();
$message
.html( settings.templates.error(errors) )
;
}
},
remove: {
rule: function(field, rule) {
var
rules = $.isArray(rule)
? rule
: [rule]
;
if(rule == undefined) {
module.debug('Removed all rules');
validation[field].rules = [];
return;
}
if(validation[field] == undefined || !$.isArray(validation[field].rules)) {
return;
}
$.each(validation[field].rules, function(index, rule) {
if(rules.indexOf(rule.type) !== -1) {
module.debug('Removed rule', rule.type);
validation[field].rules.splice(index, 1);
}
});
},
field: function(field) {
var
fields = $.isArray(field)
? field
: [field]
;
$.each(fields, function(index, field) {
module.remove.rule(field);
});
},
// alias
rules: function(field, rules) {
if($.isArray(field)) {
$.each(fields, function(index, field) {
module.remove.rule(field, rules);
});
}
else {
module.remove.rule(field, rules);
}
},
fields: function(fields) {
module.remove.field(fields);
},
prompt: function(identifier) {
var
$field = module.get.field(identifier),
$fieldGroup = $field.closest($group),
$prompt = $fieldGroup.children(selector.prompt)
;
$fieldGroup
.removeClass(className.error)
;
if(settings.inline && $prompt.is(':visible')) {
module.verbose('Removing prompt for field', identifier);
if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
$prompt.transition(settings.transition + ' out', settings.duration, function() {
$prompt.remove();
});
}
else {
$prompt
.fadeOut(settings.duration, function(){
$prompt.remove();
})
;
}
}
}
},
set: {
success: function() {
$module
.removeClass(className.error)
.addClass(className.success)
;
},
defaults: function () {
$field
.each(function () {
var
$field = $(this),
isCheckbox = ($field.filter(selector.checkbox).length > 0),
value = (isCheckbox)
? $field.is(':checked')
: $field.val()
;
$field.data(metadata.defaultValue, value);
})
;
},
error: function() {
$module
.removeClass(className.success)
.addClass(className.error)
;
},
value: function (field, value) {
var
fields = {}
;
fields[field] = value;
return module.set.values.call(element, fields);
},
values: function (fields) {
if($.isEmptyObject(fields)) {
return;
}
$.each(fields, function(key, value) {
var
$field = module.get.field(key),
$element = $field.parent(),
isMultiple = $.isArray(value),
isCheckbox = $element.is(selector.uiCheckbox),
isDropdown = $element.is(selector.uiDropdown),
isRadio = ($field.is(selector.radio) && isCheckbox),
fieldExists = ($field.length > 0),
$multipleField
;
if(fieldExists) {
if(isMultiple && isCheckbox) {
module.verbose('Selecting multiple', value, $field);
$element.checkbox('uncheck');
$.each(value, function(index, value) {
$multipleField = $field.filter('[value="' + value + '"]');
$element = $multipleField.parent();
if($multipleField.length > 0) {
$element.checkbox('check');
}
});
}
else if(isRadio) {
module.verbose('Selecting radio value', value, $field);
$field.filter('[value="' + value + '"]')
.parent(selector.uiCheckbox)
.checkbox('check')
;
}
else if(isCheckbox) {
module.verbose('Setting checkbox value', value, $element);
if(value === true) {
$element.checkbox('check');
}
else {
$element.checkbox('uncheck');
}
}
else if(isDropdown) {
module.verbose('Setting dropdown value', value, $element);
$element.dropdown('set selected', value);
}
else {
module.verbose('Setting field value', value, $field);
$field.val(value);
}
}
});
}
},
validate: {
form: function(event, ignoreCallbacks) {
var
values = module.get.values(),
apiRequest
;
// input keydown event will fire submit repeatedly by browser default
if(keyHeldDown) {
return false;
}
// reset errors
formErrors = [];
if( module.determine.isValid() ) {
module.debug('Form has no validation errors, submitting');
module.set.success();
if(ignoreCallbacks !== true) {
return settings.onSuccess.call(element, event, values);
}
}
else {
module.debug('Form has errors');
module.set.error();
if(!settings.inline) {
module.add.errors(formErrors);
}
// prevent ajax submit
if($module.data('moduleApi') !== undefined) {
event.stopImmediatePropagation();
}
if(ignoreCallbacks !== true) {
return settings.onFailure.call(element, formErrors, values);
}
}
},
// takes a validation object and returns whether field passes validation
field: function(field, fieldName, showErrors) {
showErrors = (showErrors !== undefined)
? showErrors
: true
;
if(typeof field == 'string') {
module.verbose('Validating field', field);
fieldName = field;
field = validation[field];
}
var
identifier = field.identifier || fieldName,
$field = module.get.field(identifier),
$dependsField = (field.depends)
? module.get.field(field.depends)
: false,
fieldValid = true,
fieldErrors = []
;
if(!field.identifier) {
module.debug('Using field name as identifier', identifier);
field.identifier = identifier;
}
if($field.prop('disabled')) {
module.debug('Field is disabled. Skipping', identifier);
fieldValid = true;
}
else if(field.optional && module.is.blank($field)){
module.debug('Field is optional and blank. Skipping', identifier);
fieldValid = true;
}
else if(field.depends && module.is.empty($dependsField)) {
module.debug('Field depends on another value that is not present or empty. Skipping', $dependsField);
fieldValid = true;
}
else if(field.rules !== undefined) {
$.each(field.rules, function(index, rule) {
if( module.has.field(identifier) && !( module.validate.rule(field, rule) ) ) {
module.debug('Field is invalid', identifier, rule.type);
fieldErrors.push(module.get.prompt(rule, field));
fieldValid = false;
}
});
}
if(fieldValid) {
if(showErrors) {
module.remove.prompt(identifier, fieldErrors);
settings.onValid.call($field);
}
}
else {
if(showErrors) {
formErrors = formErrors.concat(fieldErrors);
module.add.prompt(identifier, fieldErrors);
settings.onInvalid.call($field, fieldErrors);
}
return false;
}
return true;
},
// takes validation rule and returns whether field passes rule
rule: function(field, rule) {
var
$field = module.get.field(field.identifier),
type = rule.type,
value = $field.val(),
isValid = true,
ancillary = module.get.ancillaryValue(rule),
ruleName = module.get.ruleName(rule),
ruleFunction = settings.rules[ruleName]
;
if( !$.isFunction(ruleFunction) ) {
module.error(error.noRule, ruleName);
return;
}
// cast to string avoiding encoding special values
value = (value === undefined || value === '' || value === null)
? ''
: $.trim(value + '')
;
return ruleFunction.call($field, value, ancillary);
}
},
setting: function(name, value) {
if( $.isPlainObject(name) ) {
$.extend(true, settings, name);
}
else if(value !== undefined) {
settings[name] = value;
}
else {
return settings[name];
}
},
internal: function(name, value) {
if( $.isPlainObject(name) ) {
$.extend(true, module, name);
}
else if(value !== undefined) {
module[name] = value;
}
else {
return module[name];
}
},
debug: function() {
if(!settings.silent && settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
module.debug.apply(console, arguments);
}
}
},
verbose: function() {
if(!settings.silent && settings.verbose && settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
module.verbose.apply(console, arguments);
}
}
},
error: function() {
if(!settings.silent) {
module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
module.error.apply(console, arguments);
}
},
performance: {
log: function(message) {
var
currentTime,
executionTime,
previousTime
;
if(settings.performance) {
currentTime = new Date().getTime();
previousTime = time || currentTime;
executionTime = currentTime - previousTime;
time = currentTime;
performance.push({
'Name' : message[0],
'Arguments' : [].slice.call(message, 1) || '',
'Element' : element,
'Execution Time' : executionTime
});
}
clearTimeout(module.performance.timer);
module.performance.timer = setTimeout(module.performance.display, 500);
},
display: function() {
var
title = settings.name + ':',
totalTime = 0
;
time = false;
clearTimeout(module.performance.timer);
$.each(performance, function(index, data) {
totalTime += data['Execution Time'];
});
title += ' ' + totalTime + 'ms';
if(moduleSelector) {
title += ' \'' + moduleSelector + '\'';
}
if($allModules.length > 1) {
title += ' ' + '(' + $allModules.length + ')';
}
if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
console.groupCollapsed(title);
if(console.table) {
console.table(performance);
}
else {
$.each(performance, function(index, data) {
console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
});
}
console.groupEnd();
}
performance = [];
}
},
invoke: function(query, passedArguments, context) {
var
object = instance,
maxDepth,
found,
response
;
passedArguments = passedArguments || queryArguments;
context = element || context;
if(typeof query == 'string' && object !== undefined) {
query = query.split(/[\. ]/);
maxDepth = query.length - 1;
$.each(query, function(depth, value) {
var camelCaseValue = (depth != maxDepth)
? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
: query
;
if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
object = object[camelCaseValue];
}
else if( object[camelCaseValue] !== undefined ) {
found = object[camelCaseValue];
return false;
}
else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
object = object[value];
}
else if( object[value] !== undefined ) {
found = object[value];
return false;
}
else {
return false;
}
});
}
if( $.isFunction( found ) ) {
response = found.apply(context, passedArguments);
}
else if(found !== undefined) {
response = found;
}
if($.isArray(returnedValue)) {
returnedValue.push(response);
}
else if(returnedValue !== undefined) {
returnedValue = [returnedValue, response];
}
else if(response !== undefined) {
returnedValue = response;
}
return found;
}
};
module.initialize();
})
;
return (returnedValue !== undefined)
? returnedValue
: this
;
};
$.fn.form.settings = {
name : 'Form',
namespace : 'form',
debug : false,
verbose : false,
performance : true,
fields : false,
keyboardShortcuts : true,
on : 'submit',
inline : false,
delay : 200,
revalidate : true,
transition : 'scale',
duration : 200,
onValid : function() {},
onInvalid : function() {},
onSuccess : function() { return true; },
onFailure : function() { return false; },
metadata : {
defaultValue : 'default',
validate : 'validate'
},
regExp: {
htmlID : /^[a-zA-Z][\w:.-]*$/g,
bracket : /\[(.*)\]/i,
decimal : /^\d+\.?\d*$/,
email : /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,
escape : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
flags : /^\/(.*)\/(.*)?/,
integer : /^\-?\d+$/,
number : /^\-?\d*(\.\d+)?$/,
url : /(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/i
},
text: {
unspecifiedRule : 'Please enter a valid value',
unspecifiedField : 'This field'
},
prompt: {
empty : '{name} must have a value',
checked : '{name} must be checked',
email : '{name} must be a valid e-mail',
url : '{name} must be a valid url',
regExp : '{name} is not formatted correctly',
integer : '{name} must be an integer',
decimal : '{name} must be a decimal number',
number : '{name} must be set to a number',
is : '{name} must be "{ruleValue}"',
isExactly : '{name} must be exactly "{ruleValue}"',
not : '{name} cannot be set to "{ruleValue}"',
notExactly : '{name} cannot be set to exactly "{ruleValue}"',
contain : '{name} must contain "{ruleValue}"',
containExactly : '{name} must contain exactly "{ruleValue}"',
doesntContain : '{name} cannot contain "{ruleValue}"',
doesntContainExactly : '{name} cannot contain exactly "{ruleValue}"',
minLength : '{name} must be at least {ruleValue} characters',
length : '{name} must be at least {ruleValue} characters',
exactLength : '{name} must be exactly {ruleValue} characters',
maxLength : '{name} cannot be longer than {ruleValue} characters',
match : '{name} must match {ruleValue} field',
different : '{name} must have a different value than {ruleValue} field',
creditCard : '{name} must be a valid credit card number',
minCount : '{name} must have at least {ruleValue} choices',
exactCount : '{name} must have exactly {ruleValue} choices',
maxCount : '{name} must have {ruleValue} or less choices'
},
selector : {
checkbox : 'input[type="checkbox"], input[type="radio"]',
clear : '.clear',
field : 'input, textarea, select',
group : '.field',
input : 'input',
message : '.error.message',
prompt : '.prompt.label',
radio : 'input[type="radio"]',
reset : '.reset:not([type="reset"])',
submit : '.submit:not([type="submit"])',
uiCheckbox : '.ui.checkbox',
uiDropdown : '.ui.dropdown'
},
className : {
error : 'error',
label : 'ui prompt label',
pressed : 'down',
success : 'success'
},
error: {
identifier : 'You must specify a string identifier for each field',
method : 'The method you called is not defined.',
noRule : 'There is no rule matching the one you specified',
oldSyntax : 'Starting in 2.0 forms now only take a single settings object. Validation settings converted to new syntax automatically.'
},
templates: {
// template that produces error message
error: function(errors) {
var
html = '<ul class="list">'
;
$.each(errors, function(index, value) {
html += '<li>' + value + '</li>';
});
html += '</ul>';
return $(html);
},
// template that produces label
prompt: function(errors) {
return $('<div/>')
.addClass('ui basic red pointing prompt label')
.html(errors[0])
;
}
},
rules: {
// is not empty or blank string
empty: function(value) {
return !(value === undefined || '' === value || $.isArray(value) && value.length === 0);
},
// checkbox checked
checked: function() {
return ($(this).filter(':checked').length > 0);
},
// is most likely an email
email: function(value){
return $.fn.form.settings.regExp.email.test(value);
},
// value is most likely url
url: function(value) {
return $.fn.form.settings.regExp.url.test(value);
},
// matches specified regExp
regExp: function(value, regExp) {
if(regExp instanceof RegExp) {
return value.match(regExp);
}
var
regExpParts = regExp.match($.fn.form.settings.regExp.flags),
flags
;
// regular expression specified as /baz/gi (flags)
if(regExpParts) {
regExp = (regExpParts.length >= 2)
? regExpParts[1]
: regExp
;
flags = (regExpParts.length >= 3)
? regExpParts[2]
: ''
;
}
return value.match( new RegExp(regExp, flags) );
},
// is valid integer or matches range
integer: function(value, range) {
var
intRegExp = $.fn.form.settings.regExp.integer,
min,
max,
parts
;
if( !range || ['', '..'].indexOf(range) !== -1) {
// do nothing
}
else if(range.indexOf('..') == -1) {
if(intRegExp.test(range)) {
min = max = range - 0;
}
}
else {
parts = range.split('..', 2);
if(intRegExp.test(parts[0])) {
min = parts[0] - 0;
}
if(intRegExp.test(parts[1])) {
max = parts[1] - 0;
}
}
return (
intRegExp.test(value) &&
(min === undefined || value >= min) &&
(max === undefined || value <= max)
);
},
// is valid number (with decimal)
decimal: function(value) {
return $.fn.form.settings.regExp.decimal.test(value);
},
// is valid number
number: function(value) {
return $.fn.form.settings.regExp.number.test(value);
},
// is value (case insensitive)
is: function(value, text) {
text = (typeof text == 'string')
? text.toLowerCase()
: text
;
value = (typeof value == 'string')
? value.toLowerCase()
: value
;
return (value == text);
},
// is value
isExactly: function(value, text) {
return (value == text);
},
// value is not another value (case insensitive)
not: function(value, notValue) {
value = (typeof value == 'string')
? value.toLowerCase()
: value
;
notValue = (typeof notValue == 'string')
? notValue.toLowerCase()
: notValue
;
return (value != notValue);
},
// value is not another value (case sensitive)
notExactly: function(value, notValue) {
return (value != notValue);
},
// value contains text (insensitive)
contains: function(value, text) {
// escape regex characters
text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
return (value.search( new RegExp(text, 'i') ) !== -1);
},
// value contains text (case sensitive)
containsExactly: function(value, text) {
// escape regex characters
text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
return (value.search( new RegExp(text) ) !== -1);
},
// value contains text (insensitive)
doesntContain: function(value, text) {
// escape regex characters
text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
return (value.search( new RegExp(text, 'i') ) === -1);
},
// value contains text (case sensitive)
doesntContainExactly: function(value, text) {
// escape regex characters
text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
return (value.search( new RegExp(text) ) === -1);
},
// is at least string length
minLength: function(value, requiredLength) {
return (value !== undefined)
? (value.length >= requiredLength)
: false
;
},
// see rls notes for 2.0.6 (this is a duplicate of minLength)
length: function(value, requiredLength) {
return (value !== undefined)
? (value.length >= requiredLength)
: false
;
},
// is exactly length
exactLength: function(value, requiredLength) {
return (value !== undefined)
? (value.length == requiredLength)
: false
;
},
// is less than length
maxLength: function(value, maxLength) {
return (value !== undefined)
? (value.length <= maxLength)
: false
;
},
// matches another field
match: function(value, identifier) {
var
$form = $(this),
matchingValue
;
if( $('[data-validate="'+ identifier +'"]').length > 0 ) {
matchingValue = $('[data-validate="'+ identifier +'"]').val();
}
else if($('#' + identifier).length > 0) {
matchingValue = $('#' + identifier).val();
}
else if($('[name="' + identifier +'"]').length > 0) {
matchingValue = $('[name="' + identifier + '"]').val();
}
else if( $('[name="' + identifier +'[]"]').length > 0 ) {
matchingValue = $('[name="' + identifier +'[]"]');
}
return (matchingValue !== undefined)
? ( value.toString() == matchingValue.toString() )
: false
;
},
// different than another field
different: function(value, identifier) {
// use either id or name of field
var
$form = $(this),
matchingValue
;
if( $('[data-validate="'+ identifier +'"]').length > 0 ) {
matchingValue = $('[data-validate="'+ identifier +'"]').val();
}
else if($('#' + identifier).length > 0) {
matchingValue = $('#' + identifier).val();
}
else if($('[name="' + identifier +'"]').length > 0) {
matchingValue = $('[name="' + identifier + '"]').val();
}
else if( $('[name="' + identifier +'[]"]').length > 0 ) {
matchingValue = $('[name="' + identifier +'[]"]');
}
return (matchingValue !== undefined)
? ( value.toString() !== matchingValue.toString() )
: false
;
},
creditCard: function(cardNumber, cardTypes) {
var
cards = {
visa: {
pattern : /^4/,
length : [16]
},
amex: {
pattern : /^3[47]/,
length : [15]
},
mastercard: {
pattern : /^5[1-5]/,
length : [16]
},
discover: {
pattern : /^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)/,
length : [16]
},
unionPay: {
pattern : /^(62|88)/,
length : [16, 17, 18, 19]
},
jcb: {
pattern : /^35(2[89]|[3-8][0-9])/,
length : [16]
},
maestro: {
pattern : /^(5018|5020|5038|6304|6759|676[1-3])/,
length : [12, 13, 14, 15, 16, 17, 18, 19]
},
dinersClub: {
pattern : /^(30[0-5]|^36)/,
length : [14]
},
laser: {
pattern : /^(6304|670[69]|6771)/,
length : [16, 17, 18, 19]
},
visaElectron: {
pattern : /^(4026|417500|4508|4844|491(3|7))/,
length : [16]
}
},
valid = {},
validCard = false,
requiredTypes = (typeof cardTypes == 'string')
? cardTypes.split(',')
: false,
unionPay,
validation
;
if(typeof cardNumber !== 'string' || cardNumber.length === 0) {
return;
}
// allow dashes in card
cardNumber = cardNumber.replace(/[\-]/g, '');
// verify card types
if(requiredTypes) {
$.each(requiredTypes, function(index, type){
// verify each card type
validation = cards[type];
if(validation) {
valid = {
length : ($.inArray(cardNumber.length, validation.length) !== -1),
pattern : (cardNumber.search(validation.pattern) !== -1)
};
if(valid.length && valid.pattern) {
validCard = true;
}
}
});
if(!validCard) {
return false;
}
}
// skip luhn for UnionPay
unionPay = {
number : ($.inArray(cardNumber.length, cards.unionPay.length) !== -1),
pattern : (cardNumber.search(cards.unionPay.pattern) !== -1)
};
if(unionPay.number && unionPay.pattern) {
return true;
}
// verify luhn, adapted from <https://gist.github.com/2134376>
var
length = cardNumber.length,
multiple = 0,
producedValue = [
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
],
sum = 0
;
while (length--) {
sum += producedValue[multiple][parseInt(cardNumber.charAt(length), 10)];
multiple ^= 1;
}
return (sum % 10 === 0 && sum > 0);
},
minCount: function(value, minCount) {
if(minCount == 0) {
return true;
}
if(minCount == 1) {
return (value !== '');
}
return (value.split(',').length >= minCount);
},
exactCount: function(value, exactCount) {
if(exactCount == 0) {
return (value === '');
}
if(exactCount == 1) {
return (value !== '' && value.search(',') === -1);
}
return (value.split(',').length == exactCount);
},
maxCount: function(value, maxCount) {
if(maxCount == 0) {
return false;
}
if(maxCount == 1) {
return (value.search(',') === -1);
}
return (value.split(',').length <= maxCount);
}
}
};
})( jQuery, window, document );
================================================
FILE: semantic/src/definitions/behaviors/visibility.js
================================================
/*!
* # Semantic UI - Visibility
* http://github.com/semantic-org/semantic-ui/
*
*
* Released under the MIT license
* http://opensource.org/licenses/MIT
*
*/
;(function ($, window, document, undefined) {
'use strict';
window = (typeof window != 'undefined' && window.Math == Math)
? window
: (typeof self != 'undefined' && self.Math == Math)
? self
: Function('return this')()
;
$.fn.visibility = function(parameters) {
var
$allModules = $(this),
moduleSelector = $allModules.selector || '',
time = new Date().getTime(),
performance = [],
query = arguments[0],
methodInvoked = (typeof query == 'string'),
queryArguments = [].slice.call(arguments, 1),
returnedValue,
moduleCount = $allModules.length,
loadedCount = 0
;
$allModules
.each(function() {
var
settings = ( $.isPlainObject(parameters) )
? $.extend(true, {}, $.fn.visibility.settings, parameters)
: $.extend({}, $.fn.visibility.settings),
className = settings.className,
namespace = settings.namespace,
error = settings.error,
metadata = settings.metadata,
eventNamespace = '.' + namespace,
moduleNamespace = 'module-' + namespace,
$window = $(window),
$module = $(this),
$context = $(settings.context),
$placeholder,
selector = $module.selector || '',
instance = $module.data(moduleNamespace),
requestAnimationFrame = window.requestAnimationFrame
|| window.mozRequestAnimationFrame
|| window.webkitRequestAnimationFrame
|| window.msRequestAnimationFrame
|| function(callback) { setTimeout(callback, 0); },
element = this,
disabled = false,
contextObserver,
observer,
module
;
module = {
initialize: function() {
module.debug('Initializing', settings);
module.setup.cache();
if( module.should.trackChanges() ) {
if(settings.type == 'image') {
module.setup.image();
}
if(settings.type == 'fixed') {
module.setup.fixed();
}
if(settings.observeChanges) {
module.observeChanges();
}
module.bind.events();
}
module.save.position();
if( !module.is.visible() ) {
module.error(error.visible, $module);
}
if(settings.initialCheck) {
module.checkVisibility();
}
module.instantiate();
},
instantiate: function() {
module.debug('Storing instance', module);
$module
.data(moduleNamespace, module)
;
instance = module;
},
destroy: function() {
module.verbose('Destroying previous module');
if(observer) {
observer.disconnect();
}
if(contextObserver) {
contextObserver.disconnect();
}
$window
.off('load' + eventNamespace, module.event.load)
.off('resize' + eventNamespace, module.event.resize)
;
$context
.off('scroll' + eventNamespace, module.event.scroll)
.off('scrollchange' + eventNamespace, module.event.scrollchange)
;
if(settings.type == 'fixed') {
module.resetFixed();
module.remove.placeholder();
}
$module
.off(eventNamespace)
.removeData(moduleNamespace)
;
},
observeChanges: function() {
if('MutationObserver' in window) {
contextObserver = new MutationObserver(module.event.contextChanged);
observer = new MutationObserver(module.event.changed);
contextObserver.observe(document, {
childList : true,
subtree : true
});
observer.observe(element, {
childList : true,
subtree : true
});
module.debug('Setting up mutation observer', observer);
}
},
bind: {
events: function() {
module.verbose('Binding visibility events to scroll and resize');
if(settings.refreshOnLoad) {
$window
.on('load' + eventNamespace, module.event.load)
;
}
$window
.on('resize' + eventNamespace, module.event.resize)
;
// pub/sub pattern
$context
.off('scroll' + eventNamespace)
.on('scroll' + eventNamespace, module.event.scroll)
.on('scrollchange' + eventNamespace, module.event.scrollchange)
;
}
},
event: {
changed: function(mutations) {
module.verbose('DOM tree modified, updating visibility calculations');
module.timer = setTimeout(function() {
module.verbose('DOM tree modified, updating sticky menu');
module.refresh();
}, 100);
},
contextChanged: function(mutations) {
[].forEach.call(mutations, function(mutation) {
if(mutation.removedNodes) {
[].forEach.call(mutation.removedNodes, function(node) {
if(node == element || $(node).find(element).length > 0) {
module.debug('Element removed from DOM, tearing down events');
module.destroy();
}
});
}
});
},
resize: function() {
module.debug('Window resized');
if(settings.refreshOnResize) {
requestAnimationFrame(module.refresh);
}
},
load: function() {
module.debug('Page finished loading');
requestAnimationFrame(module.refresh);
},
// publishes scrollchange event on one scroll
scroll: function() {
if(settings.throttle) {
clearTimeout(module.timer);
module.timer = setTimeout(function() {
$context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);
}, settings.throttle);
}
else {
requestAnimationFrame(function() {
$context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);
});
}
},
// subscribes to scrollchange
scrollchange: function(event, scrollPosition) {
module.checkVisibility(scrollPosition);
},
},
precache: function(images, callback) {
if (!(images instanceof Array)) {
images = [images];
}
var
imagesLength = images.length,
loadedCounter = 0,
cache = [],
cacheImage = document.createElement('img'),
handleLoad = function() {
loadedCounter++;
if (loadedCounter >= images.length) {
if ($.isFunction(callback)) {
callback();
}
}
}
;
while (imagesLength--) {
cacheImage = document.createElement('img');
cacheImage.onload = handleLoad;
cacheImage.onerror = handleLoad;
cacheImage.src = images[imagesLength];
cache.push(cacheImage);
}
},
enableCallbacks: function() {
module.debug('Allowing callbacks to occur');
disabled = false;
},
disableCallbacks: function() {
module.debug('Disabling all callbacks temporarily');
disabled = true;
},
should: {
trackChanges: function() {
if(methodInvoked) {
module.debug('One time query, no need to bind events');
return false;
}
module.debug('Callbacks being attached');
return true;
}
},
setup: {
cache: function() {
module.cache = {
occurred : {},
screen : {},
element : {},
};
},
image: function() {
var
src = $module.data(metadata.src)
;
if(src) {
module.verbose('Lazy loading image', src);
settings.once = true;
settings.observeChanges = false;
// show when top visible
settings.onOnScreen = function() {
module.debug('Image on screen', element);
module.precache(src, function() {
module.set.image(src, function() {
loadedCount++;
if(loadedCount == moduleCount) {
settings.onAllLoaded.call(this);
}
settings.onLoad.call(this);
});
});
};
}
},
fixed: function() {
module.debug('Setting up fixed');
settings.once = false;
settings.observeChanges = false;
settings.initialCheck = true;
settings.refreshOnLoad = true;
if(!parameters.transition) {
settings.transition = false;
}
module.create.placeholder();
module.debug('Added placeholder', $placeholder);
settings.onTopPassed = function() {
module.debug('Element passed, adding fixed position', $module);
module.show.placeholder();
module.set.fixed();
if(settings.transition) {
if($.fn.transition !== undefined) {
$module.transition(settings.transition, settings.duration);
}
}
};
settings.onTopPassedReverse = function() {
module.debug('Element returned to position, removing fixed', $module);
module.hide.placeholder();
module.remove.fixed();
};
}
},
create: {
placeholder: function() {
module.verbose('Creating fixed position placeholder');
$placeholder = $module
.clone(false)
.css('display', 'none')
.addClass(className.placeholder)
.insertAfter($module)
;
}
},
show: {
placeholder: function() {
module.verbose('Showing placeholder');
$placeholder
.css('display', 'block')
.css('visibility', 'hidden')
;
}
},
hide: {
placeholder: function() {
module.verbose('Hiding placeholder');
$placeholder
.css('display', 'none')
.css('visibility', '')
;
}
},
set: {
fixed: function() {
module.verbose('Setting element to fixed position');
$module
.addClass(className.fixed)
.css({
position : 'fixed',
top : settings.offset + 'px',
left : 'auto',
zIndex : settings.zIndex
})
;
settings.onFixed.call(element);
},
image: function(src, callback) {
$module
.attr('src', src)
;
if(settings.transition) {
if( $.fn.transition !== undefined) {
if($module.hasClass(className.visible)) {
module.debug('Transition already occurred on this image, skipping animation');
return;
}
$module.transition(settings.transition, settings.duration, callback);
}
else {
$module.fadeIn(settings.duration, callback);
}
}
else {
$module.show();
}
}
},
is: {
onScreen: function() {
var
calculations = module.get.elementCalculations()
;
return calculations.onScreen;
},
offScreen: function() {
var
calculations = module.get.elementCalculations()
;
return calculations.offScreen;
},
visible: function() {
if(module.cache && module.cache.element) {
return !(module.cache.element.width === 0 && module.cache.element.offset.top === 0);
}
return false;
},
verticallyScrollableContext: function() {
var
overflowY = ($context.get(0) !== window)
? $context.css('overflow-y')
: false
;
return (overflowY == 'auto' || overflowY == 'scroll');
},
horizontallyScrollableContext: function() {
var
overflowX = ($context.get(0) !== window)
? $context.css('overflow-x')
: false
;
return (overflowX == 'auto' || overflowX == 'scroll');
}
},
refresh: function() {
module.debug('Refreshing constants (width/height)');
if(settings.type == 'fixed') {
module.resetFixed();
}
module.reset();
module.save.position();
if(settings.checkOnRefresh) {
module.checkVisibility();
}
settings.onRefresh.call(element);
},
resetFixed: function () {
module.remove.fixed();
module.remove.occurred();
},
reset: function() {
module.verbose('Resetting all cached values');
if( $.isPlainObject(module.cache) ) {
module.cache.screen = {};
module.cache.element = {};
}
},
checkVisibility: function(scroll) {
module.verbose('Checking visibility of element', module.cache.element);
if( !disabled && module.is.visible() ) {
// save scroll position
module.save.scroll(scroll);
// update calculations derived from scroll
module.save.calculations();
// percentage
module.passed();
// reverse (must be first)
module.passingReverse();
module.topVisibleReverse();
module.bottomVisibleReverse();
module.topPassedReverse();
module.bottomPassedReverse();
// one time
module.onScreen();
module.offScreen();
module.passing();
module.topVisible();
module.bottomVisible();
module.topPassed();
module.bottomPassed();
// on update callback
if(settings.onUpdate) {
settings.onUpdate.call(element, module.get.elementCalculations());
}
}
},
passed: function(amount, newCallback) {
var
calculations = module.get.elementCalculations(),
amountInPixels
;
// assign callback
if(amount && newCallback) {
settings.onPassed[amount] = newCallback;
}
else if(amount !== undefined) {
return (module.get.pixelsPassed(amount) > calculations.pixelsPassed);
}
else if(calculations.passing) {
$.each(settings.onPassed, function(amount, callback) {
if(calculations.bottomVisible || calculations.pixelsPassed > module.get.pixelsPassed(amount)) {
module.execute(callback, amount);
}
else if(!settings.once) {
module.remove.occurred(callback);
}
});
}
},
onScreen: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onOnScreen,
callbackName = 'onScreen'
;
if(newCallback) {
module.debug('Adding callback for onScreen', newCallback);
settings.onOnScreen = newCallback;
}
if(calculations.onScreen) {
module.execute(callback, callbackName);
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback !== undefined) {
return calculations.onOnScreen;
}
},
offScreen: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onOffScreen,
callbackName = 'offScreen'
;
if(newCallback) {
module.debug('Adding callback for offScreen', newCallback);
settings.onOffScreen = newCallback;
}
if(calculations.offScreen) {
module.execute(callback, callbackName);
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback !== undefined) {
return calculations.onOffScreen;
}
},
passing: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onPassing,
callbackName = 'passing'
;
if(newCallback) {
module.debug('Adding callback for passing', newCallback);
settings.onPassing = newCallback;
}
if(calculations.passing) {
module.execute(callback, callbackName);
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback !== undefined) {
return calculations.passing;
}
},
topVisible: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onTopVisible,
callbackName = 'topVisible'
;
if(newCallback) {
module.debug('Adding callback for top visible', newCallback);
settings.onTopVisible = newCallback;
}
if(calculations.topVisible) {
module.execute(callback, callbackName);
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback === undefined) {
return calculations.topVisible;
}
},
bottomVisible: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onBottomVisible,
callbackName = 'bottomVisible'
;
if(newCallback) {
module.debug('Adding callback for bottom visible', newCallback);
settings.onBottomVisible = newCallback;
}
if(calculations.bottomVisible) {
module.execute(callback, callbackName);
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback === undefined) {
return calculations.bottomVisible;
}
},
topPassed: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onTopPassed,
callbackName = 'topPassed'
;
if(newCallback) {
module.debug('Adding callback for top passed', newCallback);
settings.onTopPassed = newCallback;
}
if(calculations.topPassed) {
module.execute(callback, callbackName);
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback === undefined) {
return calculations.topPassed;
}
},
bottomPassed: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onBottomPassed,
callbackName = 'bottomPassed'
;
if(newCallback) {
module.debug('Adding callback for bottom passed', newCallback);
settings.onBottomPassed = newCallback;
}
if(calculations.bottomPassed) {
module.execute(callback, callbackName);
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback === undefined) {
return calculations.bottomPassed;
}
},
passingReverse: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onPassingReverse,
callbackName = 'passingReverse'
;
if(newCallback) {
module.debug('Adding callback for passing reverse', newCallback);
settings.onPassingReverse = newCallback;
}
if(!calculations.passing) {
if(module.get.occurred('passing')) {
module.execute(callback, callbackName);
}
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback !== undefined) {
return !calculations.passing;
}
},
topVisibleReverse: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onTopVisibleReverse,
callbackName = 'topVisibleReverse'
;
if(newCallback) {
module.debug('Adding callback for top visible reverse', newCallback);
settings.onTopVisibleReverse = newCallback;
}
if(!calculations.topVisible) {
if(module.get.occurred('topVisible')) {
module.execute(callback, callbackName);
}
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback === undefined) {
return !calculations.topVisible;
}
},
bottomVisibleReverse: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onBottomVisibleReverse,
callbackName = 'bottomVisibleReverse'
;
if(newCallback) {
module.debug('Adding callback for bottom visible reverse', newCallback);
settings.onBottomVisibleReverse = newCallback;
}
if(!calculations.bottomVisible) {
if(module.get.occurred('bottomVisible')) {
module.execute(callback, callbackName);
}
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback === undefined) {
return !calculations.bottomVisible;
}
},
topPassedReverse: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onTopPassedReverse,
callbackName = 'topPassedReverse'
;
if(newCallback) {
module.debug('Adding callback for top passed reverse', newCallback);
settings.onTopPassedReverse = newCallback;
}
if(!calculations.topPassed) {
if(module.get.occurred('topPassed')) {
module.execute(callback, callbackName);
}
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback === undefined) {
return !calculations.onTopPassed;
}
},
bottomPassedReverse: function(newCallback) {
var
calculations = module.get.elementCalculations(),
callback = newCallback || settings.onBottomPassedReverse,
callbackName = 'bottomPassedReverse'
;
if(newCallback) {
module.debug('Adding callback for bottom passed reverse', newCallback);
settings.onBottomPassedReverse = newCallback;
}
if(!calculations.bottomPassed) {
if(module.get.occurred('bottomPassed')) {
module.execute(callback, callbackName);
}
}
else if(!settings.once) {
module.remove.occurred(callbackName);
}
if(newCallback === undefined) {
return !calculations.bottomPassed;
}
},
execute: function(callback, callbackName) {
var
calculations = module.get.elementCalculations(),
screen = module.get.screenCalculations()
;
callback = callback || false;
if(callback) {
if(settings.continuous) {
module.debug('Callback being called continuously', callbackName, calculations);
callback.call(element, calculations, screen);
}
else if(!module.get.occurred(callbackName)) {
module.debug('Conditions met', callbackName, calculations);
callback.call(element, calculations, screen);
}
}
module.save.occurred(callbackName);
},
remove: {
fixed: function() {
module.debug('Removing fixed position');
$module
.removeClass(className.fixed)
.css({
position : '',
top : '',
left : '',
zIndex : ''
})
;
settings.onUnfixed.call(element);
},
placeholder: function() {
module.debug('Removing placeholder content');
if($placeholder) {
$placeholder.remove();
}
},
occurred: function(callback) {
if(callback) {
var
occurred = module.cache.occurred
;
if(occurred[callback] !== undefined && occurred[callback] === true) {
module.debug('Callback can now be called again', callback);
module.cache.occurred[callback] = false;
}
}
else {
module.cache.occurred = {};
}
}
},
save: {
calculations: function() {
module.verbose('Saving all calculations necessary to determine positioning');
module.save.direction();
module.save.screenCalculations();
module.save.elementCalculations();
},
occurred: function(callback) {
if(callback) {
if(module.cache.occurred[callback] === undefined || (module.cache.occurred[callback] !== true)) {
module.verbose('Saving callback occurred', callback);
module.cache.occurred[callback] = true;
}
}
},
scroll: function(scrollPosition) {
scrollPosition = scrollPosition + settings.offset || $context.scrollTop() + settings.offset;
module.cache.scroll = scrollPosition;
},
direction: function() {
var
scroll = module.get.scroll(),
lastScroll = module.get.lastScroll(),
direction
;
if(scroll > lastScroll && lastScroll) {
direction = 'down';
}
else if(scroll < lastScroll && lastScroll) {
direction = 'up';
}
else {
direction = 'static';
}
module.cache.direction = direction;
return module.cache.direction;
},
elementPosition: function() {
var
element = module.cache.element,
screen = module.get.screenSize()
;
module.verbose('Saving element position');
// (quicker than $.extend)
element.fits = (element.height < screen.height);
element.offset = $module.offset();
element.width = $module.outerWidth();
element.height = $module.outerHeight();
// compensate for scroll in context
if(module.is.verticallyScrollableContext()) {
element.offset.top += $context.scrollTop() - $context.offset().top;
}
if(module.is.horizontallyScrollableContext()) {
element.offset.left += $context.scrollLeft - $context.offset().left;
}
// store
module.cache.element = element;
return element;
},
elementCalculations: function() {
var
screen = module.get.screenCalculations(),
element = module.get.elementPosition()
;
// offset
if(settings.includeMargin) {
element.margin = {};
element.margin.top = parseInt($module.css('margin-top'), 10);
element.margin.bottom = parseInt($module.css('margin-bottom'), 10);
element.top = element.offset.top - element.margin.top;
element.bottom = element.offset.top + element.height + element.margin.bottom;
}
else {
element.top = element.offset.top;
element.bottom = element.offset.top + element.height;
}
// visibility
element.topPassed = (screen.top >= element.top);
element.bottomPassed = (screen.top >= element.bottom);
element.topVisible = (screen.bottom >= element.top) && !element.topPassed;
element.bottomVisible = (screen.bottom >= element.bottom) && !element.bottomPassed;
element.pixelsPassed = 0;
element.percentagePassed = 0;
// meta calculations
element.onScreen = ((element.topVisible || element.passing) && !element.bottomPassed);
element.passing = (element.topPassed && !element.bottomPassed);
element.offScreen = (!element.onScreen);
// passing calculations
if(element.passing) {
element.pixelsPassed = (screen.top - element.top);
element.percentagePassed = (screen.top - element.top) / element.height;
}
module.cache.element = element;
module.verbose('Updated element calculations', element);
return element;
},
screenCalculations: function() {
var
scroll = module.get.scroll()
;
module.save.direction();
module.cache.screen.top = scroll;
module.cache.screen.bottom = scroll + module.cache.screen.height;
return module.cache.screen;
},
screenSize: function() {
module.verbose('Saving window position');
module.cache.screen = {
height: $context.height()
};
},
position: function() {
module.save.screenSize();
module.save.elementPosition();
}
},
get: {
pixelsPassed: function(amount) {
var
element = module.get.elementCalculations()
;
if(amount.search('%') > -1) {
return ( element.height * (parseInt(amount, 10) / 100) );
}
return parseInt(amount, 10);
},
occurred: function(callback) {
return (module.cache.occurred !== undefined)
? module.cache.occurred[callback] || false
: false
;
},
direction: function() {
if(module.cache.direction === undefined) {
module.save.direction();
}
return module.cache.direction;
},
elementPosition: function() {
if(module.cache.element === undefined) {
module.save.elementPosition();
}
return module.cache.element;
},
elementCalculations: function() {
if(module.cache.element === undefined) {
module.save.elementCalculations();
}
return module.cache.element;
},
screenCalculations: function() {
if(module.cache.screen === undefined) {
module.save.screenCalculations();
}
return module.cache.screen;
},
screenSize: function() {
if(module.cache.screen === undefined) {
module.save.screenSize();
}
return module.cache.screen;
},
scroll: function() {
if(module.cache.scroll === undefined) {
module.save.scroll();
}
return module.cache.scroll;
},
lastScroll: function() {
if(module.cache.screen === undefined) {
module.debug('First scroll event, no last scroll could be found');
return false;
}
return module.cache.screen.top;
}
},
setting: function(name, value) {
if( $.isPlainObject(name) ) {
$.extend(true, settings, name);
}
else if(value !== undefined) {
settings[name] = value;
}
else {
return settings[name];
}
},
internal: function(name, value) {
if( $.isPlainObject(name) ) {
$.extend(true, module, name);
}
else if(value !== undefined) {
module[name] = value;
}
else {
return module[name];
}
},
debug: function() {
if(!settings.silent && settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
module.debug.apply(console, arguments);
}
}
},
verbose: function() {
if(!settings.silent && settings.verbose && settings.debug) {
if(settings.performance) {
module.performance.log(arguments);
}
else {
module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
module.verbose.apply(console, arguments);
}
}
},
error: function() {
if(!settings.silent) {
module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
module.error.apply(console, arguments);
}
},
performance: {
log: function(message) {
var
currentTime,
executionTime,
previousTime
;
if(settings.performance) {
currentTime = new Date().getTime();
previousTime = time || currentTime;
executionTime = currentTime - previousTime;
time = currentTime;
performance.push({
'Name' : message[0],
'Arguments' : [].slice.call(message, 1) || '',
'Element' : element,
'Execution Time' : executionTime
});
}
clearTimeout(module.performance.timer);
module.performance.timer = setTimeout(module.performance.display, 500);
},
display: function() {
var
title = settings.name + ':',
totalTime = 0
;
time = false;
clearTimeout(module.performance.timer);
$.each(performance, function(index, data) {
totalTime += data['Execution Time'];
});
title += ' ' + totalTime + 'ms';
if(moduleSelector) {
title += ' \'' + moduleSelector + '\'';
}
if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
console.groupCollapsed(title);
if(console.table) {
console.table(performance);
}
else {
$.each(performance, function(index, data) {
console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
});
}
console.groupEnd();
}
performance = [];
}
},
invoke: function(query, passedArguments, context) {
var
object = instance,
maxDepth,
found,
response
;
passedArguments = passedArguments || queryArguments;
context = element || context;
if(typeof query == 'string' && object !== undefined) {
query = query.split(/[\. ]/);
maxDepth = query.length - 1;
$.each(query, function(depth, value) {
var camelCaseValue = (depth != maxDepth)
? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
: query
;
if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
object = object[camelCaseValue];
}
else if( object[camelCaseValue] !== undefined ) {
found = object[camelCaseValue];
return false;
}
else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
object = object[value];
}
else if( object[value] !== undefined ) {
found = object[value];
return false;
}
else {
module.error(error.method, query);
return false;
}
});
}
if ( $.isFunction( found ) ) {
response = found.apply(context, passedArguments);
}
else if(found !== undefined) {
response = found;
}
if($.isArray(returnedValue)) {
returnedValue.push(response);
}
else if(returnedValue !== undefined) {
returnedValue = [returnedValue, response];
}
else if(response !== undefined) {
returnedValue = response;
}
return found;
}
};
if(methodInvoked) {
if(instance === undefined) {
module.initialize();
}
instance.save.scroll();
instance.save.calculations();
module.invoke(query);
}
else {
if(instance !== undefined) {
instance.invoke('destroy');
}
module.initialize();
}
})
;
return (returnedValue !== undefined)
? returnedValue
: this
;
};
$.fn.visibility.settings = {
name : 'Visibility',
namespace : 'visibility',
debug : false,
verbose : false,
performance : true,
// whether to use mutation observers to follow changes
observeChanges : true,
// check position immediately on init
initialCheck : true,
// whether to refresh calculations after all page images load
refreshOnLoad : true,
// whether to refresh calculations after page resize event
refreshOnResize : true,
// should call callbacks on refresh event (resize, etc)
checkOnRefresh : true,
// callback should only occur one time
once : true,
// callback should fire continuously whe evaluates to true
continuous : false,
// offset to use with scroll top
offset : 0,
// whether to include margin in elements position
includeMargin : false,
// scroll context for visibility checks
context : window,
// visibility check delay in ms (defaults to animationFrame)
throttle : false,
// special visibility type (image, fixed)
type : false,
// z-index to use with visibility 'fixed'
zIndex : '10',
// image only animation settings
transition : 'fade in',
duration : 1000,
// array of callbacks for percentage
onPassed : {},
// standard callbacks
onOnScreen : false,
onOffScreen : false,
onPassing : false,
onTopVisible : false,
onBottomVisible : false,
onTopPassed : false,
onBottomPassed : false,
// reverse callbacks
onPassingReverse : false,
onTopVisibleReverse : false,
onBottomVisibleReverse : false,
onTopPassedReverse : false,
onBottomPassedReverse : false,
// special callbacks for image
onLoad : function() {},
onAllLoaded : function() {},
// special callbacks for fixed position
onFixed : function() {},
onUnfixed : function() {},
// utility callbacks
onUpdate : false, // disabled by default for performance
onRefresh : function(){},
metadata : {
src: 'src'
},
className: {
fixed : 'fixed',
placeholder : 'placeholder',
visible : 'visible'
},
error : {
method : 'The method you called is not defined.',
visible : 'Element is hidden, you must call refresh after element becomes visible'
}
};
})( jQuery, window, document );
================================================
FILE: semantic/src/definitions/collections/breadcrumb.less
================================================
/*!
* # Semantic UI - Breadcrumb
* http://github.com/semantic-org/semantic-ui/
*
*
* Released under the MIT license
* http://opensource.org/licenses/MIT
*
*/
/*******************************
Theme
*******************************/
@type : 'collection';
@element : 'breadcrumb';
@import (multiple) '../../theme.config';
/*******************************
Breadcrumb
*******************************/
.ui.breadcrumb {
line-height: 1;
display: @display;
margin: @verticalMargin 0em;
vertical-align: @verticalAlign;
}
.ui.breadcrumb:first-child {
margin-top: 0em;
}
.ui.breadcrumb:last-child {
margin-bottom: 0em;
}
/*******************************
Content
*******************************/
/* Divider */
.ui.breadcrumb .divider {
display: inline-block;
opacity: @dividerOpacity;
margin: 0em @dividerSpacing 0em;
font-size: @dividerSize;
color: @dividerColor;
vertical-align: @dividerVerticalAlign;
}
/* Link */
.ui.breadcrumb a {
color: @linkColor;
}
.ui.breadcrumb a:hover {
color: @linkHoverColor;
}
/* Icon Divider */
.ui.breadcrumb .icon.divider {
font-size: @iconDividerSize;
vertical-align: @iconDividerVerticalAlign;
}
/* Section */
.ui.breadcrumb a.section {
cursor: pointer;
}
.ui.breadcrumb .section {
display: inline-block;
margin: @sectionMargin;
padding: @sectionPadding;
}
/* Loose Coupling */
.ui.breadcrumb.segment {
display: inline-block;
padding: @segmentPadding;
}
/*******************************
States
*******************************/
.ui.breadcrumb .active.section {
font-weight: @activeFontWeight;
}
/*******************************
Variations
*******************************/
.ui.mini.breadcrumb {
font-size: @mini;
}
.ui.tiny.breadcrumb {
font-size: @tiny;
}
.ui.small.breadcrumb {
font-size: @small;
}
.ui.breadcrumb {
font-size: @medium;
}
.ui.large.breadcrumb {
font-size: @large;
}
.ui.big.breadcrumb {
font-size: @big;
}
.ui.huge.breadcrumb {
font-size: @huge;
}
.ui.massive.breadcrumb {
font-size: @massive;
}
.loadUIOverrides();
================================================
FILE: semantic/src/definitions/collections/form.less
================================================
/*!
* # Semantic UI - Form
* http://github.com/semantic-org/semantic-ui/
*
*
* Released under the MIT license
* http://opensource.org/licenses/MIT
*
*/
/*******************************
Theme
*******************************/
@type : 'collection';
@element : 'form';
@import (multiple) '../../theme.config';
/*******************************
Elements
*******************************/
/*--------------------
Form
---------------------*/
.ui.form {
position: relative;
max-width: 100%;
}
/*--------------------
Content
---------------------*/
.ui.form > p {
margin: @paragraphMargin;
}
/*--------------------
Field
---------------------*/
.ui.form .field {
clear: both;
margin: @fieldMargin;
}
.ui.form .field:last-child,
.ui.form .fields:last-child .field {
margin-bottom: 0em;
}
.ui.form .fields .field {
clear: both;
margin: 0em;
}
/*--------------------
Labels
---------------------*/
.ui.form .field > label {
display: block;
margin: @labelMargin;
color: @labelColor;
font-size: @labelFontSize;
font-weight: @labelFontWeight;
text-transform: @labelTextTransform;
}
/*--------------------
Standard Inputs
---------------------*/
.ui.form textarea,
.ui.form input:not([type]),
.ui.form input[type="date"],
.ui.form input[type="datetime-local"],
.ui.form input[type="email"],
.ui.form input[type="number"],
.ui.form input[type="password"],
.ui.form input[type="search"],
.ui.form input[type="tel"],
.ui.form input[type="time"],
.ui.form input[type="text"],
.ui.form input[type="file"],
.ui.form input[type="url"] {
width: @inputWidth;
vertical-align: top;
}
/* Set max height on unusual input */
.ui.form ::-webkit-datetime-edit,
.ui.form ::-webkit-inner-spin-button {
height: @inputLineHeight;
}
.ui.form input:not([type]),
.ui.form input[type="date"],
.ui.form input[type="datetime-local"],
.ui.form input[type="email"],
.ui.form input[type="number"],
.ui.form input[type="password"],
.ui.form input[type="search"],
.ui.form input[type="tel"],
.ui.form input[type="time"],
.ui.form input[type="text"],
.ui.form input[type="file"],
.ui.form input[type="url"] {
font-family: @inputFont;
margin: 0em;
outline: none;
-webkit-appearance: none;
tap-highlight-color: rgba(255, 255, 255, 0);
line-height: @inputLineHeight;
padding: @inputPadding;
font-size: @inputFontSize;
background: @inputBackground;
border: @inputBorder;
color: @inputColor;
border-radius: @inputBorderRadius;
box-shadow: @inputBoxShadow;
transition: @inputTransition;
}
/* Text Area */
.ui.form textarea {
margin: 0em;
-webkit-appearance: none;
tap-highlight-color: rgba(255, 255, 255, 0);
padding: @textAreaPadding;
font-size: @textAreaFontSize;
background: @textAreaBackground;
border: @textAreaBorder;
outline: none;
color: @inputColor;
border-radius: @inputBorderRadius;
box-shadow: @inputBoxShadow;
transition: @textAreaTransition;
font-size: @textAreaFontSize;
line-height: @textAreaLineHeight;
resize: @textAreaResize;
}
.ui.form textarea:not([rows]) {
height: @textAreaHeight;
min-height: @textAreaMinHeight;
max-height: @textAreaMaxHeight;
}
.ui.form textarea,
.ui.form input[type="checkbox"] {
vertical-align: @checkboxVerticalAlign;
}
/*--------------------------
Input w/ attached Button
---------------------------*/
.ui.form input.attached {
width: auto;
}
/*--------------------
Basic Select
---------------------*/
.ui.form select {
display: block;
height: auto;
width: 100%;
background: @selectBackground;
border: @selectBorder;
border-radius: @selectBorderRadius;
box-shadow: @selectBoxShadow;
padding: @selectPadding;
color: @selectColor;
transition: @selectTransition;
}
/*--------------------
Dropdown
---------------------*/
/* Block */
.ui.form .field > .selection.dropdown {
width: 100%;
}
.ui.form .field > .selection.dropdown > .dropdown.icon {
float: right;
}
/* Inline */
.ui.form .inline.fields .field > .selection.dropdown,
.ui.form .inline.field > .selection.dropdown {
width: auto;
}
.ui.form .inline.fields .field > .selection.dropdown > .dropdown.icon,
.ui.form .inline.field > .selection.dropdown > .dropdown.icon {
float: none;
}
/*--------------------
UI Input
---------------------*/
/* Block */
.ui.form .field .ui.input,
.ui.form .fields .field .ui.input,
.ui.form .wide.field .ui.input {
width: 100%;
}
/* Inline */
.ui.form .inline.fields .field:not(.wide) .ui.input,
.ui.form .inline.field:not(.wide) .ui.input {
width: auto;
vertical-align: middle;
}
/* Auto Input */
.ui.form .fields .field .ui.input input,
.ui.form .field .ui.input input {
width: auto;
}
/* Full Width Input */
.ui.form .ten.fields .ui.input input,
.ui.form .nine.fields .ui.input input,
.ui.form .eight.fields .ui.input input,
.ui.form .seven.fields .ui.input input,
.ui.form .six.fields .ui.input input,
.ui.form .five.fields .ui.input input,
.ui.form .four.fields .ui.input input,
.ui.form .three.fields .ui.input input,
.ui.form .two.fields .ui.input input,
.ui.form .wide.field .ui.input input {
flex: 1 0 auto;
width: 0px;
}
/*--------------------
Types of Messages
---------------------*/
.ui.form .success.message,
.ui.form .warning.message,
.ui.form .error.message {
display: none;
}
/* Assumptions */
.ui.form .message:first-child {
margin-top: 0px;
}
/*--------------------
Validation Prompt
---------------------*/
.ui.form .field .prompt.label {
white-space: normal;
background: @promptBackground !important;
border: @promptBorder !important;
color: @promptTextColor !important;
}
.ui.form .inline.fields .field .prompt,
.ui.form .inline.field .prompt {
vertical-align: top;
margin: @inlinePromptMargin;
}
.ui.form .inline.fields .field .prompt:before,
.ui.form .inline.field .prompt:before {
border-width: 0px 0px @inlinePromptBorderWidth @inlinePromptBorderWidth;
bottom: auto;
right: auto;
top: 50%;
left: 0em;
}
/*******************************
States
*******************************/
/*--------------------
Autofilled
---------------------*/
.ui.form .field.field input:-webkit-autofill {
box-shadow: 0px 0px 0px 100px @inputAutoFillBackground inset !important;
border-color: @inputAutoFillBorder !important;
}
/* Focus */
.ui.form .field.field input:-webkit-autofill:focus {
box-shadow: 0px 0px 0px 100px @inputAutoFillFocusBackground inset !important;
border-color: @inputAutoFillFocusBorder !important;
}
/* Error */
.ui.form .error.error input:-webkit-autofill {
box-shadow: 0px 0px 0px 100px @inputAutoFillErrorBackground inset !important;
border-color: @inputAutoFillErrorBorder !important;
}
/*--------------------
Placeholder
---------------------*/
/* browsers require these rules separate */
.ui.form ::-webkit-input-placeholder {
color: @inputPlaceholderColor;
}
.ui.form :-ms-input-placeholder {
color: @inputPlaceholderColor;
}
.ui.form ::-moz-placeholder {
color: @inputPlaceholderColor;
}
.ui.form :focus::-webkit-input-placeholder {
color: @inputPlaceholderFocusColor;
}
.ui.form :focus:-ms-input-placeholder {
color: @inputPlaceholderFocusColor;
}
.ui.form :focus::-moz-placeholder {
color: @inputPlaceholderFocusColor;
}
/* Error Placeholder */
.ui.form .error ::-webkit-input-placeholder {
color: @inputErrorPlaceholderColor;
}
.ui.form .error :-ms-input-placeholder {
color: @inputErrorPlaceholderColor !important;
}
.ui.form .error ::-moz-placeholder {
color: @inputErrorPlaceholderColor;
}
.ui.form .error :focus::-webkit-input-placeholder {
color: @inputErrorPlaceholderFocusColor;
}
.ui.form .error :focus:-ms-input-placeholder {
color: @inputErrorPlaceholderFocusColor !important;
}
.ui.form .error :focus::-moz-placeholder {
color: @inputErrorPlaceholderFocusColor;
}
/*--------------------
Focus
---------------------*/
.ui.form input:not([type]):focus,
.ui.form input[type="date"]:focus,
.ui.form input[type="datetime-local"]:focus,
.ui.form input[type="email"]:focus,
.ui.form input[type="number"]:focus,
.ui.form input[type="password"]:focus,
.ui.form input[type="search"]:focus,
.ui.form input[type="tel"]:focus,
.ui.form input[type="time"]:focus,
.ui.form input[type="text"]:focus,
.ui.form input[type="file"]:focus,
.ui.form input[type="url"]:focus {
color: @inputFocusColor;
border-color: @inputFocusBorderColor;
border-radius: @inputFocusBorderRadius;
background: @inputFocusBackground;
box-shadow: @inputFocusBoxShadow;
}
.ui.form textarea:focus {
color: @textAreaFocusColor;
border-color: @textAreaFocusBorderColor;
border-radius: @textAreaFocusBorderRadius;
background: @textAreaFocusBackground;
box-shadow: @textAreaFocusBoxShadow;
-webkit-appearance: none;
}
/*--------------------
Success
---------------------*/
/* On Form */
.ui.form.success .success.message:not(:empty) {
display: block;
}
.ui.form.success .compact.success.message:not(:empty) {
display: inline-block;
}
.ui.form.success .icon.success.message:not(:empty) {
display: flex;
}
/*--------------------
Warning
---------------------*/
/* On Form */
.ui.form.warning .warning.message:not(:empty) {
display: block;
}
.ui.form.warning .compact.warning.message:not(:empty) {
display: inline-block;
}
.ui.form.warning .icon.warning.message:not(:empty) {
display: flex;
}
/*--------------------
Error
---------------------*/
/* On Form */
.ui.form.error .error.message:not(:empty) {
display: block;
}
.ui.form.error .compact.error.message:not(:empty) {
display: inline-block;
}
.ui.form.error .icon.error.message:not(:empty) {
display: flex;
}
/* On Field(s) */
.ui.form .fields.error .field label,
.ui.form .field.error label,
.ui.form .fields.error .field .input,
.ui.form .field.error .input {
color: @formErrorColor;
}
.ui.form .fields.error .field .corner.label,
.ui.form .field.error .corner.label {
border-color: @formErrorColor;
color: @white;
}
.ui.form .fields.error .field textarea,
.ui.form .fields.error .field select,
.ui.form .fields.error .field input:not([type]),
.ui.form .fields.error .field input[type="date"],
.ui.form .fields.error .field input[type="datetime-local"],
.ui.form .fields.error .field input[type="email"],
.ui.form .fields.error .field input[type="number"],
.ui.form .fields.error .field input[type="password"],
.ui.form .fields.error .field input[type="search"],
.ui.form .fields.error .field input[type="tel"],
.ui.form .fields.error .field input[type="time"],
.ui.form .fields.error .field input[type="text"],
.ui.form .fields.error .field input[type="file"],
.ui.form .fields.error .field input[type="url"],
.ui.form .field.error textarea,
.ui.form .field.error select,
.ui.form .field.error input:not([type]),
.ui.form .field.error input[type="date"],
.ui.form .field.error input[type="datetime-local"],
.ui.form .field.error input[type="email"],
.ui.form .field.error input[type="number"],
.ui.form .field.error input[type="password"],
.ui.form .field.error input[type="search"],
.ui.form .field.error input[type="tel"],
.ui.form .field.error input[type="time"],
.ui.form .field.error input[type="text"],
.ui.form .field.error input[type="file"],
.ui.form .field.error input[type="url"] {
background: @formErrorBackground;
border-color: @formErrorBorder;
color: @formErrorColor;
border-radius: @inputErrorBorderRadius;
box-shadow: @inputErrorBoxShadow;
}
.ui.form .field.error textarea:focus,
.ui.form .field.error select:focus,
.ui.form .field.error input:not([type]):focus,
.ui.form .field.error input[type="date"]:focus,
.ui.form .field.error input[type="datetime-local"]:focus,
.ui.form .field.error input[type="email"]:focus,
.ui.form .field.error input[type="number"]:focus,
.ui.form .field.error input[type="password"]:focus,
.ui.form .field.error input[type="search"]:focus,
.ui.form .field.error input[type="tel"]:focus,
.ui.form .field.error input[type="time"]:focus,
.ui.form .field.error input[type="text"]:focus,
.ui.form .field.error input[type="file"]:focus,
.ui.form .field.error input[type="url"]:focus {
background: @inputErrorFocusBackground;
border-color: @inputErrorFocusBorder;
color: @inputErrorFocusColor;
-webkit-appearance: none;
box-shadow: @inputErrorFocusBoxShadow;
}
/* Preserve Native Select Stylings */
.ui.form .field.error select {
-webkit-appearance: menulist-button;
}
/*------------------
Dropdown Error
--------------------*/
.ui.form .fields.error .field .ui.dropdown,
.ui.form .fields.error .field .ui.dropdown .item,
.ui.form .field.error .ui.dropdown,
.ui.form .field.error .ui.dropdown .text,
.ui.form .field.error .ui.dropdown .item {
background: @formErrorBackground;
color: @formErrorColor;
}
.ui.form .fields.error .field .ui.dropdown,
.ui.form .field.error .ui.dropdown {
border-color: @formErrorBorder !important;
}
.ui.form .fields.error .field .ui.dropdown:hover,
.ui.form .field.error .ui.dropdown:hover {
border-color: @formErrorBorder !important;
}
.ui.form .fields.error .field .ui.dropdown:hover .menu,
.ui.form .field.error .ui.dropdown:hover .menu {
border-color: @formErrorBorder;
}
.ui.form .fields.error .field .ui.multiple.selection.dropdown > .label,
.ui.form .field.error .ui.multiple.selection.dropdown > .label {
background-color: @dropdownErrorLabelBackground;
color: @dropdownErrorLabelColor;
}
/* Hover */
.ui.form .fields.error .field .ui.dropdown .menu .item:hover,
.ui.form .field.error .ui.dropdown .menu .item:hover {
background-color: @dropdownErrorHoverBackground;
}
/* Selected */
.ui.form .fields.error .field .ui.dropdown .menu .selected.item,
.ui.form .field.error .ui.dropdown .menu .selected.item {
background-color: @dropdownErrorSelectedBackground;
}
/* Active */
.ui.form .fields.error .field .ui.dropdown .menu .active.item,
.ui.form .field.error .ui.dropdown .menu .active.item {
background-color: @dropdownErrorActiveBackground !important;
}
/*--------------------
Checkbox Error
---------------------*/
.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label,
.ui.form .field.error .checkbox:not(.toggle):not(.slider) label,
.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box,
.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box {
color: @formErrorColor;
}
.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) label:before,
.ui.form .field.error .checkbox:not(.toggle):not(.slider) label:before,
.ui.form .fields.error .field .checkbox:not(.toggle):not(.slider) .box:before,
.ui.form .field.error .checkbox:not(.toggle):not(.slider) .box:before {
background: @formErrorBackground;
border-color: @formErrorBorder;
}
.ui.form .fields.error .field .checkbox label:after,
.ui.form .field.error .checkbox label:after,
.ui.form .fields.error .field .checkbox .box:after,
.ui.form .field.error .checkbox .box:after {
color: @formErrorColor;
}
/*--------------------
Disabled
---------------------*/
.ui.form .disabled.fields .field,
.ui.form .disabled.field,
.ui.form .field :disabled {
pointer-events: none;
opacity: @disabledOpacity;
}
.ui.form .field.disabled > label,
.ui.form .fields.disabled > label {
opacity: @disabledLabelOpacity;
}
.ui.form .field.disabled :disabled {
opacity: 1;
}
/*--------------
Loading
---------------*/
.ui.loading.form {
position: relative;
cursor: default;
pointer-events: none;
}
.ui.loading.form:before {
position: absolute;
content: '';
top: 0%;
left: 0%;
background: @loaderDimmerColor;
width: 100%;
height: 100%;
z-index: @loaderDimmerZIndex;
}
.ui.loading.form:after {
position: absolute;
content: '';
top: 50%;
left: 50%;
margin: @loaderMargin;
width: @loaderSize;
height: @loaderSize;
animation: form-spin @loaderSpeed linear;
animation-iteration-count: infinite;
border-radius: @circularRadius;
border-color: @loaderLineColor @loaderFillColor @loaderFillColor @loaderFillColor;
border-style: solid;
border-width: @loaderLineWidth;
box-shadow: 0px 0px 0px 1px transparent;
visibility: visible;
z-index: @loaderLineZIndex;
}
@keyframes form-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/*******************************
Element Types
*******************************/
/*--------------------
Required Field
---------------------*/
.ui.form .required.fields:not(.grouped) > .field > label:after,
.ui.form .required.fields.grouped > label:after,
.ui.form .required.field > label:after,
.ui.form .required.fields:not(.grouped) > .field > .checkbox:after,
.ui.form .required.field > .checkbox:after {
margin: @requiredMargin;
content: @requiredContent;
color: @requiredColor;
}
.ui.form .required.fields:not(.grouped) > .field > label:after,
.ui.form .required.fields.grouped > label:after,
.ui.form .required.field > label:after {
display: inline-block;
vertical-align: top;
}
.ui.form .required.fields:not(.grouped) > .field > .checkbox:after,
.ui.form .required.field > .checkbox:after {
position: absolute;
top: 0%;
left: 100%;
}
/*******************************
Variations
*******************************/
/*--------------------
Inverted Colors
---------------------*/
.ui.inverted.form label,
.ui.form .inverted.segment label,
.ui.form .inverted.segment .ui.checkbox label,
.ui.form .inverted.segment .ui.checkbox .box,
.ui.inverted.form .ui.checkbox label,
.ui.inverted.form .ui.checkbox .box,
.ui.inverted.form .inline.fields > label,
.ui.inverted.form .inline.fields .field > label,
.ui.inverted.form .inline.fields .field > p,
.ui.inverted.form .inline.field > label,
.ui.inverted.form .inline.field > p {
color: @invertedLabelColor;
}
/* Inverted Field */
.ui.inverted.form input:not([type]),
.ui.inverted.form input[type="date"],
.ui.inverted.form input[type="datetime-local"],
.ui.inverted.form input[type="email"],
.ui.inverted.form input[type="number"],
.ui.inverted.form input[type="password"],
.ui.inverted.form input[type="search"],
.ui.inverted.form input[type="tel"],
.ui.inverted.form input[type="time"],
.ui.inverted.form input[type="text"],
.ui.inverted.form input[type="file"],
.ui.inverted.form input[type="url"] {
background: @invertedInputBackground;
border-color: @invertedInputBorderColor;
color: @invertedInputColor;
box-shadow: @invertedInputBoxShadow;
}
/*--------------------
Field Groups
---------------------*/
/* Grouped Vertically */
.ui.form .grouped.fields {
display: block;
margin: @groupedMargin;
}
.ui.form .grouped.fields:last-child {
margin-bottom: 0em;
}
.ui.form .grouped.fields > label {
margin: @groupedLabelMargin;
color: @groupedLabelColor;
font-size: @groupedLabelFontSize;
font-weight: @groupedLabelFontWeight;
text-transform: @groupedLabelTextTransform;
}
.ui.form .grouped.fields .field,
.ui.form .grouped.inline.fields .field {
display: block;
margin: @groupedFieldMargin;
padding: 0em;
}
/*--------------------
Fields
---------------------*/
/* Split fields */
.ui.form .fields {
display: flex;
flex-direction: row;
margin: @fieldsMargin;
}
.ui.form .fields > .field {
flex: 0 1 auto;
padding-left: (@gutterWidth / 2);
padding-right: (@gutterWidth / 2);
}
.ui.form .fields > .field:first-child {
border-left: none;
box-shadow: none;
}
/* Other Combinations */
.ui.form .two.fields > .fields,
.ui.form .two.fields > .field {
width: @twoColumn;
}
.ui.form .three.fields > .fields,
.ui.form .three.fields > .field {
width: @threeColumn;
}
.ui.form .four.fields > .fields,
.ui.form .four.fields > .field {
width: @fourColumn;
}
.ui.form .five.fields > .fields,
.ui.form .five.fields > .field {
width: @fiveColumn;
}
.ui.form .six.fields > .fields,
.ui.form .six.fields > .field {
width: @sixColumn;
}
.ui.form .seven.fields > .fields,
.ui.form .seven.fields > .field {
width: @sevenColumn;
}
.ui.form .eight.fields > .fields,
.ui.form .eight.fields > .field {
width: @eightColumn;
}
.ui.form .nine.fields > .fields,
.ui.form .nine.fields > .field {
width: @nineColumn;
}
.ui.form .ten.fields > .fields,
.ui.form .ten.fields > .field {
width: @tenColumn;
}
/* Swap to full width on mobile */
@media only screen and (max-width : @largestMobileScreen) {
.ui.form .fields {
flex-wrap: wrap;
}
.ui[class*="equal width"].form:not(.unstackable) .fields > .field,
.ui.form:not(.unstackable) [class*="equal width"].fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .two.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .two.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .three.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .three.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .four.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .four.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .five.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .five.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .six.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .six.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .seven.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .seven.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .eight.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .eight.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .nine.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .nine.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .ten.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .ten.fields:not(.unstackable) > .field {
width: @oneColumn !important;
margin: 0em 0em @rowDistance;
}
}
/* Sizing Combinations */
.ui.form .fields .wide.field {
width: @oneWide;
padding-left: (@gutterWidth / 2);
padding-right: (@gutterWidth / 2);
}
.ui.form .one.wide.field {
width: @oneWide !important;
}
.ui.form .two.wide.field {
width: @twoWide !important;
}
.ui.form .three.wide.field {
width: @threeWide !important;
}
.ui.form .four.wide.field {
width: @fourWide !important;
}
.ui.form .five.wide.field {
width: @fiveWide !important;
}
.ui.form .six.wide.field {
width: @sixWide !important;
}
.ui.form .seven.wide.field {
width: @sevenWide !important;
}
.ui.form .eight.wide.field {
width: @eightWide !important;
}
.ui.form .nine.wide.field {
width: @nineWide !important;
}
.ui.form .ten.wide.field {
width: @tenWide !important;
}
.ui.form .eleven.wide.field {
width: @elevenWide !important;
}
.ui.form .twelve.wide.field {
width: @twelveWide !important;
}
.ui.form .thirteen.wide.field {
width: @thirteenWide !important;
}
.ui.form .fourteen.wide.field {
width: @fourteenWide !important;
}
.ui.form .fifteen.wide.field {
width: @fifteenWide !important;
}
.ui.form .sixteen.wide.field {
width: @sixteenWide !important;
}
/* Swap to full width on mobile */
@media only screen and (max-width : @largestMobileScreen) {
.ui.form:not(.unstackable) .two.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .two.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .three.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .three.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .four.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .four.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .five.fields:not(.unstackable) > .fields,
.ui.form:not(.unstackable) .five.fields:not(.unstackable) > .field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .two.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .three.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .four.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .five.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .six.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .seven.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .eight.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .nine.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .ten.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .eleven.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .twelve.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .thirteen.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .fourteen.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .fifteen.wide.field,
.ui.form:not(.unstackable) .fields:not(.unstackable) > .sixteen.wide.field {
width: @oneColumn !important;
}
.ui.form .fields {
margin-bottom: 0em;
}
}
/*--------------------
Equal Width
---------------------*/
.ui[class*="equal width"].form .fields > .field,
.ui.form [class*="equal width"].fields > .field {
width: 100%;
flex: 1 1 auto;
}
/*--------------------
Inline Fields
---------------------*/
.ui.form .inline.fields {
margin: @fieldMargin;
align-items: center;
}
.ui.form .inline.fields .field {
margin: 0em;
padding: @inlineFieldsMargin;
}
/* Inline Label */
.ui.form .inline.fields > label,
.ui.form .inline.fields .field > label,
.ui.form .inline.fields .field > p,
.ui.form .inline.field > label,
.ui.form .inline.field > p {
display: inline-block;
width: auto;
margin-top: 0em;
margin-bottom: 0em;
vertical-align: baseline;
font-size: @inlineLabelFontSize;
font-weight: @inlineLabelFontWeight;
color: @inlineLabelColor;
text-transform: @inlineLabelTextTransform;
}
/* Grouped Inline Label */
.ui.form .inline.fields > label {
margin: @groupedInlineLabelMargin;
}
/* Inline Input */
.ui.form .inline.fields .field > input,
.ui.form .inline.fields .field > select,
.ui.form .inline.field > input,
.ui.form .inline.field > select {
display: inline-block;
width: auto;
margin-top: 0em;
margin-bottom: 0em;
vertical-align: middle;
font-size: @inlineInputSize;
}
/* Label */
.ui.form .inline.fields .field > :first-child,
.ui.form .inline.field > :first-child {
margin: 0em @inlineLabelDistance 0em 0em;
}
.ui.form .inline.fields .field > :only-child,
.ui.form .inline.field > :only-child {
margin: 0em;
}
/* Wide */
.ui.form .inline.fields .wide.field {
display: flex;
align-items: center;
}
.ui.form .inline.fields .wide.field > input,
.ui.form .inline.fields .wide.field > select {
width: 100%;
}
/*--------------------
Sizes
---------------------*/
.ui.mini.form {
font-size: @mini;
}
.ui.tiny.form {
font-size: @tiny;
}
.ui.small.form {
font-size: @small;
}
.ui.form {
font-size: @medium;
}
.ui.large.form {
font-size: @large;
}
.ui.big.form {
font-size: @big;
}
.ui.huge.form {
font-size: @huge;
}
.ui.massive.form {
font-size: @massive;
}
.loadUIOverrides();
================================================
FILE: semantic/src/definitions/collections/grid.less
================================================
/*!
* # Semantic UI - Grid
* http://github.com/semantic-org/semantic-ui/
*
*
* Released under the MIT license
* http://opensource.org/licenses/MIT
*
*/
/*******************************
Theme
*******************************/
@type : 'collection';
@element : 'grid';
@import (multiple) '../../theme.config';
/*******************************
Standard
*******************************/
.ui.grid {
display: flex;
flex-direction: row;
flex-wrap: wrap;
align-items: stretch;
padding: 0em;
}
/*----------------------
Remove Gutters
-----------------------*/
.ui.grid {
margin-top: -(@rowSpacing / 2);
margin-bottom: -(@rowSpacing / 2);
margin-left: -(@gutterWidth / 2);
margin-right: -(@gutterWidth / 2);
}
.ui.relaxed.grid {
margin-left: -(@relaxedGutterWidth / 2);
margin-right: -(@relaxedGutterWidth / 2);
}
.ui[class*="very relaxed"].grid {
margin-left: -(@veryRelaxedGutterWidth / 2);
margin-right: -(@veryRelaxedGutterWidth / 2);
}
/* Preserve Rows Spacing on Consecutive Grids */
.ui.grid + .grid {
margin-top: @consecutiveGridDistance;
}
/*-------------------
Columns
--------------------*/
/* Standard 16 column */
.ui.grid > .column:not(.row),
.ui.grid > .row > .column {
position: relative;
display: inline-block;
width: @oneWide;
padding-left: (@gutterWidth / 2);
padding-right: (@gutterWidth / 2);
vertical-align: top;
}
.ui.grid > * {
padding-left: (@gutterWidth / 2);
padding-right: (@gutterWidth / 2);
}
/*-------------------
Rows
--------------------*/
.ui.grid > .row {
position: relative;
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: inherit;
align-items: stretch;
width: 100% !important;
padding: 0rem;
padding-top: (@rowSpacing / 2);
padding-bottom: (@rowSpacing / 2);
}
/*-------------------
Columns
--------------------*/
/* Vertical padding when no rows */
.ui.grid > .column:not(.row) {
padding-top: (@rowSpacing / 2);
padding-bottom: (@rowSpacing / 2);
}
.ui.grid > .row > .column {
margin-top: 0em;
margin-bottom: 0em;
}
/*-------------------
Content
--------------------*/
.ui.grid > .row > img,
.ui.grid > .row > .column > img {
max-width: @columnMaxImageWidth;
}
/*-------------------
Loose Coupling
--------------------*/
/* Collapse Margin on Consecutive Grid */
.ui.grid > .ui.grid:first-child {
margin-top: 0em;
}
.ui.grid > .ui.grid:last-child {
margin-bottom: 0em;
}
/* Segment inside Aligned Grid */
.ui.grid .aligned.row > .column > .segment:not(.compact):not(.attached),
.ui.aligned.grid .column > .segment:not(.compact):not(.attached) {
width: 100%;
}
/* Align Dividers with Gutter */
.ui.grid .row + .ui.divider {
flex-grow: 1;
margin: (@rowSpacing / 2) (@gutterWidth / 2);
}
.ui.grid .column + .ui.vertical.divider {
height: ~"calc(50% - "(@rowSpacing/2)~")";
}
/* Remove Border on Last Horizontal Segment */
.ui.grid > .row > .column:last-child > .horizontal.segment,
.ui.grid > .column:last-child > .horizontal.segment {
box-shadow: none;
}
/*******************************
Variations
*******************************/
/*-----------------------
Page Grid
-------------------------*/
@media only screen and (max-width: @largestMobileScreen) {
.ui.page.grid {
width: @mobileWidth;
padding-left: @mobileGutter;
padding-right: @mobileGutter;
margin-left: 0em;
margin-right: 0em;
}
}
@media only screen and (min-width: @tabletBreakpoint) and (max-width: @largestTabletScreen) {
.ui.page.grid {
width: @tabletWidth;
margin-left: @tabletMargin;
margin-right: @tabletMargin;
padding-left: @tabletGutter;
padding-right: @tabletGutter;
}
}
@media only screen and (min-width: @computerBreakpoint) and (max-width: @largestSmallMonitor) {
.ui.page.grid {
width: @computerWidth;
margin-left: @computerMargin;
margin-right: @computerMargin;
padding-left: @computerGutter;
padding-right: @computerGutter;
}
}
@media only screen and (min-width: @largeMonitorBreakpoint) and (max-width: @largestLargeMonitor) {
.ui.page.grid {
width: @largeMonitorWidth;
margin-left: @largeMonitorMargin;
margin-right: @largeMonitorMargin;
padding-left: @largeMonitorGutter;
padding-right: @largeMonitorGutter;
}
}
@media only screen and (min-width: @widescreenMonitorBreakpoint) {
.ui.page.grid {
width: @widescreenMonitorWidth;
margin-left: @widescreenMargin;
margin-right: @widescreenMargin;
padding-left: @widescreenMonitorGutter;
padding-right: @widescreenMonitorGutter;
}
}
/*-------------------
Column Count
--------------------*/
/* Assume full width with one column */
.ui.grid > .column:only-child,
.ui.grid > .row > .column:only-child {
width: @oneColumn;
}
/* Grid Based */
.ui[class*="one column"].grid > .row > .column,
.ui[class*="one column"].grid > .column:not(.row) {
width: @oneColumn;
}
.ui[class*="two column"].grid > .row > .column,
.ui[class*="two column"].grid > .column:not(.row) {
width: @twoColumn;
}
.ui[class*="three column"].grid > .row > .column,
.ui[class*="three column"].grid > .column:not(.row) {
width: @threeColumn;
}
.ui[class*="four column"].grid > .row > .column,
.ui[class*="four column"].grid > .column:not(.row) {
width: @fourColumn;
}
.ui[class*="five column"].grid > .row > .column,
.ui[class*="five column"].grid > .column:not(.row) {
width: @fiveColumn;
}
.ui[class*="six column"].grid > .row > .column,
.ui[class*="six column"].grid > .column:not(.row) {
width: @sixColumn;
}
.ui[class*="seven column"].grid > .row > .column,
.ui[class*="seven column"].grid > .column:not(.row) {
width: @sevenColumn;
}
.ui[class*="eight column"].grid > .row > .column,
.ui[class*="eight column"].grid > .column:not(.row) {
width: @eightColumn;
}
.ui[class*="nine column"].grid > .row > .column,
.ui[class*="nine column"].grid > .column:not(.row) {
width: @nineColumn;
}
.ui[class*="ten column"].grid > .row > .column,
.ui[class*="ten column"].grid > .column:not(.row) {
width: @tenColumn;
}
.ui[class*="eleven column"].grid > .row > .column,
.ui[class*="eleven column"].grid > .column:not(.row) {
width: @elevenColumn;
}
.ui[class*="twelve column"].grid > .row > .column,
.ui[class*="twelve column"].grid > .column:not(.row) {
width: @twelveColumn;
}
.ui[class*="thirteen column"].grid > .row > .column,
.ui[class*="thirteen column"].grid > .column:not(.row) {
width: @thirteenColumn;
}
.ui[class*="fourteen column"].grid > .row > .column,
.ui[class*="fourteen column"].grid > .column:not(.row) {
width: @fourteenColumn;
}
.ui[class*="fifteen column"].grid > .row > .column,
.ui[class*="fifteen column"].grid > .column:not(.row) {
width: @fifteenColumn;
}
.ui[class*="sixteen column"].grid > .row > .column,
.ui[class*="sixteen column"].grid > .column:not(.row) {
width: @sixteenColumn;
}
/* Row Based Overrides */
.ui.grid > [class*="one column"].row > .column {
width: @oneColumn !important;
}
.ui.grid > [class*="two column"].row > .column {
width: @twoColumn !important;
}
.ui.grid > [class*="three column"].row > .column {
width: @threeColumn !important;
}
.ui.grid > [class*="four column"].row > .column {
width: @fourColumn !important;
}
.ui.grid > [class*="five column"].row > .column {
width: @fiveColumn !important;
}
.ui.grid > [class*="six column"].row > .column {
width: @sixColumn !important;
}
.ui.grid > [class*="seven column"].row > .column {
width: @sevenColumn !important;
}
.ui.grid > [class*="eight column"].row > .column {
width: @eightColumn !important;
}
.ui.grid > [class*="nine column"].row > .column {
width: @nineColumn !important;
}
.ui.grid > [class*="ten column"].row > .column {
width: @tenColumn !important;
}
.ui.grid > [class*="eleven column"].row > .column {
width: @elevenColumn !important;
}
.ui.grid > [class*="twelve column"].row > .column {
width: @twelveColumn !important;
}
.ui.grid > [class*="thirteen column"].row > .column {
width: @thirteenColumn !important;
}
.ui.grid > [class*="fourteen column"].row > .column {
width: @fourteenColumn !important;
}
.ui.grid > [class*="fifteen column"].row > .column {
width: @fifteenColumn !important;
}
.ui.grid > [class*="sixteen column"].row > .column {
width: @sixteenColumn !important;
}
/* Celled Page */
.ui.celled.page.grid {
box-shadow: none;
}
/*-------------------
Column Width
--------------------*/
/* Sizing Combinations */
.ui.grid > .row > [class*="one wide"].column,
.ui.grid > .column.row > [class*="one wide"].column,
.ui.grid > [class*="one wide"].column,
.ui.column.grid > [class*="one wide"].column {
width: @oneWide !important;
}
.ui.grid > .row > [class*="two wide"].column,
.ui.grid > .column.row > [class*="two wide"].column,
.ui.grid > [class*="two wide"].column,
.ui.column.grid > [class*="two wide"].column {
width: @twoWide !important;
}
.ui.grid > .row > [class*="three wide"].column,
.ui.grid > .column.row > [class*="three wide"].column,
.ui.grid > [class*="three wide"].column,
.ui.column.grid > [class*="three wide"].column {
width: @threeWide !important;
}
.ui.grid > .row > [class*="four wide"].column,
.ui.grid > .column.row > [class*="four wide"].column,
.ui.grid > [class*="four wide"].column,
.ui.column.grid > [class*="four wide"].column {
width: @fourWide !important;
}
.ui.grid > .row > [class*="five wide"].column,
.ui.grid > .column.row > [class*="five wide"].column,
.ui.grid > [class*="five wide"].column,
.ui.column.grid > [class*="five wide"].column {
width: @fiveWide !important;
}
.ui.grid > .row > [class*="six wide"].column,
.ui.grid > .column.row > [class*="six wide"].column,
.ui.grid > [class*="six wide"].column,
.ui.column.grid > [class*="six wide"].column {
width: @sixWide !important;
}
.ui.grid > .row > [class*="seven wide"].column,
.ui.grid > .column.row > [class*="seven wide"].column,
.ui.grid > [class*="seven wide"].column,
.ui.column.grid > [class*="seven wide"].column {
width: @sevenWide !important;
}
.ui.grid > .row > [class*="eight wide"].column,
.ui.grid > .column.row > [class*="eight wide"].column,
.ui.grid > [class*="eight wide"].column,
.ui.column.grid > [class*="eight wide"].column {
width: @eightWide !important;
}
.ui.grid > .row > [class*="nine wide"].column,
.ui.grid > .column.row > [class*="nine wide"].column,
.ui.grid > [class*="nine wide"].column,
.ui.column.grid > [class*="nine wide"].column {
width: @nineWide !important;
}
.ui.grid > .row > [class*="ten wide"].column,
.ui.grid > .column.row > [class*="ten wide"].column,
.ui.grid > [class*="ten wide"].column,
.ui.column.grid > [class*="ten wide"].column {
width: @tenWide !important;
}
.ui.grid > .row > [class*="eleven wide"].column,
.ui.grid > .column.row > [class*="eleven wide"].column,
.ui.grid > [class*="eleven wide"].column,
.ui.column.grid > [class*="eleven wide"].column {
width: @elevenWide !important;
}
.ui.grid > .row > [class*="twelve wide"].column,
.ui.grid > .column.row > [class*="twelve wide"].column,
.ui.grid > [class*="twelve wide"].column,
.ui.column.grid > [class*="twelve wide"].column {
width: @twelveWide !important;
}
.ui.grid > .row > [class*="thirteen wide"].column,
.ui.grid > .column.row > [class*="thirteen wide"].column,
.ui.grid > [class*="thirteen wide"].column,
.ui.column.grid > [class*="thirteen wide"].column {
width: @thirteenWide !important;
}
.ui.grid > .row > [class*="fourteen wide"].column,
.ui.grid > .column.row > [class*="fourteen wide"].column,
.ui.grid > [class*="fourteen wide"].column,
.ui.column.grid > [class*="fourteen wide"].column {
width: @fourteenWide !important;
}
.ui.grid > .row > [class*="fifteen wide"].column,
.ui.grid > .column.row > [class*="fifteen wide"].column,
.ui.grid > [class*="fifteen wide"].column,
.ui.column.grid > [class*="fifteen wide"].column {
width: @fifteenWide !important;
}
.ui.grid > .row > [class*="sixteen wide"].column,
.ui.grid > .column.row > [class*="sixteen wide"].column,
.ui.grid > [class*="sixteen wide"].column,
.ui.column.grid > [class*="sixteen wide"].column {
width: @sixteenWide !important;
}
/*----------------------
Width per Device
-----------------------*/
/* Mobile Sizing Combinations */
@media only screen and (min-width: @mobileBreakpoint) and (max-width: @largestMobileScreen) {
.ui.grid > .row > [class*="one wide mobile"].column,
.ui.grid > .column.row > [class*="one wide mobile"].column,
.ui.grid > [class*="one wide mobile"].column,
.ui.column.grid > [class*="one wide mobile"].column {
width: @oneWide !important;
}
.ui.grid > .row > [class*="two wide mobile"].column,
.ui.grid > .column.row > [class*="two wide mobile"].column,
.ui.grid > [class*="two wide mobile"].column,
.ui.column.grid > [class*="two wide mobile"].column {
width: @twoWide !important;
}
.ui.grid > .row > [class*="three wide mobile"].column,
.ui.grid > .column.row > [class*="three wide mobile"].column,
.ui.grid > [class*="three wide mobile"].column,
.ui.column.grid > [class*="three wide mobile"].column {
width: @threeWide !important;
}
.ui.grid > .row > [class*="four wide mobile"].column,
.ui.grid > .column.row > [class*="four wide mobile"].column,
.ui.grid > [class*="four wide mobile"].column,
.ui.column.grid > [class*="four wide mobile"].column {
width: @fourWide !important;
}
.ui.grid > .row > [class*="five wide mobile"].column,
.ui.grid > .column.row > [class*="five wide mobile"].column,
.ui.grid > [class*="five wide mobile"].column,
.ui.column.grid > [class*="five wide mobile"].column {
width: @fiveWide !important;
}
.ui.grid > .row > [class*="six wide mobile"].column,
.ui.grid > .column.row > [class*="six wide mobile"].column,
.ui.grid > [class*="six wide mobile"].column,
.ui.column.grid > [class*="six wide mobile"].column {
width: @sixWide !important;
}
.ui.grid > .row > [class*="seven wide mobile"].column,
.ui.grid > .column.row > [class*="seven wide mobile"].column,
.ui.grid > [class*="seven wide mobile"].column,
.ui.column.grid > [class*="seven wide mobile"].column {
width: @sevenWide !important;
}
.ui.grid > .row > [class*="eight wide mobile"].column,
.ui.grid > .column.row > [class*="eight wide mobile"].column,
.ui.grid > [class*="eight wide mobile"].column,
.ui.column.grid > [class*="eight wide mobile"].column {
width: @eightWide !important;
}
.ui.grid > .row > [class*="nine wide mobile"].column,
.ui.grid > .column.row > [class*="nine wide mobile"].column,
.ui.grid > [class*="nine wide mobile"].column,
.ui.column.grid > [class*="nine wide mobile"].column {
width: @nineWide !important;
}
.ui.grid > .row > [class*="ten wide mobile"].column,
.ui.grid > .column.row > [class*="ten wide mobile"].column,
.ui.grid > [class*="ten wide mobile"].column,
.ui.column.grid > [class*="ten wide mobile"].column {
width: @tenWide !important;
}
.ui.grid > .row > [class*="eleven wide mobile"].column,
.ui.grid > .column.row > [class*="eleven wide mobile"].column,
.ui.grid > [class*="eleven wide mobile"].column,
.ui.column.grid > [class*="eleven wide mobile"].column {
width: @elevenWide !important;
}
.ui.grid > .row > [class*="twelve wide mobile"].column,
.ui.grid > .column.row > [class*="twelve wide mobile"].column,
.ui.grid > [class*="twelve wide mobile"].column,
.ui.column.grid > [class*="twelve wide mobile"].column {
width: @twelveWide !important;
}
.ui.grid > .row > [class*="thirteen wide mobile"].column,
.ui.grid > .column.row > [class*="thirteen wide mobile"].column,
.ui.grid > [class*="thirteen wide mobile"].column,
.ui.column.grid > [class*="thirteen wide mobile"].column {
width: @thirteenWide !important;
}
.ui.grid > .row > [class*="fourteen wide mobile"].column,
.ui.grid > .column.row > [class*="fourteen wide mobile"].column,
.ui.grid > [class*="fourteen wide mobile"].column,
.ui.column.grid > [class*="fourteen wide mobile"].column {
width: @fourteenWide !important;
}
.ui.grid > .row > [class*="fifteen wide mobile"].column,
.ui.grid > .column.row > [class*="fifteen wide mobile"].column,
.ui.grid > [class*="fifteen wide mobile"].column,
.ui.column.grid > [class*="fifteen wide mobile"].column {
width: @fifteenWide !important;
}
.ui.grid > .row > [class*="sixteen wide mobile"].column,
.ui.grid > .column.row > [class*="sixteen wide mobile"].column,
.ui.grid > [class*="sixteen wide mobile"].column,
.ui.column.grid > [class*="sixteen wide mobile"].column {
width: @sixteenWide !important;
}
}
/* Tablet Sizing Combinations */
@media only screen and (min-width: @tabletBreakpoint) and (max-width: @largestTabletScreen) {
.ui.grid > .row > [class*="one wide tablet"].column,
.ui.grid > .column.row > [class*="one wide tablet"].column,
.ui.grid > [class*="one wide tablet"].column,
.ui.column.grid > [class*="one wide tablet"].column {
width: @oneWide !important;
}
.ui.grid > .row > [class*="two wide tablet"].column,
.ui.grid > .column.row > [class*="two wide tablet"].column,
.ui.grid > [class*="two wide tablet"].column,
.ui.column.grid > [class*="two wide tablet"].column {
width: @twoWide !important;
}
.ui.grid > .row > [class*="three wide tablet"].column,
.ui.grid > .column.row > [class*="three wide tablet"].column,
.ui.grid > [class*="three wide tablet"].column,
.ui.column.grid > [class*="three wide tablet"].column {
width: @threeWide !important;
}
.ui.grid > .row > [class*="four wide tablet"].column,
.ui.grid > .column.row > [class*="four wide tablet"].column,
.ui.grid > [class*="four wide tablet"].column,
.ui.column.grid > [class*="four wide tablet"].column
gitextract_apboy4kv/
├── .dockerignore
├── .gitignore
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── docker-compose.yml
├── nginx.conf
├── package.json
├── public/
│ ├── index.html
│ └── manifest.json
├── run.sh
├── semantic/
│ ├── gulpfile.js
│ ├── src/
│ │ ├── definitions/
│ │ │ ├── behaviors/
│ │ │ │ ├── api.js
│ │ │ │ ├── form.js
│ │ │ │ └── visibility.js
│ │ │ ├── collections/
│ │ │ │ ├── breadcrumb.less
│ │ │ │ ├── form.less
│ │ │ │ ├── grid.less
│ │ │ │ ├── menu.less
│ │ │ │ ├── message.less
│ │ │ │ └── table.less
│ │ │ ├── elements/
│ │ │ │ ├── button.less
│ │ │ │ ├── container.less
│ │ │ │ ├── divider.less
│ │ │ │ ├── flag.less
│ │ │ │ ├── header.less
│ │ │ │ ├── icon.less
│ │ │ │ ├── image.less
│ │ │ │ ├── input.less
│ │ │ │ ├── label.less
│ │ │ │ ├── list.less
│ │ │ │ ├── loader.less
│ │ │ │ ├── rail.less
│ │ │ │ ├── reveal.less
│ │ │ │ ├── segment.less
│ │ │ │ └── step.less
│ │ │ ├── globals/
│ │ │ │ ├── reset.less
│ │ │ │ ├── site.js
│ │ │ │ └── site.less
│ │ │ ├── modules/
│ │ │ │ ├── accordion.js
│ │ │ │ ├── accordion.less
│ │ │ │ ├── checkbox.js
│ │ │ │ ├── checkbox.less
│ │ │ │ ├── dimmer.js
│ │ │ │ ├── dimmer.less
│ │ │ │ ├── dropdown.js
│ │ │ │ ├── dropdown.less
│ │ │ │ ├── embed.js
│ │ │ │ ├── embed.less
│ │ │ │ ├── modal.js
│ │ │ │ ├── modal.less
│ │ │ │ ├── nag.js
│ │ │ │ ├── nag.less
│ │ │ │ ├── popup.js
│ │ │ │ ├── popup.less
│ │ │ │ ├── progress.js
│ │ │ │ ├── progress.less
│ │ │ │ ├── rating.js
│ │ │ │ ├── rating.less
│ │ │ │ ├── search.js
│ │ │ │ ├── search.less
│ │ │ │ ├── shape.js
│ │ │ │ ├── shape.less
│ │ │ │ ├── sidebar.js
│ │ │ │ ├── sidebar.less
│ │ │ │ ├── sticky.js
│ │ │ │ ├── sticky.less
│ │ │ │ ├── tab.js
│ │ │ │ ├── tab.less
│ │ │ │ ├── transition.js
│ │ │ │ └── transition.less
│ │ │ └── views/
│ │ │ ├── ad.less
│ │ │ ├── card.less
│ │ │ ├── comment.less
│ │ │ ├── feed.less
│ │ │ ├── item.less
│ │ │ └── statistic.less
│ │ ├── semantic.less
│ │ ├── site/
│ │ │ ├── collections/
│ │ │ │ ├── breadcrumb.overrides
│ │ │ │ ├── breadcrumb.variables
│ │ │ │ ├── form.overrides
│ │ │ │ ├── form.variables
│ │ │ │ ├── grid.overrides
│ │ │ │ ├── grid.variables
│ │ │ │ ├── menu.overrides
│ │ │ │ ├── menu.variables
│ │ │ │ ├── message.overrides
│ │ │ │ ├── message.variables
│ │ │ │ ├── table.overrides
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── container.overrides
│ │ │ │ ├── container.variables
│ │ │ │ ├── divider.overrides
│ │ │ │ ├── divider.variables
│ │ │ │ ├── flag.overrides
│ │ │ │ ├── flag.variables
│ │ │ │ ├── header.overrides
│ │ │ │ ├── header.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ ├── icon.variables
│ │ │ │ ├── image.overrides
│ │ │ │ ├── image.variables
│ │ │ │ ├── input.overrides
│ │ │ │ ├── input.variables
│ │ │ │ ├── label.overrides
│ │ │ │ ├── label.variables
│ │ │ │ ├── list.overrides
│ │ │ │ ├── list.variables
│ │ │ │ ├── loader.overrides
│ │ │ │ ├── loader.variables
│ │ │ │ ├── rail.overrides
│ │ │ │ ├── rail.variables
│ │ │ │ ├── reveal.overrides
│ │ │ │ ├── reveal.variables
│ │ │ │ ├── segment.overrides
│ │ │ │ ├── segment.variables
│ │ │ │ ├── step.overrides
│ │ │ │ └── step.variables
│ │ │ ├── globals/
│ │ │ │ ├── reset.overrides
│ │ │ │ ├── reset.variables
│ │ │ │ ├── site.overrides
│ │ │ │ └── site.variables
│ │ │ ├── modules/
│ │ │ │ ├── accordion.overrides
│ │ │ │ ├── accordion.variables
│ │ │ │ ├── chatroom.overrides
│ │ │ │ ├── chatroom.variables
│ │ │ │ ├── checkbox.overrides
│ │ │ │ ├── checkbox.variables
│ │ │ │ ├── dimmer.overrides
│ │ │ │ ├── dimmer.variables
│ │ │ │ ├── dropdown.overrides
│ │ │ │ ├── dropdown.variables
│ │ │ │ ├── embed.overrides
│ │ │ │ ├── embed.variables
│ │ │ │ ├── modal.overrides
│ │ │ │ ├── modal.variables
│ │ │ │ ├── nag.overrides
│ │ │ │ ├── nag.variables
│ │ │ │ ├── popup.overrides
│ │ │ │ ├── popup.variables
│ │ │ │ ├── progress.overrides
│ │ │ │ ├── progress.variables
│ │ │ │ ├── rating.overrides
│ │ │ │ ├── rating.variables
│ │ │ │ ├── search.overrides
│ │ │ │ ├── search.variables
│ │ │ │ ├── shape.overrides
│ │ │ │ ├── shape.variables
│ │ │ │ ├── sidebar.overrides
│ │ │ │ ├── sidebar.variables
│ │ │ │ ├── sticky.overrides
│ │ │ │ ├── sticky.variables
│ │ │ │ ├── tab.overrides
│ │ │ │ ├── tab.variables
│ │ │ │ ├── transition.overrides
│ │ │ │ └── transition.variables
│ │ │ └── views/
│ │ │ ├── ad.overrides
│ │ │ ├── ad.variables
│ │ │ ├── card.overrides
│ │ │ ├── card.variables
│ │ │ ├── comment.overrides
│ │ │ ├── comment.variables
│ │ │ ├── feed.overrides
│ │ │ ├── feed.variables
│ │ │ ├── item.overrides
│ │ │ ├── item.variables
│ │ │ ├── statistic.overrides
│ │ │ └── statistic.variables
│ │ ├── theme.config
│ │ ├── theme.less
│ │ └── themes/
│ │ ├── amazon/
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ └── button.variables
│ │ │ └── globals/
│ │ │ └── site.variables
│ │ ├── basic/
│ │ │ ├── collections/
│ │ │ │ ├── table.overrides
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ ├── icon.variables
│ │ │ │ ├── step.overrides
│ │ │ │ └── step.variables
│ │ │ ├── globals/
│ │ │ │ ├── reset.overrides
│ │ │ │ └── reset.variables
│ │ │ ├── modules/
│ │ │ │ ├── progress.overrides
│ │ │ │ └── progress.variables
│ │ │ └── views/
│ │ │ ├── card.overrides
│ │ │ └── card.variables
│ │ ├── bookish/
│ │ │ └── elements/
│ │ │ ├── header.overrides
│ │ │ └── header.variables
│ │ ├── bootstrap3/
│ │ │ └── elements/
│ │ │ ├── button.overrides
│ │ │ └── button.variables
│ │ ├── chubby/
│ │ │ ├── collections/
│ │ │ │ ├── form.overrides
│ │ │ │ ├── form.variables
│ │ │ │ ├── menu.overrides
│ │ │ │ └── menu.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── header.overrides
│ │ │ │ └── header.variables
│ │ │ ├── modules/
│ │ │ │ ├── accordion.overrides
│ │ │ │ └── accordion.variables
│ │ │ └── views/
│ │ │ ├── comment.overrides
│ │ │ └── comment.variables
│ │ ├── classic/
│ │ │ ├── collections/
│ │ │ │ ├── table.overrides
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── header.overrides
│ │ │ │ └── header.variables
│ │ │ ├── modules/
│ │ │ │ ├── progress.overrides
│ │ │ │ └── progress.variables
│ │ │ └── views/
│ │ │ ├── card.overrides
│ │ │ └── card.variables
│ │ ├── colored/
│ │ │ └── modules/
│ │ │ ├── checkbox.overrides
│ │ │ └── checkbox.variables
│ │ ├── default/
│ │ │ ├── collections/
│ │ │ │ ├── breadcrumb.overrides
│ │ │ │ ├── breadcrumb.variables
│ │ │ │ ├── form.overrides
│ │ │ │ ├── form.variables
│ │ │ │ ├── grid.overrides
│ │ │ │ ├── grid.variables
│ │ │ │ ├── menu.overrides
│ │ │ │ ├── menu.variables
│ │ │ │ ├── message.overrides
│ │ │ │ ├── message.variables
│ │ │ │ ├── table.overrides
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── container.overrides
│ │ │ │ ├── container.variables
│ │ │ │ ├── divider.overrides
│ │ │ │ ├── divider.variables
│ │ │ │ ├── flag.overrides
│ │ │ │ ├── flag.variables
│ │ │ │ ├── header.overrides
│ │ │ │ ├── header.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ ├── icon.variables
│ │ │ │ ├── image.overrides
│ │ │ │ ├── image.variables
│ │ │ │ ├── input.overrides
│ │ │ │ ├── input.variables
│ │ │ │ ├── label.overrides
│ │ │ │ ├── label.variables
│ │ │ │ ├── list.overrides
│ │ │ │ ├── list.variables
│ │ │ │ ├── loader.overrides
│ │ │ │ ├── loader.variables
│ │ │ │ ├── rail.overrides
│ │ │ │ ├── rail.variables
│ │ │ │ ├── reveal.overrides
│ │ │ │ ├── reveal.variables
│ │ │ │ ├── segment.overrides
│ │ │ │ ├── segment.variables
│ │ │ │ ├── step.overrides
│ │ │ │ └── step.variables
│ │ │ ├── globals/
│ │ │ │ ├── reset.overrides
│ │ │ │ ├── reset.variables
│ │ │ │ ├── site.overrides
│ │ │ │ └── site.variables
│ │ │ ├── modules/
│ │ │ │ ├── accordion.overrides
│ │ │ │ ├── accordion.variables
│ │ │ │ ├── chatroom.overrides
│ │ │ │ ├── chatroom.variables
│ │ │ │ ├── checkbox.overrides
│ │ │ │ ├── checkbox.variables
│ │ │ │ ├── dimmer.overrides
│ │ │ │ ├── dimmer.variables
│ │ │ │ ├── dropdown.overrides
│ │ │ │ ├── dropdown.variables
│ │ │ │ ├── embed.overrides
│ │ │ │ ├── embed.variables
│ │ │ │ ├── modal.overrides
│ │ │ │ ├── modal.variables
│ │ │ │ ├── nag.overrides
│ │ │ │ ├── nag.variables
│ │ │ │ ├── popup.overrides
│ │ │ │ ├── popup.variables
│ │ │ │ ├── progress.overrides
│ │ │ │ ├── progress.variables
│ │ │ │ ├── rating.overrides
│ │ │ │ ├── rating.variables
│ │ │ │ ├── search.overrides
│ │ │ │ ├── search.variables
│ │ │ │ ├── shape.overrides
│ │ │ │ ├── shape.variables
│ │ │ │ ├── sidebar.overrides
│ │ │ │ ├── sidebar.variables
│ │ │ │ ├── sticky.overrides
│ │ │ │ ├── sticky.variables
│ │ │ │ ├── tab.overrides
│ │ │ │ ├── tab.variables
│ │ │ │ ├── transition.overrides
│ │ │ │ └── transition.variables
│ │ │ └── views/
│ │ │ ├── ad.overrides
│ │ │ ├── ad.variables
│ │ │ ├── card.overrides
│ │ │ ├── card.variables
│ │ │ ├── comment.overrides
│ │ │ ├── comment.variables
│ │ │ ├── feed.overrides
│ │ │ ├── feed.variables
│ │ │ ├── item.overrides
│ │ │ ├── item.variables
│ │ │ ├── statistic.overrides
│ │ │ └── statistic.variables
│ │ ├── duo/
│ │ │ └── elements/
│ │ │ ├── loader.overrides
│ │ │ └── loader.variables
│ │ ├── fixed-width/
│ │ │ ├── collections/
│ │ │ │ ├── grid.overrides
│ │ │ │ └── grid.variables
│ │ │ └── modules/
│ │ │ ├── modal.overrides
│ │ │ └── modal.variables
│ │ ├── flat/
│ │ │ ├── collections/
│ │ │ │ ├── form.overrides
│ │ │ │ └── form.variables
│ │ │ └── globals/
│ │ │ ├── site.overrides
│ │ │ └── site.variables
│ │ ├── github/
│ │ │ ├── collections/
│ │ │ │ ├── breadcrumb.variables
│ │ │ │ ├── form.overrides
│ │ │ │ ├── form.variables
│ │ │ │ ├── grid.variables
│ │ │ │ ├── menu.overrides
│ │ │ │ ├── menu.variables
│ │ │ │ ├── message.overrides
│ │ │ │ ├── message.variables
│ │ │ │ └── table.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── header.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ ├── icon.variables
│ │ │ │ ├── image.variables
│ │ │ │ ├── input.overrides
│ │ │ │ ├── input.variables
│ │ │ │ ├── label.overrides
│ │ │ │ ├── label.variables
│ │ │ │ ├── segment.overrides
│ │ │ │ ├── segment.variables
│ │ │ │ ├── step.overrides
│ │ │ │ └── step.variables
│ │ │ ├── globals/
│ │ │ │ └── site.variables
│ │ │ └── modules/
│ │ │ ├── dropdown.overrides
│ │ │ ├── dropdown.variables
│ │ │ └── popup.variables
│ │ ├── gmail/
│ │ │ └── collections/
│ │ │ ├── message.overrides
│ │ │ └── message.variables
│ │ ├── instagram/
│ │ │ └── views/
│ │ │ ├── card.overrides
│ │ │ └── card.variables
│ │ ├── material/
│ │ │ ├── collections/
│ │ │ │ ├── menu.overrides
│ │ │ │ └── menu.variables
│ │ │ ├── elements/
│ │ │ │ ├── button.overrides
│ │ │ │ ├── button.variables
│ │ │ │ ├── header.overrides
│ │ │ │ ├── header.variables
│ │ │ │ ├── icon.overrides
│ │ │ │ └── icon.variables
│ │ │ ├── globals/
│ │ │ │ ├── site.overrides
│ │ │ │ └── site.variables
│ │ │ └── modules/
│ │ │ ├── dropdown.overrides
│ │ │ ├── dropdown.variables
│ │ │ ├── modal.overrides
│ │ │ └── modal.variables
│ │ ├── pulsar/
│ │ │ └── elements/
│ │ │ ├── loader.overrides
│ │ │ └── loader.variables
│ │ ├── raised/
│ │ │ └── elements/
│ │ │ ├── button.overrides
│ │ │ └── button.variables
│ │ ├── resetcss/
│ │ │ └── globals/
│ │ │ ├── reset.overrides
│ │ │ └── reset.variables
│ │ ├── round/
│ │ │ └── elements/
│ │ │ ├── button.overrides
│ │ │ └── button.variables
│ │ ├── rtl/
│ │ │ └── globals/
│ │ │ ├── site.overrides
│ │ │ └── site.variables
│ │ ├── striped/
│ │ │ └── modules/
│ │ │ ├── progress.overrides
│ │ │ └── progress.variables
│ │ ├── timeline/
│ │ │ └── views/
│ │ │ ├── feed.overrides
│ │ │ └── feed.variables
│ │ └── twitter/
│ │ └── elements/
│ │ ├── button.overrides
│ │ └── button.variables
│ └── tasks/
│ ├── README.md
│ ├── admin/
│ │ ├── components/
│ │ │ ├── create.js
│ │ │ ├── init.js
│ │ │ └── update.js
│ │ ├── distributions/
│ │ │ ├── create.js
│ │ │ ├── init.js
│ │ │ └── update.js
│ │ ├── publish.js
│ │ ├── register.js
│ │ └── release.js
│ ├── build/
│ │ ├── assets.js
│ │ ├── css.js
│ │ └── javascript.js
│ ├── build.js
│ ├── check-install.js
│ ├── clean.js
│ ├── collections/
│ │ ├── README.md
│ │ ├── admin.js
│ │ ├── build.js
│ │ ├── internal.js
│ │ └── rtl.js
│ ├── config/
│ │ ├── admin/
│ │ │ ├── github.js
│ │ │ ├── oauth.example.js
│ │ │ ├── release.js
│ │ │ └── templates/
│ │ │ ├── README.md
│ │ │ ├── bower.json
│ │ │ ├── component-package.js
│ │ │ ├── composer.json
│ │ │ ├── css-package.js
│ │ │ ├── less-package.js
│ │ │ └── package.json
│ │ ├── defaults.js
│ │ ├── docs.js
│ │ ├── npm/
│ │ │ └── gulpfile.js
│ │ ├── project/
│ │ │ ├── config.js
│ │ │ ├── install.js
│ │ │ └── release.js
│ │ ├── tasks.js
│ │ └── user.js
│ ├── docs/
│ │ ├── build.js
│ │ ├── metadata.js
│ │ └── serve.js
│ ├── install.js
│ ├── rtl/
│ │ ├── build.js
│ │ └── watch.js
│ ├── version.js
│ └── watch.js
├── semantic.json
└── src/
├── App.css
├── App.js
├── App.test.js
├── actions/
│ ├── albumsActions.js
│ ├── authActions.js
│ ├── facesActions.js
│ ├── peopleActions.js
│ ├── photosActions.js
│ ├── publicActions.js
│ ├── searchActions.js
│ ├── uiActions.js
│ ├── userActions.js
│ └── utilActions.js
├── api_client/
│ ├── apiClient.js
│ └── apiClientDeploy.js
├── components/
│ ├── LightBoxV2.js
│ ├── ModalAlbumShare.js
│ ├── ModalPhotosShare.js
│ ├── SecuredImage.js
│ ├── album.js
│ ├── authenticatedImage.js
│ ├── charts/
│ │ ├── countryPiChart.js
│ │ └── wordCloud.js
│ ├── chartyPhotosScrollbar.js
│ ├── egoGraph.js
│ ├── eventCountMonthGraph.js
│ ├── faceClusterGraph.js
│ ├── faces.js
│ ├── imageInfoTable.js
│ ├── lightBox.js
│ ├── locationDurationStackedBar.js
│ ├── locationLink.js
│ ├── maps.js
│ ├── modalPhotoView.js
│ ├── people.js
│ ├── socialGraph.js
│ └── statistics.js
├── containers/
│ └── login.js
├── history.js
├── index.css
├── index.js
├── layouts/
│ ├── AdminPage.js
│ ├── Bench.js
│ ├── DataVisualization.js
│ ├── FaceDashboardV3.js
│ ├── FavoritePhotos.js
│ ├── HiddenPhotos.js
│ ├── PublicUserList.js
│ ├── RVListExample.js
│ ├── RecentlyAddedPhotos.js
│ ├── ReusablePhotoListView.js
│ ├── SharedFromMe.js
│ ├── SharedToMe.js
│ ├── SignUpPage.js
│ ├── UserManagement.js
│ ├── UserPublicPage.js
│ ├── \
│ ├── albumAuto.js
│ ├── albumAutoGalleryView.js
│ ├── albumAutoMonths.js
│ ├── albumAutoRV.js
│ ├── albumDateGalleryView.js
│ ├── albumDateMonths.js
│ ├── albumPeople.js
│ ├── albumPersonGallery.js
│ ├── albumPlace.js
│ ├── albumPlaceGallery.js
│ ├── albumThing.js
│ ├── albumUser.js
│ ├── albumUserGallery.js
│ ├── albums.js
│ ├── albumsAutoListCardView.js
│ ├── albumsAutoListCardViewMonthGroup.js
│ ├── allPhotosGroupedByDate.js
│ ├── allPhotosView.js
│ ├── allPhotosViewHash.js
│ ├── allPhotosViewHashRV.js
│ ├── allPhotosViewLL.js
│ ├── allPhotosViewRV.js
│ ├── favoriteAutoAlbums.js
│ ├── loginPage.js
│ ├── menubars.js
│ ├── noTimestampPhotosView.js
│ ├── notImplementedPlaceholder.js
│ ├── peopleDashboard.js
│ ├── privateRoute.js
│ ├── searchMultipleResultsCategories.js
│ ├── searchRV.js
│ ├── settings.js
│ ├── statistics.js
│ └── vigTest.js
├── middleware.js
├── pig.js
├── reducers/
│ ├── albumsReducer.js
│ ├── authReducer.js
│ ├── facesReducer.js
│ ├── index.js
│ ├── peopleReducer.js
│ ├── photosReducer.js
│ ├── publicReducer.js
│ ├── searchReducer.js
│ ├── uiReducer.js
│ ├── userReducer.js
│ └── utilReducer.js
├── registerServiceWorker.js
├── routerExample.js
├── routes/
│ └── index.js
├── store.js
└── util/
├── countryNames.js
├── fuzzyMatch.js
├── gridUtils.js
├── scrollUtils.js
└── util.js
SYMBOL INDEX (713 symbols across 106 files)
FILE: semantic/tasks/admin/components/init.js
function setupRepo (line 96) | function setupRepo() {
function initRepo (line 105) | function initRepo() {
function createRepo (line 115) | function createRepo() {
function addRemote (line 126) | function addRemote() {
function pullFiles (line 133) | function pullFiles() {
function resetFiles (line 140) | function resetFiles() {
function nextRepo (line 147) | function nextRepo() {
FILE: semantic/tasks/admin/components/update.js
function setConfig (line 104) | function setConfig() {
function commitFiles (line 116) | function commitFiles() {
function pushFiles (line 138) | function pushFiles() {
function getSHA (line 147) | function getSHA() {
function createRelease (line 155) | function createRelease(version) {
function nextRepo (line 165) | function nextRepo() {
FILE: semantic/tasks/admin/distributions/init.js
function setupRepo (line 95) | function setupRepo() {
function initRepo (line 104) | function initRepo() {
function createRepo (line 114) | function createRepo() {
function addRemote (line 125) | function addRemote() {
function pullFiles (line 132) | function pullFiles() {
function resetFiles (line 139) | function resetFiles() {
function nextRepo (line 146) | function nextRepo() {
FILE: semantic/tasks/admin/distributions/update.js
function setConfig (line 100) | function setConfig() {
function commitFiles (line 111) | function commitFiles() {
function pushFiles (line 133) | function pushFiles() {
function getSHA (line 142) | function getSHA() {
function createRelease (line 150) | function createRelease(version) {
function nextRepo (line 160) | function nextRepo() {
FILE: semantic/tasks/docs/metadata.js
function startsWith (line 21) | function startsWith(str, prefix) {
function inArray (line 25) | function inArray(needle, haystack) {
function parser (line 39) | function parser(file, callback) {
FILE: src/App.js
class Nav (line 67) | class Nav extends React.Component {
method render (line 68) | render() {
class App (line 80) | class App extends Component {
method render (line 89) | render() {
FILE: src/actions/albumsActions.js
function fetchThingAlbumsList (line 7) | function fetchThingAlbumsList() {
function fetchThingAlbum (line 23) | function fetchThingAlbum(album_id) {
function fetchUserAlbumsList (line 39) | function fetchUserAlbumsList() {
function fetchUserAlbum (line 55) | function fetchUserAlbum(album_id) {
function createNewUserAlbum (line 71) | function createNewUserAlbum(title, image_hashes) {
function deleteUserAlbum (line 110) | function deleteUserAlbum(albumID, albumTitle) {
function editUserAlbum (line 134) | function editUserAlbum(album_id, title, image_hashes) {
function fetchPlaceAlbumsList (line 174) | function fetchPlaceAlbumsList() {
function fetchPlaceAlbum (line 198) | function fetchPlaceAlbum(album_id) {
function fetchPeopleAlbums (line 214) | function fetchPeopleAlbums(person_id) {
function generateAutoAlbums (line 230) | function generateAutoAlbums() {
function fetchAutoAlbums (line 247) | function fetchAutoAlbums() {
function fetchAutoAlbumsList (line 265) | function fetchAutoAlbumsList() {
function fetchDateAlbumsList (line 281) | function fetchDateAlbumsList() {
function fetchDateAlbumsPhotoHashList (line 297) | function fetchDateAlbumsPhotoHashList() {
function fetchAlbumsAutoGalleries (line 324) | function fetchAlbumsAutoGalleries(album_id) {
function fetchAlbumsDateGalleries (line 341) | function fetchAlbumsDateGalleries(album_id) {
function toggleAlbumAutoFavorite (line 357) | function toggleAlbumAutoFavorite(album_id, rating) {
function setUserAlbumShared (line 374) | function setUserAlbumShared(album_id, target_user_id, val_shared) {
function fetchUserAlbumsSharedToMe (line 421) | function fetchUserAlbumsSharedToMe() {
function fetchUserAlbumsSharedFromMe (line 446) | function fetchUserAlbumsSharedFromMe() {
FILE: src/actions/authActions.js
constant LOGIN_REQUEST (line 9) | const LOGIN_REQUEST = '@@auth/LOGIN_REQUEST';
constant LOGIN_SUCCESS (line 10) | const LOGIN_SUCCESS = '@@auth/LOGIN_SUCCESS';
constant LOGIN_FAILURE (line 11) | const LOGIN_FAILURE = '@@auth/LOGIN_FAILURE';
constant TOKEN_REQUEST (line 13) | const TOKEN_REQUEST = '@@auth/TOKEN_REQUEST';
constant TOKEN_RECEIVED (line 14) | const TOKEN_RECEIVED = '@@auth/TOKEN_RECEIVED';
constant TOKEN_FAILURE (line 15) | const TOKEN_FAILURE = '@@auth/TOKEN_FAILURE';
function signup (line 42) | function signup(username,password,email,firstname,lastname) {
function login (line 61) | function login(username,password,from) {
function refreshAccessToken (line 76) | function refreshAccessToken(token) {
function logout (line 89) | function logout() {
FILE: src/actions/facesActions.js
function setFacesPersonLabel (line 5) | function setFacesPersonLabel(faceIDs, personName) {
function deleteFaces (line 32) | function deleteFaces(faceIDs) {
function trainFaces (line 59) | function trainFaces() {
function clusterFaces (line 97) | function clusterFaces() {
function fetchInferredFaces (line 112) | function fetchInferredFaces() {
function fetchLabeledFaces (line 128) | function fetchLabeledFaces() {
function fetchFaces (line 144) | function fetchFaces() {
function fetchInferredFacesList (line 161) | function fetchInferredFacesList() {
function fetchLabeledFacesList (line 177) | function fetchLabeledFacesList() {
function fetchFacesList (line 193) | function fetchFacesList() {
function fetchFaceToLabel (line 210) | function fetchFaceToLabel() {
function loadFaceToLabel (line 227) | function loadFaceToLabel(face) {
function deleteFaceAndFetchNext (line 233) | function deleteFaceAndFetchNext(face_id) {
function labelFacePerson (line 249) | function labelFacePerson(face_id, person_name) {
function labelFacePersonAndFetchNext (line 266) | function labelFacePersonAndFetchNext(face_id, person_name) {
FILE: src/actions/peopleActions.js
function fetchPeople (line 5) | function fetchPeople() {
function addPerson (line 32) | function addPerson(person_name) {
function deletePerson (line 49) | function deletePerson(person_id) {
function addPersonAndSetLabelToFace (line 64) | function addPersonAndSetLabelToFace(person_name,face_id) {
function fetchSocialGraph (line 95) | function fetchSocialGraph() {
function fetchEgoGraph (line 111) | function fetchEgoGraph(person_id) {
FILE: src/actions/photosActions.js
function setPhotosShared (line 10) | function setPhotosShared(image_hashes, val_shared, target_user) {
function fetchRecentlyAddedPhotos (line 54) | function fetchRecentlyAddedPhotos() {
function fetchPhotosSharedToMe (line 84) | function fetchPhotosSharedToMe() {
function fetchPhotosSharedFromMe (line 109) | function fetchPhotosSharedFromMe() {
function setPhotosPublic (line 142) | function setPhotosPublic(image_hashes, val_public) {
function setPhotosFavorite (line 195) | function setPhotosFavorite(image_hashes, favorite) {
function setPhotosHidden (line 236) | function setPhotosHidden(image_hashes, hidden) {
function scanPhotos (line 277) | function scanPhotos() {
function scanNextcloudPhotos (line 303) | function scanNextcloudPhotos() {
function fetchPhotos (line 329) | function fetchPhotos() {
function fetchFavoritePhotos (line 346) | function fetchFavoritePhotos() {
function fetchHiddenPhotos (line 367) | function fetchHiddenPhotos() {
function fetchPhotoDetail (line 388) | function fetchPhotoDetail(image_hash) {
function simpleFetchPhotos (line 404) | function simpleFetchPhotos() {
function fetchNoTimestampPhotoList (line 420) | function fetchNoTimestampPhotoList() {
function generatePhotoIm2txtCaption (line 436) | function generatePhotoIm2txtCaption(image_hash) {
FILE: src/actions/publicActions.js
function fetchUserPublicPhotos (line 5) | function fetchUserPublicPhotos(userName) {
function fetchPublicUserList (line 21) | function fetchPublicUserList() {
FILE: src/actions/searchActions.js
function searchPhotos (line 6) | function searchPhotos(query) {
function searchPeople (line 40) | function searchPeople(query) {
function searchThingAlbums (line 72) | function searchThingAlbums(query) {
function searchPlaceAlbums (line 85) | function searchPlaceAlbums(query) {
FILE: src/actions/uiActions.js
function toggleSidebar (line 1) | function toggleSidebar() {
FILE: src/actions/userActions.js
function fetchUserSelfDetails (line 7) | function fetchUserSelfDetails(user_id) {
FILE: src/actions/utilActions.js
function fetchJobList (line 9) | function fetchJobList(page,page_size=10) {
function deleteJob (line 22) | function deleteJob(job_id,page=1,page_size=10) {
function setSiteSettings (line 37) | function setSiteSettings(siteSettings) {
function fetchSiteSettings (line 54) | function fetchSiteSettings() {
function fetchUserList (line 72) | function fetchUserList() {
function fetchDirectoryTree (line 88) | function fetchDirectoryTree() {
function fetchNextcloudDirectoryTree (line 105) | function fetchNextcloudDirectoryTree(path) {
function updateUser (line 122) | function updateUser(user) {
function manageUpdateUser (line 154) | function manageUpdateUser(user) {
function fetchWorkerAvailability (line 185) | function fetchWorkerAvailability(prevRunningJob) {
function generateEventAlbums (line 230) | function generateEventAlbums() {
function generateEventAlbumTitles (line 261) | function generateEventAlbumTitles() {
function fetchExampleSearchTerms (line 296) | function fetchExampleSearchTerms() {
function fetchLocationSunburst (line 312) | function fetchLocationSunburst() {
function fetchLocationTimeline (line 328) | function fetchLocationTimeline() {
function fetchCountStats (line 344) | function fetchCountStats() {
function fetchPhotoScanStatus (line 360) | function fetchPhotoScanStatus() {
function fetchAutoAlbumProcessingStatus (line 376) | function fetchAutoAlbumProcessingStatus() {
function fetchLocationClusters (line 395) | function fetchLocationClusters() {
function fetchPhotoCountryCounts (line 411) | function fetchPhotoCountryCounts() {
function fetchPhotoMonthCounts (line 427) | function fetchPhotoMonthCounts() {
function fetchWordCloud (line 443) | function fetchWordCloud() {
function rebuildSimilarityIndex (line 456) | function rebuildSimilarityIndex() {
FILE: src/api_client/apiClient.js
function select (line 11) | function select(state) {
function listener (line 15) | function listener() {
FILE: src/api_client/apiClientDeploy.js
function select (line 11) | function select(state) {
function listener (line 15) | function listener() {
FILE: src/components/LightBoxV2.js
class LightBoxV2 (line 67) | class LightBoxV2 extends Component {
method constructor (line 76) | constructor(props) {
method handleResize (line 82) | handleResize() {
method componentDidMount (line 95) | componentDidMount(){
method render (line 101) | render() {
FILE: src/components/ModalAlbumShare.js
constant SPEED_THRESHOLD (line 64) | const SPEED_THRESHOLD = 500;
function fuzzy_match (line 66) | function fuzzy_match(str, pattern) {
class ModalAlbumShare (line 105) | class ModalAlbumShare extends Component {
method render (line 110) | render() {
FILE: src/components/ModalPhotosShare.js
constant SPEED_THRESHOLD (line 62) | const SPEED_THRESHOLD = 500;
function fuzzy_match (line 64) | function fuzzy_match(str, pattern) {
class ModalPhotosShare (line 103) | class ModalPhotosShare extends Component {
method render (line 105) | render() {
FILE: src/components/SecuredImage.js
class SecuredImageJWT (line 31) | class SecuredImageJWT extends Component {
method render (line 52) | render() {
class SecuredImage (line 75) | class SecuredImage extends Component {
method componentWillMount (line 80) | componentWillMount() {
method render (line 91) | render() {
FILE: src/components/album.js
class AlbumLocationMap (line 24) | class AlbumLocationMap extends Component {
method render (line 25) | render() {
class AlbumPeopleCard (line 77) | class AlbumPeopleCard extends Component {
method render (line 78) | render() {
class AlbumPeopleGallery (line 107) | class AlbumPeopleGallery extends Component {
method componentWillMount (line 108) | componentWillMount() {
method componentWillReceiveProps (line 113) | componentWillReceiveProps() {
method render (line 118) | render() {
class AlbumAutoGallery (line 183) | class AlbumAutoGallery extends Component {
method render (line 184) | render() {
class AlbumAutoCard (line 238) | class AlbumAutoCard extends Component {
method constructor (line 239) | constructor(props){
method onRate (line 244) | onRate(e,d) {
method render (line 256) | render() {
class AlbumAutoCardPlainPlaceholder (line 318) | class AlbumAutoCardPlainPlaceholder extends Component {
method render (line 319) | render() {
class AlbumAutoCardPlain (line 339) | class AlbumAutoCardPlain extends Component {
method constructor (line 340) | constructor(props){
method onRate (line 345) | onRate(e,d) {
method render (line 357) | render() {
class AlbumDateCardPlaceholder (line 433) | class AlbumDateCardPlaceholder extends Component {
method constructor (line 434) | constructor(props){
method render (line 437) | render() {
class AlbumDateCard (line 461) | class AlbumDateCard extends Component {
method constructor (line 462) | constructor(props){
method onRate (line 467) | onRate(e,d) {
method render (line 478) | render() {
class AlbumDateCardPlainPlaceholder (line 544) | class AlbumDateCardPlainPlaceholder extends Component {
method render (line 545) | render() {
class AlbumDateCardPlain (line 572) | class AlbumDateCardPlain extends Component {
method constructor (line 573) | constructor(props){
method onRate (line 578) | onRate(e,d) {
method render (line 589) | render() {
FILE: src/components/authenticatedImage.js
class Image (line 10) | class Image extends Component {
method render (line 11) | render() {
FILE: src/components/charts/countryPiChart.js
class CountryPiChart (line 15) | class CountryPiChart extends Component {
method constructor (line 16) | constructor(props) {
method componentDidMount (line 19) | componentDidMount() {
method render (line 25) | render(){
FILE: src/components/charts/wordCloud.js
class WordCloud (line 11) | class WordCloud extends Component {
method constructor (line 12) | constructor(props) {
method componentDidMount (line 16) | componentDidMount() {
method render (line 24) | render(){
FILE: src/components/chartyPhotosScrollbar.js
class ChartyPhotosScrollbar (line 28) | class ChartyPhotosScrollbar extends Component {
method constructor (line 29) | constructor(props) {
method componentWillMount (line 34) | componentWillMount() {
method preprocessData (line 40) | preprocessData() {
method render (line 124) | render() {
FILE: src/components/egoGraph.js
class EgoGraph (line 14) | class EgoGraph extends Component {
method componentWillMount (line 15) | componentWillMount() {
method render (line 21) | render(){
FILE: src/components/eventCountMonthGraph.js
class EventCountMonthGraph (line 21) | class EventCountMonthGraph extends Component {
method constructor (line 22) | constructor(props) {
method componentWillMount (line 26) | componentWillMount() {
method render (line 33) | render() {
FILE: src/components/faceClusterGraph.js
class FaceClusterScatter (line 15) | class FaceClusterScatter extends Component {
method componentWillMount (line 21) | componentWillMount() {
method render (line 24) | render() {
FILE: src/components/faces.js
class FaceStatistics (line 24) | class FaceStatistics extends Component {
method render (line 25) | render() {
class EditableFaceIcon (line 42) | class EditableFaceIcon extends Component {
method render (line 49) | render() {
class FaceTableLabeled (line 82) | class FaceTableLabeled extends Component{
method componentWillMount (line 83) | componentWillMount() {
method render (line 86) | render() {
class FaceTableInferred (line 126) | class FaceTableInferred extends Component{
method componentWillMount (line 127) | componentWillMount() {
method render (line 130) | render() {
class FacesLabeled (line 172) | class FacesLabeled extends Component {
method componentWillMount (line 173) | componentWillMount() {
method render (line 176) | render() {
class FacesInferred (line 200) | class FacesInferred extends Component {
method componentWillMount (line 201) | componentWillMount() {
method render (line 204) | render() {
class FaceCards (line 229) | class FaceCards extends Component {
method componentWillMount (line 230) | componentWillMount() {
method render (line 235) | render() {
class FaceToLabel (line 256) | class FaceToLabel extends Component {
method componentWillMount (line 257) | componentWillMount() {
method render (line 262) | render() {
class FaceCard (line 278) | class FaceCard extends Component {
method render (line 283) | render() {
class FaceCardMenu (line 347) | class FaceCardMenu extends Component {
method render (line 367) | render() {
FILE: src/components/imageInfoTable.js
class ImageInfoTable (line 6) | class ImageInfoTable extends Component {
method render (line 7) | render() {
FILE: src/components/lightBox.js
class LightBox (line 83) | class LightBox extends Component {
method render (line 88) | render() {
FILE: src/components/locationDurationStackedBar.js
class LocationDurationStackedBar (line 31) | class LocationDurationStackedBar extends Component {
method componentWillMount (line 34) | componentWillMount() {
method render (line 41) | render() {
FILE: src/components/locationLink.js
class LocationLink (line 26) | class LocationLink extends React.Component {
method componentWillMount (line 34) | componentWillMount() {
method render (line 40) | render() {
FILE: src/components/maps.js
class LocationMap (line 26) | class LocationMap extends Component {
method render (line 27) | render() {
class EventMap (line 92) | class EventMap extends Component {
method constructor (line 93) | constructor(props) {
method componentDidMount (line 98) | componentDidMount() {
method preprocess (line 102) | preprocess() {
method render (line 126) | render() {
class LocationClusterMap (line 150) | class LocationClusterMap extends Component {
method constructor (line 163) | constructor(props) {
method componentDidMount (line 170) | componentDidMount() {
method getDerivedStateFromProps (line 221) | static getDerivedStateFromProps(nextProps, prevState) {
method preprocess (line 246) | preprocess() {
method componentWillUnmount (line 255) | componentWillUnmount() {
method calculateEntrySquareSize (line 259) | calculateEntrySquareSize() {
method render (line 341) | render() {
class AllPhotosMap (line 421) | class AllPhotosMap extends Component {
method componentDidMount (line 422) | componentDidMount() {
method render (line 426) | render() {
FILE: src/components/modalPhotoView.js
class ModalPhotoViewVertical (line 9) | class ModalPhotoViewVertical extends Component {
method constructor (line 10) | constructor() {
method updateDimensions (line 20) | updateDimensions() {
method componentDidMount (line 40) | componentDidMount() {
method componentWillUnmount (line 45) | componentWillUnmount() {
method render (line 49) | render() {
FILE: src/components/people.js
class PeopleCardGroup (line 22) | class PeopleCardGroup extends Component {
method componentWillMount (line 23) | componentWillMount() {
method render (line 27) | render() {
class PersonCard (line 44) | class PersonCard extends Component {
method render (line 45) | render() {
FILE: src/components/socialGraph.js
class SocialGraph (line 14) | class SocialGraph extends Component {
method componentWillMount (line 15) | componentWillMount() {
method render (line 21) | render(){
FILE: src/components/statistics.js
class CountStats (line 10) | class CountStats extends Component {
method componentWillMount (line 11) | componentWillMount() {
method render (line 15) | render() {
FILE: src/layouts/AdminPage.js
class AdminPage (line 74) | class AdminPage extends Component {
method componentDidMount (line 77) | componentDidMount() {
method render (line 86) | render() {
class JobList (line 234) | class JobList extends Component {
method componentDidMount (line 237) | componentDidMount() {
method render (line 245) | render() {
class ModalScanDirectoryEdit (line 405) | class ModalScanDirectoryEdit extends Component {
method constructor (line 406) | constructor(props) {
method getDerivedStateFromProps (line 413) | static getDerivedStateFromProps(nextProps, prevState) {
method nodeClicked (line 421) | nodeClicked(event, rowInfo) {
method render (line 427) | render() {
FILE: src/layouts/Bench.js
class SecuredImage (line 13) | class SecuredImage extends Component {
method componentWillMount (line 18) | componentWillMount() {
method render (line 29) | render() {
FILE: src/layouts/DataVisualization.js
class LocationTree (line 38) | class LocationTree extends Component {
method render (line 39) | render() {
class PhotoMap (line 51) | class PhotoMap extends Component {
method render (line 52) | render() {
class WordClouds (line 63) | class WordClouds extends Component {
method componentWillMount (line 64) | componentWillMount() {
method render (line 68) | render() {
class Timeline (line 93) | class Timeline extends Component {
method render (line 94) | render() {
class Graph (line 107) | class Graph extends Component {
method render (line 108) | render() {
class FaceScatter (line 117) | class FaceScatter extends Component {
method render (line 118) | render() {
FILE: src/layouts/FaceDashboardV3.js
constant SPEED_THRESHOLD (line 57) | const SPEED_THRESHOLD = 500;
function fuzzy_match (line 59) | function fuzzy_match(str, pattern) {
class ModalPersonEdit (line 97) | class ModalPersonEdit extends Component {
method render (line 99) | render() {
class FaceDashboard (line 263) | class FaceDashboard extends Component {
method componentDidMount (line 306) | componentDidMount() {
method getDerivedStateFromProps (line 313) | static getDerivedStateFromProps(nextProps, prevState) {
method handleResize (line 364) | handleResize() {
method handleClick (line 403) | handleClick(e, cell) {
method onFaceSelect (line 437) | onFaceSelect(faceID) {
method render (line 605) | render() {
FILE: src/layouts/FavoritePhotos.js
class FavoritePhotos (line 37) | class FavoritePhotos extends Component {
method componentDidMount (line 43) | componentDidMount() {
method getDerivedStateFromProps (line 49) | static getDerivedStateFromProps(nextProps,prevState){
method render (line 86) | render() {
FILE: src/layouts/HiddenPhotos.js
class HiddenPhotos (line 36) | class HiddenPhotos extends Component {
method componentDidMount (line 42) | componentDidMount() {
method getDerivedStateFromProps (line 48) | static getDerivedStateFromProps(nextProps,prevState){
method render (line 85) | render() {
FILE: src/layouts/PublicUserList.js
class PublicUserList (line 23) | class PublicUserList extends Component {
method componentDidMount (line 24) | componentDidMount() {
method render (line 27) | render() {
FILE: src/layouts/RVListExample.js
function toInt (line 29) | function toInt(n){ return Math.round(Number(n)); }
class ListExample (line 38) | class ListExample extends PureComponent {
method constructor (line 39) | constructor(props, context) {
method componentWillMount (line 59) | componentWillMount(){
method groupPhotosByDate (line 63) | groupPhotosByDate(photos) {
method componentWillReceiveProps (line 86) | componentWillReceiveProps(nextProps) {
method render (line 93) | render() {
method _renderList (line 108) | _renderList({width}){
method _renderAutoSizer (line 121) | _renderAutoSizer({ height, scrollTop }) {
method _rowRenderer (line 193) | _rowRenderer({ index, isScrolling, key, parent, style, isVisible }) {
FILE: src/layouts/RecentlyAddedPhotos.js
class RecentlyAddedPhotos (line 25) | class RecentlyAddedPhotos extends Component {
method componentDidMount (line 26) | componentDidMount() {
method render (line 29) | render() {
FILE: src/layouts/ReusablePhotoListView.js
function fuzzy_match (line 87) | function fuzzy_match(str, pattern) {
class PhotoListView (line 126) | class PhotoListView extends Component {
method constructor (line 127) | constructor(props) {
method componentDidMount (line 187) | componentDidMount() {
method componentWillUnmount (line 195) | componentWillUnmount() {
method handleResize (line 200) | handleResize() {
method onPhotoClick (line 228) | onPhotoClick(hash) {
method onPhotoSelect (line 235) | onPhotoSelect(hash) {
method onGroupSelect (line 248) | onGroupSelect(hashes) {
method getPhotoDetails (line 679) | getPhotoDetails(image_hash) {
method componentDidUpdate (line 683) | componentDidUpdate(prevProps, prevState, snapshot) {
method getDerivedStateFromProps (line 692) | static getDerivedStateFromProps(nextProps, prevState) {
method render (line 712) | render() {
class ModalAlbumEdit (line 1425) | class ModalAlbumEdit extends Component {
method render (line 1427) | render() {
FILE: src/layouts/SharedFromMe.js
constant SPEED_THRESHOLD (line 43) | const SPEED_THRESHOLD = 300;
class SharedFromMe (line 47) | class SharedFromMe extends Component {
method constructor (line 58) | constructor(props) {
method componentDidMount (line 92) | componentDidMount() {
method getDerivedStateFromProps (line 101) | static getDerivedStateFromProps(nextProps, prevState) {
method handleResize (line 114) | handleResize() {
method render (line 306) | render() {
FILE: src/layouts/SharedToMe.js
constant SPEED_THRESHOLD (line 41) | const SPEED_THRESHOLD = 300;
class SharedToMe (line 45) | class SharedToMe extends Component {
method constructor (line 56) | constructor(props) {
method componentDidMount (line 90) | componentDidMount() {
method getDerivedStateFromProps (line 100) | static getDerivedStateFromProps(nextProps, prevState) {
method handleResize (line 118) | handleResize() {
method render (line 290) | render() {
FILE: src/layouts/SignUpPage.js
class SignupPage (line 29) | class SignupPage extends Component {
method constructor (line 30) | constructor(props) {
method onSubmit (line 54) | onSubmit(event) {
method render (line 68) | render() {
FILE: src/layouts/UserManagement.js
class UserManagement (line 41) | class UserManagement extends Component {
method componentDidMount (line 44) | componentDidMount() {
method render (line 51) | render() {
class ModalScanDirectoryEdit (line 112) | class ModalScanDirectoryEdit extends Component {
method constructor (line 113) | constructor(props) {
method getDerivedStateFromProps (line 120) | static getDerivedStateFromProps(nextProps, prevState) {
method nodeClicked (line 128) | nodeClicked(event, rowInfo) {
method render (line 134) | render() {
FILE: src/layouts/UserPublicPage.js
class UserPublicPage (line 18) | class UserPublicPage extends Component {
method componentDidMount (line 25) | componentDidMount() {
method getDerivedStateFromProps (line 32) | static getDerivedStateFromProps(nextProps, prevState) {
method render (line 78) | render() {
FILE: src/layouts/albumAuto.js
class AlbumAuto (line 53) | class AlbumAuto extends Component {
method constructor (line 54) | constructor() {
method componentWillMount (line 65) | componentWillMount() {
method calculateEntrySquareSize (line 73) | calculateEntrySquareSize() {
method render (line 137) | render() {
class EntrySquare (line 185) | class EntrySquare extends Component {
method render (line 186) | render() {
FILE: src/layouts/albumAutoGalleryView.js
class AlbumLocationMap (line 71) | class AlbumLocationMap extends Component {
method render (line 72) | render() {
class AlbumAutoGalleryView (line 120) | class AlbumAutoGalleryView extends Component {
method constructor (line 133) | constructor(props) {
method componentWillMount (line 138) | componentWillMount() {
method calculateEntrySquareSize (line 146) | calculateEntrySquareSize() {
method onPhotoClick (line 183) | onPhotoClick(image_hash) {
method getPhotoDetails (line 233) | getPhotoDetails(image_hash) {
method render (line 239) | render() {
FILE: src/layouts/albumAutoMonths.js
class AlbumAutoMonthCards (line 13) | class AlbumAutoMonthCards extends Component {
method render (line 14) | render() {
class AlbumAutoMonths (line 56) | class AlbumAutoMonths extends Component {
method constructor (line 57) | constructor(props){
method componentWillMount (line 62) | componentWillMount() {
method componentWillUnmount (line 75) | componentWillUnmount() {
method shouldComponentUpdate (line 79) | shouldComponentUpdate(nextProps, nextState){
method groupEventsByMonth (line 94) | groupEventsByMonth() {
method render (line 116) | render() {
FILE: src/layouts/albumAutoRV.js
class ScrollSpeed (line 40) | class ScrollSpeed {
method getScrollSpeed (line 45) | getScrollSpeed(scrollOffset) {
constant SPEED_THRESHOLD (line 58) | const SPEED_THRESHOLD = 1000;
constant SCROLL_DEBOUNCE_DURATION (line 59) | const SCROLL_DEBOUNCE_DURATION = 100;
class AlbumAutoRV (line 61) | class AlbumAutoRV extends Component {
method constructor (line 62) | constructor(props) {
method componentWillMount (line 102) | componentWillMount() {
method calculateEntrySquareSize (line 108) | calculateEntrySquareSize() {
method render (line 199) | render() {
FILE: src/layouts/albumDateGalleryView.js
class AlbumLocationMap (line 22) | class AlbumLocationMap extends Component {
method render (line 23) | render() {
class AlbumDateGalleryView (line 75) | class AlbumDateGalleryView extends Component {
method componentWillMount (line 76) | componentWillMount() {
method render (line 80) | render() {
FILE: src/layouts/albumDateMonths.js
class AlbumDateMonthCards (line 13) | class AlbumDateMonthCards extends Component {
method render (line 14) | render() {
class AlbumDateMonths (line 56) | class AlbumDateMonths extends Component {
method constructor (line 57) | constructor(props){
method componentWillMount (line 62) | componentWillMount() {
method shouldComponentUpdate (line 67) | shouldComponentUpdate(nextProps, nextState){
method groupDatesByMonth (line 79) | groupDatesByMonth() {
method render (line 99) | render() {
FILE: src/layouts/albumPeople.js
class AlbumPeople (line 40) | class AlbumPeople extends Component {
method constructor (line 41) | constructor(props) {
method componentWillMount (line 54) | componentWillMount() {
method componentWillUnmount (line 62) | componentWillUnmount() {
method calculateEntrySquareSize (line 66) | calculateEntrySquareSize() {
method render (line 197) | render() {
FILE: src/layouts/albumPersonGallery.js
class AlbumPersonGallery (line 36) | class AlbumPersonGallery extends Component {
method componentDidMount (line 42) | componentDidMount() {
method getDerivedStateFromProps (line 50) | static getDerivedStateFromProps(nextProps,prevState){
method render (line 91) | render() {
FILE: src/layouts/albumPlace.js
class AlbumPlace (line 60) | class AlbumPlace extends Component {
method constructor (line 61) | constructor() {
method componentWillMount (line 76) | componentWillMount() {
method componentWillUnmount (line 84) | componentWillUnmount() {
method calculateEntrySquareSize (line 88) | calculateEntrySquareSize() {
method render (line 168) | render() {
class EntrySquare (line 277) | class EntrySquare extends Component {
method render (line 278) | render() {
FILE: src/layouts/albumPlaceGallery.js
constant ESCAPE_KEY (line 14) | const ESCAPE_KEY = 27;
constant ENTER_KEY (line 15) | const ENTER_KEY = 13;
constant RIGHT_ARROW_KEY (line 16) | const RIGHT_ARROW_KEY = 39;
constant UP_ARROW_KEY (line 17) | const UP_ARROW_KEY = 38;
constant LEFT_ARROW_KEY (line 18) | const LEFT_ARROW_KEY = 37;
constant DOWN_ARROW_KEY (line 19) | const DOWN_ARROW_KEY = 40;
constant SIDEBAR_WIDTH (line 21) | const SIDEBAR_WIDTH = 85;
constant DAY_HEADER_HEIGHT (line 23) | const DAY_HEADER_HEIGHT = 70
class AlbumPlaceGallery (line 29) | class AlbumPlaceGallery extends Component {
method componentDidMount (line 36) | componentDidMount() {
method getDerivedStateFromProps (line 45) | static getDerivedStateFromProps(nextProps,prevState){
method render (line 84) | render() {
FILE: src/layouts/albumThing.js
class AlbumThing (line 51) | class AlbumThing extends Component {
method constructor (line 52) | constructor() {
method componentWillMount (line 63) | componentWillMount() {
method componentWillUnount (line 71) | componentWillUnount() {
method calculateEntrySquareSize (line 75) | calculateEntrySquareSize() {
method render (line 147) | render() {
class EntrySquare (line 195) | class EntrySquare extends Component {
method render (line 196) | render() {
FILE: src/layouts/albumUser.js
class AlbumUser (line 55) | class AlbumUser extends Component {
method constructor (line 56) | constructor() {
method componentWillMount (line 67) | componentWillMount() {
method calculateEntrySquareSize (line 75) | calculateEntrySquareSize() {
method render (line 196) | render() {
class EntrySquare (line 244) | class EntrySquare extends Component {
method render (line 245) | render() {
FILE: src/layouts/albumUserGallery.js
class AlbumUserGallery (line 57) | class AlbumUserGallery extends Component {
method componentDidMount (line 64) | componentDidMount() {
method getDerivedStateFromProps (line 68) | static getDerivedStateFromProps(nextProps, prevState) {
method render (line 111) | render() {
FILE: src/layouts/albums.js
class Albums (line 24) | class Albums extends Component {
method constructor (line 25) | constructor() {
method componentWillMount (line 35) | componentWillMount() {
method calculateEntrySquareSize (line 40) | calculateEntrySquareSize() {
method render (line 71) | render () {
class EntrySquare (line 91) | class EntrySquare extends Component {
method render (line 92) | render () {
FILE: src/layouts/albumsAutoListCardView.js
class AlbumsAutoListCardView (line 50) | class AlbumsAutoListCardView extends Component {
method constructor (line 51) | constructor(props){
method insertMonthCardsIntoAlbumsList (line 56) | insertMonthCardsIntoAlbumsList(){
method render (line 80) | render() {
class MonthCard (line 107) | class MonthCard extends Component {
method render (line 108) | render() {
class AlbumAutoCard (line 129) | class AlbumAutoCard extends Component {
method render (line 130) | render() {
class AlbumsAutoListHeader (line 186) | class AlbumsAutoListHeader extends Component {
method componentWillMount (line 188) | componentWillMount() {
method componentWillUnmount (line 199) | componentWillUnmount() {
method render (line 206) | render() {
class AlbumsAutoListCards (line 246) | class AlbumsAutoListCards extends PureComponent {
method constructor (line 247) | constructor(props, context) {
method render (line 275) | render() {
method _calculateColumnCount (line 301) | _calculateColumnCount() {
method _cellRenderer (line 307) | _cellRenderer({ index, key, parent, style }) {
method _initCellPositioner (line 348) | _initCellPositioner() {
method _onResize (line 361) | _onResize({ width }) {
method _renderAutoSizer (line 370) | _renderAutoSizer({ height, scrollTop }) {
method _renderMasonry (line 385) | _renderMasonry({ width }) {
method _resetCellPositioner (line 409) | _resetCellPositioner() {
method _setMasonryRef (line 419) | _setMasonryRef(ref) {
FILE: src/layouts/albumsAutoListCardViewMonthGroup.js
class ListExample (line 35) | class ListExample extends PureComponent {
method constructor (line 36) | constructor(props, context) {
method render (line 56) | render() {
method _getDatum (line 92) | _getDatum(index) {
method _getRowHeight (line 98) | _getRowHeight({ index }) {
method _noRowsRenderer (line 102) | _noRowsRenderer() {
method _onRowCountChange (line 106) | _onRowCountChange(event) {
method _onScrollToRowChange (line 112) | _onScrollToRowChange(event) {
method _rowRenderer (line 126) | _rowRenderer({ index, isScrolling, key, style }) {
FILE: src/layouts/allPhotosGroupedByDate.js
class ImagePlaceholder (line 33) | class ImagePlaceholder extends Component {
method render (line 34) | render () {
class AllPhotosGroupedByDate (line 42) | class AllPhotosGroupedByDate extends Component {
method constructor (line 43) | constructor(props){
method calculateEntrySquareSize (line 56) | calculateEntrySquareSize() {
method receivedAllProps (line 86) | receivedAllProps() {
method componentWillMount (line 108) | componentWillMount() {
method groupPhotosByDate (line 114) | groupPhotosByDate() {
method groupedPhotosToImageGrids (line 137) | groupedPhotosToImageGrids(groupedPhotos) {
method render (line 199) | render() {
FILE: src/layouts/allPhotosView.js
function calculateDayHeight (line 35) | function calculateDayHeight(numPhotos,sidebarVisible) {
class DayPlaceholder (line 54) | class DayPlaceholder extends Component {
method constructor (line 55) | constructor() {
method componentDidMount (line 69) | componentDidMount() {
method calculatePlaceholderSize (line 81) | calculatePlaceholderSize() {
method render (line 108) | render() {
class PhotoDayGroup (line 125) | class PhotoDayGroup extends Component {
method constructor (line 126) | constructor() {
method _handleKeyDown (line 133) | _handleKeyDown (event) {
method componentWillUnmount (line 160) | componentWillUnmount() {
method onPhotoClick (line 165) | onPhotoClick(idx) {
method componentWillMount (line 170) | componentWillMount() {
method render (line 178) | render() {
class PhotoDayGroupReactGridGallery (line 238) | class PhotoDayGroupReactGridGallery extends Component {
method componentWillMount (line 239) | componentWillMount() {
method render (line 244) | render() {
class AllPhotosView (line 279) | class AllPhotosView extends Component {
method componentWillMount (line 281) | componentWillMount() {
method render (line 286) | render() {
FILE: src/layouts/allPhotosViewHash.js
class DayGroupPlaceholder (line 35) | class DayGroupPlaceholder extends Component {
method render (line 36) | render () {
class DayGroup (line 58) | class DayGroup extends Component {
method render (line 59) | render () {
class AllPhotosHashListView (line 100) | class AllPhotosHashListView extends Component {
method constructor (line 101) | constructor(props){
method componentWillMount (line 110) | componentWillMount() {
method calculateEntrySquareSize (line 119) | calculateEntrySquareSize() {
method render (line 152) | render () {
FILE: src/layouts/allPhotosViewHashRV.js
class AllPhotosHashListViewRV (line 97) | class AllPhotosHashListViewRV extends Component {
method componentDidMount (line 98) | componentDidMount() {
method render (line 105) | render() {
FILE: src/layouts/allPhotosViewLL.js
class AllPhotosViewLL (line 9) | class AllPhotosViewLL extends Component {
method constructor (line 10) | constructor(props){
method componentWillMount (line 15) | componentWillMount() {
method groupPhotosByDate (line 19) | groupPhotosByDate() {
method render (line 49) | render() {
FILE: src/layouts/allPhotosViewRV.js
class PhotosListCardView (line 53) | class PhotosListCardView extends Component {
method constructor (line 54) | constructor(props){
method componentWillMount (line 59) | componentWillMount(){
method insertMonthCardIntoPhotosList (line 63) | insertMonthCardIntoPhotosList(){
method render (line 110) | render() {
class MonthCard (line 169) | class MonthCard extends Component {
method render (line 170) | render() {
class PhotoCard (line 190) | class PhotoCard extends Component {
method render (line 191) | render() {
class PhotoListCards (line 210) | class PhotoListCards extends PureComponent {
method constructor (line 211) | constructor(props, context) {
method render (line 239) | render() {
method _calculateColumnCount (line 265) | _calculateColumnCount() {
method _cellRenderer (line 271) | _cellRenderer({ index, key, parent, style }) {
method _initCellPositioner (line 314) | _initCellPositioner() {
method _onResize (line 327) | _onResize({ width }) {
method _renderAutoSizer (line 336) | _renderAutoSizer({ height, scrollTop }) {
method _renderMasonry (line 351) | _renderMasonry({ width }) {
method _resetCellPositioner (line 374) | _resetCellPositioner() {
method _setMasonryRef (line 384) | _setMasonryRef(ref) {
FILE: src/layouts/favoriteAutoAlbums.js
class FavoriteAutoAlbumsView (line 8) | class FavoriteAutoAlbumsView extends Component {
method constructor (line 9) | constructor(props){
method componentWillMount (line 14) | componentWillMount(){
method filterFavoriteAutoAlbums (line 20) | filterFavoriteAutoAlbums(){
method render (line 34) | render() {
FILE: src/layouts/loginPage.js
class LoginPage (line 18) | class LoginPage extends Component {
method constructor (line 19) | constructor(props) {
method componentDidMount (line 33) | componentDidMount() {
method onSubmit (line 42) | onSubmit(event) {
method render (line 47) | render() {
FILE: src/layouts/menubars.js
function fuzzy_match (line 48) | function fuzzy_match(str, pattern) {
class TopMenuPublic (line 59) | class TopMenuPublic extends Component {
method render (line 60) | render() {
class TopMenu (line 129) | class TopMenu extends Component {
method constructor (line 141) | constructor(props) {
method handleResize (line 150) | handleResize() {
method componentDidMount (line 154) | componentDidMount() {
method getDerivedStateFromProps (line 180) | static getDerivedStateFromProps(nextProps, prevState) {
method componentWillUnmount (line 226) | componentWillUnmount() {
method _handleKeyDown (line 231) | _handleKeyDown(event) {
method filterSearchSuggestions (line 242) | filterSearchSuggestions() {
method handleSearch (line 287) | handleSearch(e, d) {
method handleChange (line 302) | handleChange(e, d) {
method render (line 307) | render() {
class SideMenuNarrowPublic (line 688) | class SideMenuNarrowPublic extends Component {
method render (line 689) | render() {
class SideMenuNarrow (line 730) | class SideMenuNarrow extends Component {
method render (line 736) | render() {
class SideMenu (line 981) | class SideMenu extends Component {
method render (line 987) | render() {
FILE: src/layouts/noTimestampPhotosView.js
class NoTimestampPhotosView (line 30) | class NoTimestampPhotosView extends Component {
method componentDidMount (line 37) | componentDidMount() {
method getDerivedStateFromProps (line 41) | static getDerivedStateFromProps(nextProps,prevState){
method render (line 78) | render() {
FILE: src/layouts/notImplementedPlaceholder.js
class NotImplementedPlaceholder (line 3) | class NotImplementedPlaceholder extends Component {
method render (line 4) | render() {
FILE: src/layouts/peopleDashboard.js
class PeopleDashboard (line 22) | class PeopleDashboard extends Component {
method render (line 23) | render() {
FILE: src/layouts/privateRoute.js
class Nav (line 49) | class Nav extends React.Component {
method render (line 50) | render() {
FILE: src/layouts/searchMultipleResultsCategories.js
class SearchMultipleCategories (line 37) | class SearchMultipleCategories extends Component {
method constructor (line 39) | constructor(props){
method componentDidMount (line 92) | componentDidMount() {
method componentWillUnmount (line 99) | componentWillUnmount() {
method handleResize (line 104) | handleResize() {
method onPhotoClick (line 190) | onPhotoClick(hash) {
method getPhotoDetails (line 194) | getPhotoDetails(image_hash) {
method getDerivedStateFromProps (line 200) | static getDerivedStateFromProps(nextProps,prevState){
method render (line 206) | render() {
FILE: src/layouts/searchRV.js
class ScrollSpeed (line 36) | class ScrollSpeed {
method getScrollSpeed (line 41) | getScrollSpeed(scrollOffset) {
constant SPEED_THRESHOLD (line 55) | const SPEED_THRESHOLD = 1000;
constant SCROLL_DEBOUNCE_DURATION (line 56) | const SCROLL_DEBOUNCE_DURATION = 100;
class SearchView (line 62) | class SearchView extends Component {
method render (line 63) | render() {
class DayGroupPlaceholder (line 86) | class DayGroupPlaceholder extends Component {
method render (line 87) | render () {
class DayGroup (line 120) | class DayGroup extends Component {
method render (line 121) | render () {
class SearchViewRV (line 155) | class SearchViewRV extends Component {
method constructor (line 157) | constructor(props){
method componentWillMount (line 207) | componentWillMount() {
method calculateEntrySquareSize (line 215) | calculateEntrySquareSize() {
method onPhotoClick (line 295) | onPhotoClick(hash) {
method getPhotoDetails (line 304) | getPhotoDetails(image_hash) {
method render (line 310) | render() {
FILE: src/layouts/settings.js
class Settings (line 70) | class Settings extends Component {
method constructor (line 81) | constructor(props) {
method componentDidMount (line 94) | componentDidMount() {
method onAvatarFileDrop (line 104) | onAvatarFileDrop(files) {
method getDerivedStateFromProps (line 109) | static getDerivedStateFromProps(nextProps, prevState) {
method render (line 117) | render() {
class ModalNextcloudScanDirectoryEdit (line 673) | class ModalNextcloudScanDirectoryEdit extends Component {
method constructor (line 674) | constructor(props) {
method getDerivedStateFromProps (line 681) | static getDerivedStateFromProps(nextProps, prevState) {
method nodeClicked (line 689) | nodeClicked(event, rowInfo) {
method render (line 695) | render() {
class JobList (line 789) | class JobList extends Component {
method componentDidMount (line 790) | componentDidMount() {
method render (line 796) | render() {
FILE: src/layouts/statistics.js
class Statistics (line 22) | class Statistics extends Component {
method render (line 48) | render() {
FILE: src/layouts/vigTest.js
class MyList (line 7) | class MyList extends Component {
method itemRenderer (line 8) | itemRenderer(item) {
method render (line 13) | render() {
FILE: src/middleware.js
function createApiMiddleware (line 7) | function createApiMiddleware() {
FILE: src/pig.js
function resize (line 16) | function resize() {
function runCallbacks (line 28) | function runCallbacks() {
function _injectStyle (line 73) | function _injectStyle(containerId, classPrefix, transitionSpeed) {
function _extend (line 129) | function _extend(obj1, obj2) {
function _getOffsetTop (line 144) | function _getOffsetTop(elem){
function Pig (line 174) | function Pig(imageData, options) {
function ProgressiveGroup (line 842) | function ProgressiveGroup(groupid, index, pig) {
function ProgressiveImage (line 1028) | function ProgressiveImage(singleImageData, index, pig, group) {
FILE: src/reducers/albumsReducer.js
function reducer (line 1) | function reducer(
FILE: src/reducers/authReducer.js
function accessToken (line 77) | function accessToken(state) {
function refreshToken (line 83) | function refreshToken(state) {
function isAccessTokenExpired (line 89) | function isAccessTokenExpired(state) {
function isRefreshTokenExpired (line 96) | function isRefreshTokenExpired(state) {
function isAuthenticated (line 103) | function isAuthenticated(state) {
function errors (line 108) | function errors(state) {
FILE: src/reducers/facesReducer.js
function reducer (line 1) | function reducer(
FILE: src/reducers/index.js
function withAuth (line 54) | function withAuth(headers) {
FILE: src/reducers/peopleReducer.js
function reducer (line 1) | function reducer(state={
FILE: src/reducers/photosReducer.js
function reducer (line 1) | function reducer(
FILE: src/reducers/publicReducer.js
function reducer (line 1) | function reducer(
FILE: src/reducers/searchReducer.js
function reducer (line 1) | function reducer(state={
FILE: src/reducers/uiReducer.js
function reducer (line 1) | function reducer(state={
FILE: src/reducers/userReducer.js
function reducer (line 1) | function reducer(
FILE: src/reducers/utilReducer.js
function reducer (line 1) | function reducer(
FILE: src/registerServiceWorker.js
function register (line 21) | function register() {
function registerValidSW (line 46) | function registerValidSW(swUrl) {
function checkValidServiceWorker (line 75) | function checkValidServiceWorker(swUrl) {
function unregister (line 102) | function unregister() {
FILE: src/routes/index.js
function configRoutes (line 39) | function configRoutes() {
FILE: src/util/gridUtils.js
function select (line 6) | function select(state) {
function listener (line 12) | function listener() {
FILE: src/util/scrollUtils.js
class ScrollSpeed (line 1) | class ScrollSpeed {
method getScrollSpeed (line 6) | getScrollSpeed(scrollOffset) {
method clearTimeout (line 17) | clearTimeout() {
constant SPEED_THRESHOLD (line 22) | const SPEED_THRESHOLD = 500;
constant SCROLL_DEBOUNCE_DURATION (line 23) | const SCROLL_DEBOUNCE_DURATION = 250;
Condensed preview — 542 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,971K chars).
[
{
"path": ".dockerignore",
"chars": 59,
"preview": ".gitignore\nDockerfile\nMakefile\nREADME.md\nscreenshots/\ntags\n"
},
{
"path": ".gitignore",
"chars": 291,
"preview": "# See https://help.github.com/ignore-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n\n# testing\n/cov"
},
{
"path": "Dockerfile",
"chars": 539,
"preview": "FROM ubuntu:16.04\nMAINTAINER ViViDboarder <vividboarder@gmail.com>\n\nRUN apt-get update && \\\n apt-get install -y curl "
},
{
"path": "LICENSE",
"chars": 1067,
"preview": "MIT License\n\nCopyright (c) 2017 Hooram Nam\n\nPermission is hereby granted, free of charge, to any person obtaining a copy"
},
{
"path": "Makefile",
"chars": 220,
"preview": ".PHONY: default build run shell\n\nDOCKER_TAG ?= ownphotos-frontend\n\ndefault: build\n\nbuild:\n\tdocker build -t $(DOCKER_TAG)"
},
{
"path": "README.md",
"chars": 343,
"preview": "<div style=\"text-align:center\"><img width=\"100\" src =\"/screenshots/logo.png\"/></div>\n\n# Ownphotos\n\n## What is it?\n\n- Sel"
},
{
"path": "docker-compose.yml",
"chars": 2172,
"preview": "version: '2'\n\nservices:\n\n proxy:\n image: guysoft/ownphotos-proxy\n tty: true\n container_name: ownphotos-proxy\n "
},
{
"path": "nginx.conf",
"chars": 287,
"preview": "user nginx;\nworker_processes 1;\n\nerror_log /var/log/nginx/error.log debug;\n\nevents {\n worker_connections 1024;\n}\n"
},
{
"path": "package.json",
"chars": 2590,
"preview": "{\n \"name\": \"ownphotos-frontend\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"dependencies\": {\n \"@vx/gradient\": \"0.0."
},
{
"path": "public/index.html",
"chars": 1974,
"preview": "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-wid"
},
{
"path": "public/manifest.json",
"chars": 284,
"preview": "{\n \"short_name\": \"Ownphotos\",\n \"name\": \"Ownphotos\",\n \"icons\": [\n {\n \"src\": \"favicon.ico\",\n \"sizes\": \"192"
},
{
"path": "run.sh",
"chars": 325,
"preview": "#!/usr/bin/env bash\nsed -i \"s@http://192.168.1.100@//${BACKEND_HOST}@g\" src/api_client/apiClient.js\nsed -i \"s@http://192"
},
{
"path": "semantic/gulpfile.js",
"chars": 1925,
"preview": "/*******************************\n Set-up\n*******************************/\n\nvar\n gulp = require('gulp"
},
{
"path": "semantic/src/definitions/behaviors/api.js",
"chars": 39779,
"preview": "/*!\n * # Semantic UI - API\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * htt"
},
{
"path": "semantic/src/definitions/behaviors/form.js",
"chars": 55906,
"preview": "/*!\n * # Semantic UI - Form Validation\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT li"
},
{
"path": "semantic/src/definitions/behaviors/visibility.js",
"chars": 42863,
"preview": "/*!\n * # Semantic UI - Visibility\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license"
},
{
"path": "semantic/src/definitions/collections/breadcrumb.less",
"chars": 2103,
"preview": "/*!\n * # Semantic UI - Breadcrumb\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license"
},
{
"path": "semantic/src/definitions/collections/form.less",
"chars": 27067,
"preview": "/*!\n * # Semantic UI - Form\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/collections/grid.less",
"chars": 68576,
"preview": "/*!\n * # Semantic UI - Grid\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/collections/menu.less",
"chars": 43280,
"preview": "/*\n * # Semantic - Menu\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Copyright 2015 Contributor\n * Released u"
},
{
"path": "semantic/src/definitions/collections/message.less",
"chars": 8828,
"preview": "/*!\n * # Semantic UI - Message\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n *"
},
{
"path": "semantic/src/definitions/collections/table.less",
"chars": 24750,
"preview": "/*!\n * # Semantic UI - Table\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/elements/button.less",
"chars": 95460,
"preview": "/*!\n * # Semantic UI - Button\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/elements/container.less",
"chars": 3162,
"preview": "/*!\n * # Semantic UI - Container\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n"
},
{
"path": "semantic/src/definitions/elements/divider.less",
"chars": 4815,
"preview": "/*!\n * # Semantic UI - Divider\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n *"
},
{
"path": "semantic/src/definitions/elements/flag.less",
"chars": 895,
"preview": "/*!\n * # Semantic UI - Flag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/elements/header.less",
"chars": 13383,
"preview": "/*!\n * # Semantic UI - Header\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/elements/icon.less",
"chars": 8663,
"preview": "/*!\n * # Semantic UI - Icon\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/elements/image.less",
"chars": 5759,
"preview": "/*!\n * # Semantic UI - Image\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/elements/input.less",
"chars": 11637,
"preview": "/*!\n * # Semantic UI - Input\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/elements/label.less",
"chars": 28081,
"preview": "/*!\n * # Semantic UI - Label\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/elements/list.less",
"chars": 22368,
"preview": "/*!\n * # Semantic UI - List\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/elements/loader.less",
"chars": 6054,
"preview": "/*!\n * # Semantic UI - Loader\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/elements/rail.less",
"chars": 2684,
"preview": "/*!\n * # Semantic UI - Rail\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/elements/reveal.less",
"chars": 6041,
"preview": "/*!\n * # Semantic UI - Reveal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/elements/segment.less",
"chars": 15442,
"preview": "/*!\n * # Semantic UI - Segment\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n *"
},
{
"path": "semantic/src/definitions/elements/step.less",
"chars": 11386,
"preview": "/*!\n * # Semantic UI - Step\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/globals/reset.less",
"chars": 733,
"preview": "/*!\n * # Semantic UI - Reset\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/globals/site.js",
"chars": 14111,
"preview": "/*!\n * # Semantic UI - Site\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/globals/site.less",
"chars": 3786,
"preview": "/*!\n * # Semantic UI - Site\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/modules/accordion.js",
"chars": 20171,
"preview": "/*!\n * # Semantic UI - Accordion\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n"
},
{
"path": "semantic/src/definitions/modules/accordion.less",
"chars": 4873,
"preview": "/*!\r\n * # Semantic UI - Accordion\r\n * http://github.com/semantic-org/semantic-ui/\r\n *\r\n *\r\n * Released under the MIT lic"
},
{
"path": "semantic/src/definitions/modules/checkbox.js",
"chars": 26075,
"preview": "/*!\n * # Semantic UI - Checkbox\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n "
},
{
"path": "semantic/src/definitions/modules/checkbox.less",
"chars": 12945,
"preview": "/*!\n * # Semantic UI - Checkbox\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n "
},
{
"path": "semantic/src/definitions/modules/dimmer.js",
"chars": 20827,
"preview": "/*!\n * # Semantic UI - Dimmer\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/modules/dimmer.less",
"chars": 4226,
"preview": "/*!\n * # Semantic UI - Dimmer\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/modules/dropdown.js",
"chars": 140885,
"preview": "/*!\n * # Semantic UI - Dropdown\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n "
},
{
"path": "semantic/src/definitions/modules/dropdown.less",
"chars": 31311,
"preview": "/*!\n * # Semantic UI - Dropdown\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n "
},
{
"path": "semantic/src/definitions/modules/embed.js",
"chars": 19895,
"preview": "/*!\n * # Semantic UI - Embed\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/modules/embed.less",
"chars": 2734,
"preview": "/*!\n * # Semantic UI - Video\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/modules/modal.js",
"chars": 29786,
"preview": "/*!\n * # Semantic UI - Modal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/modules/modal.less",
"chars": 11834,
"preview": "/*!\n * # Semantic UI - Modal\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/modules/nag.js",
"chars": 15040,
"preview": "/*!\n * # Semantic UI - Nag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * htt"
},
{
"path": "semantic/src/definitions/modules/nag.less",
"chars": 2464,
"preview": "/*!\n * # Semantic UI - Nag\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * htt"
},
{
"path": "semantic/src/definitions/modules/popup.js",
"chars": 50492,
"preview": "/*!\n * # Semantic UI - Popup\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/modules/popup.less",
"chars": 14883,
"preview": "/*!\n * # Semantic UI - Popup\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/modules/progress.js",
"chars": 30267,
"preview": "/*!\n * # Semantic UI - Progress\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n "
},
{
"path": "semantic/src/definitions/modules/progress.less",
"chars": 10283,
"preview": "/*!\n * # Semantic UI - Progress Bar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT licen"
},
{
"path": "semantic/src/definitions/modules/rating.js",
"chars": 14355,
"preview": "/*!\n * # Semantic UI - Rating\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/modules/rating.less",
"chars": 3599,
"preview": "/*!\n * # Semantic UI - Rating\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/modules/search.js",
"chars": 49690,
"preview": "/*!\n * # Semantic UI - Search\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/modules/search.less",
"chars": 9435,
"preview": "/*!\n * # Semantic UI - Search\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/modules/shape.js",
"chars": 28946,
"preview": "/*!\n * # Semantic UI - Shape\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/modules/shape.less",
"chars": 2403,
"preview": "/*!\n * # Semantic UI - Shape\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * h"
},
{
"path": "semantic/src/definitions/modules/sidebar.js",
"chars": 33449,
"preview": "/*!\n * # Semantic UI - Sidebar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n *"
},
{
"path": "semantic/src/definitions/modules/sidebar.less",
"chars": 10545,
"preview": "/*!\n * # Semantic UI - Sidebar\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n *"
},
{
"path": "semantic/src/definitions/modules/sticky.js",
"chars": 30849,
"preview": "/*!\n * # Semantic UI - Sticky\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/modules/sticky.less",
"chars": 1189,
"preview": "/*!\n * # Semantic UI - Sticky\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * "
},
{
"path": "semantic/src/definitions/modules/tab.js",
"chars": 32813,
"preview": "/*!\n * # Semantic UI - Tab\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * htt"
},
{
"path": "semantic/src/definitions/modules/tab.less",
"chars": 1742,
"preview": "/*!\n * # Semantic UI - Tab\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * htt"
},
{
"path": "semantic/src/definitions/modules/transition.js",
"chars": 34975,
"preview": "/*!\n * # Semantic UI - Transition\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license"
},
{
"path": "semantic/src/definitions/modules/transition.less",
"chars": 1441,
"preview": "/*!\n * # Semantic UI - Transition\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license"
},
{
"path": "semantic/src/definitions/views/ad.less",
"chars": 3882,
"preview": "/*!\n * # Semantic UI - Ad\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Copyright 2013 Contributors\n * Release"
},
{
"path": "semantic/src/definitions/views/card.less",
"chars": 21596,
"preview": "/*!\n * # Semantic UI - Item\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/views/comment.less",
"chars": 5074,
"preview": "/*!\n * # Semantic UI - Comment\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n *"
},
{
"path": "semantic/src/definitions/views/feed.less",
"chars": 5882,
"preview": "/*!\n * # Semantic UI - Feed\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/views/item.less",
"chars": 9456,
"preview": "/*!\n * # Semantic UI - Item\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n * ht"
},
{
"path": "semantic/src/definitions/views/statistic.less",
"chars": 12216,
"preview": "/*!\n * # Semantic UI - Statistic\n * http://github.com/semantic-org/semantic-ui/\n *\n *\n * Released under the MIT license\n"
},
{
"path": "semantic/src/semantic.less",
"chars": 2650,
"preview": "/*\n\n███████╗███████╗███╗ ███╗ █████╗ ███╗ ██╗████████╗██╗ ██████╗ ██╗ ██╗██╗\n██╔════╝██╔════╝████╗ ████║██╔══██"
},
{
"path": "semantic/src/site/collections/breadcrumb.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/breadcrumb.variables",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/form.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/form.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/grid.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/grid.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/menu.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/menu.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/message.overrides",
"chars": 89,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/message.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/table.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/collections/table.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/button.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/button.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/container.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/container.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/divider.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/divider.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/flag.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/flag.variables",
"chars": 63,
"preview": "/*-------------------\n Flag Variables\n--------------------*/\n"
},
{
"path": "semantic/src/site/elements/header.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/header.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/icon.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/icon.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/image.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/image.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/input.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/input.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/label.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/label.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/list.overrides",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/list.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/loader.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/loader.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/rail.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/rail.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/reveal.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/reveal.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/segment.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/segment.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/step.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/elements/step.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/globals/reset.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/globals/reset.variables",
"chars": 93,
"preview": "/*******************************\n User Global Variables\n*******************************/\n"
},
{
"path": "semantic/src/site/globals/site.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/globals/site.variables",
"chars": 92,
"preview": "/*******************************\n User Global Variables\n*******************************/"
},
{
"path": "semantic/src/site/modules/accordion.overrides",
"chars": 89,
"preview": "/*******************************\n User Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/accordion.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/chatroom.overrides",
"chars": 89,
"preview": "/*******************************\n User Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/chatroom.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/checkbox.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/checkbox.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/dimmer.overrides",
"chars": 89,
"preview": "/*******************************\n User Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/dimmer.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/dropdown.overrides",
"chars": 89,
"preview": "/*******************************\n User Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/dropdown.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/embed.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/embed.variables",
"chars": 0,
"preview": ""
},
{
"path": "semantic/src/site/modules/modal.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/modal.variables",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/nag.overrides",
"chars": 89,
"preview": "/*******************************\n User Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/nag.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/popup.overrides",
"chars": 89,
"preview": "/*******************************\n User Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/popup.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/progress.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/progress.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/rating.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/rating.variables",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/search.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/search.variables",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/shape.overrides",
"chars": 89,
"preview": "/*******************************\n User Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/shape.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/sidebar.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/sidebar.variables",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/sticky.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/sticky.variables",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/tab.overrides",
"chars": 89,
"preview": "/*******************************\n User Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/tab.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/transition.overrides",
"chars": 90,
"preview": "/*******************************\n Site Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/modules/transition.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/ad.overrides",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/ad.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/card.overrides",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/card.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/comment.overrides",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/comment.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/feed.overrides",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/feed.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/item.overrides",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/item.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/statistic.overrides",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/site/views/statistic.variables",
"chars": 94,
"preview": "/*******************************\n User Variable Overrides\n*******************************/\n"
},
{
"path": "semantic/src/theme.config",
"chars": 2034,
"preview": "/*\n\n████████╗██╗ ██╗███████╗███╗ ███╗███████╗███████╗\n╚══██╔══╝██║ ██║██╔════╝████╗ ████║██╔════╝██╔════╝\n ██║ █"
},
{
"path": "semantic/src/theme.less",
"chars": 1448,
"preview": "/*******************************\n Import Directives\n*******************************/\n\n/*------------------\n "
},
{
"path": "semantic/src/themes/amazon/elements/button.overrides",
"chars": 989,
"preview": ".ui.button {\n background-image: linear-gradient(center top , #F7F8FA, #E7E9EC) repeat scroll 0 0 rgba(0, 0, 0, 0);\n}\n\n."
},
{
"path": "semantic/src/themes/amazon/elements/button.variables",
"chars": 1334,
"preview": "/*-------------------\n Button Variables\n--------------------*/\n\n/* Button Variables */\n@pageFont: Helvetica Neue, Helv"
},
{
"path": "semantic/src/themes/amazon/globals/site.variables",
"chars": 835,
"preview": "/*******************************\n User Global Variables\n*******************************/\n\n@pageMinWidth : 1049px;\n@"
},
{
"path": "semantic/src/themes/basic/collections/table.overrides",
"chars": 88,
"preview": "/*******************************\n Overrides\n*******************************/\n\n"
},
{
"path": "semantic/src/themes/basic/collections/table.variables",
"chars": 200,
"preview": "/*-------------------\n Table Variables\n--------------------*/\n\n@headerBackground: @white;\n@footerBackground: @white;\n\n"
},
{
"path": "semantic/src/themes/basic/elements/button.overrides",
"chars": 88,
"preview": "/*******************************\n Overrides\n*******************************/\n\n"
},
{
"path": "semantic/src/themes/basic/elements/button.variables",
"chars": 781,
"preview": "/*-------------------\n Button Variables\n--------------------*/\n\n/* Button Variables */\n@textTransform: none;\n@fontWeig"
},
{
"path": "semantic/src/themes/basic/elements/icon.overrides",
"chars": 7836,
"preview": "/* basic.icons available */\ni.icon.circle.attention:before { content: '\\2757'; } /* '❗' */\ni.icon.circle.help:before { c"
},
{
"path": "semantic/src/themes/basic/elements/icon.variables",
"chars": 361,
"preview": "/*-------------------\n Icon Variables\n--------------------*/\n\n@fontPath : \"../../themes/basic/assets/fonts\";\n\n@src:\n "
},
{
"path": "semantic/src/themes/basic/elements/step.overrides",
"chars": 196,
"preview": "/*******************************\n Overrides\n*******************************/\n\n.ui.steps .step:after {\n displa"
},
{
"path": "semantic/src/themes/basic/elements/step.variables",
"chars": 336,
"preview": "/*-------------------\n Step Variables\n--------------------*/\n\n/* Stepss */\n@stepsBorder: none;\n@stepsBorderRadius: @ci"
},
{
"path": "semantic/src/themes/basic/globals/reset.overrides",
"chars": 114,
"preview": "/*******************************\n Overrides\n*******************************/\n\n/* No Additional Resets */"
},
{
"path": "semantic/src/themes/basic/globals/reset.variables",
"chars": 84,
"preview": "/*******************************\n Reset\n*******************************/"
},
{
"path": "semantic/src/themes/basic/modules/progress.overrides",
"chars": 87,
"preview": "/*******************************\n Progress\n*******************************/\n"
},
{
"path": "semantic/src/themes/basic/modules/progress.variables",
"chars": 285,
"preview": "/*******************************\n Progress\n*******************************/\n\n@background: transparent;\n@borde"
},
{
"path": "semantic/src/themes/basic/views/card.overrides",
"chars": 88,
"preview": "/*******************************\n Overrides\n*******************************/\n\n"
},
{
"path": "semantic/src/themes/basic/views/card.variables",
"chars": 732,
"preview": "/*******************************\n Card\n*******************************/\n\n/*-------------------\n View"
},
{
"path": "semantic/src/themes/bookish/elements/header.overrides",
"chars": 259,
"preview": "/*******************************\n Overrides\n*******************************/\n\n@import url(http://fonts.googlea"
},
{
"path": "semantic/src/themes/bookish/elements/header.variables",
"chars": 747,
"preview": "/*-------------------\n Header\n--------------------*/\n\n@headerFont : 'Karma', 'Times New Roman', serif;\n@fontWeight"
},
{
"path": "semantic/src/themes/bootstrap3/elements/button.overrides",
"chars": 0,
"preview": ""
},
{
"path": "semantic/src/themes/bootstrap3/elements/button.variables",
"chars": 1203,
"preview": "/*-------------------\n Button Variables\n--------------------*/\n\n/* Button Variables */\n@pageFont: Helvetica Neue, Helv"
},
{
"path": "semantic/src/themes/chubby/collections/form.overrides",
"chars": 309,
"preview": "/*-------------------\n Form Variables\n--------------------*/\n\n.ui.form .selection.dropdown {\n padding: 1.1em 1.2em;\n "
},
{
"path": "semantic/src/themes/chubby/collections/form.variables",
"chars": 183,
"preview": "/*-------------------\n Form Variables\n--------------------*/\n\n@labelTextTransform: uppercase;\n@labelFontSize: 0.8em;\n\n"
},
{
"path": "semantic/src/themes/chubby/collections/menu.overrides",
"chars": 0,
"preview": ""
},
{
"path": "semantic/src/themes/chubby/collections/menu.variables",
"chars": 1059,
"preview": "/*******************************\n Menu\n*******************************/\n\n@background: @darkWhite;\n@boxShadow"
},
{
"path": "semantic/src/themes/chubby/elements/button.overrides",
"chars": 558,
"preview": "/*******************************\n Overrides\n*******************************/\n\n@import url(http://fonts.googlea"
},
{
"path": "semantic/src/themes/chubby/elements/button.variables",
"chars": 1095,
"preview": "/*-------------------\n Button Variables\n--------------------*/\n\n/* Button Variables */\n@pageFont: 'Source Sans Pro', A"
}
]
// ... and 342 more files (download for full content)
About this extraction
This page contains the full source code of the hooram/ownphotos-frontend GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 542 files (2.7 MB), approximately 731.9k tokens, and a symbol index with 713 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.