├── .github ├── ISSUE_TEMPLATE │ ├── ask-question.yml │ ├── bug-report.yml │ └── general-feedback.yml ├── os_probot_metadata.js ├── release-drafter.yml ├── set_response_times.js └── workflows │ ├── Zapier.yml │ ├── project.yml │ ├── release-drafter.yml │ └── set_response_time.yml ├── .gitignore ├── README.md ├── build_release.sh ├── onesignal.php ├── readme.txt ├── sdk_files ├── OneSignalSDKWorker.js ├── OneSignalSDKWorker.js.php ├── amp-helper-frame.html ├── amp-permission-dialog.html ├── index.html └── push │ └── onesignal │ └── index.html ├── v2 ├── .env ├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── PluginDevDockerUsage.md ├── build_release.sh ├── complete-migration.php ├── configuration-export.php ├── css │ └── onsignal-amp-style.css ├── docker-compose.yml ├── docker-instance-files │ └── uploads.ini ├── docker.sh ├── index.php ├── notice.js ├── onesignal-admin.php ├── onesignal-public.php ├── onesignal-settings.php ├── onesignal-utils.php ├── onesignal-widget.php └── views │ ├── config.php │ ├── css │ ├── callout.css │ ├── callout.scss │ ├── icons.css │ ├── icons.scss │ ├── link.css │ ├── link.scss │ ├── lusitana.css │ ├── lusitana.scss │ ├── lusitana │ │ ├── Lusitana-Bold-OTF.ttf │ │ ├── Lusitana-BoldItalic-OTF.ttf │ │ ├── Lusitana-Italic-OTF.ttf │ │ └── Lusitana-Regular-OTF.ttf │ ├── onesignal-font.scss │ ├── onesignal-font │ │ ├── OneSignal.eot │ │ ├── OneSignal.svg │ │ ├── OneSignal.ttf │ │ └── OneSignal.woff │ ├── onesignal-menu-styles.css │ ├── onesignal-menu-styles.scss │ ├── semantic-ui.css │ ├── semantic-ui.scss │ ├── semantic-ui │ │ ├── collections │ │ │ ├── _all.scss │ │ │ ├── _breadcrumb.scss │ │ │ ├── _form.scss │ │ │ ├── _grid.scss │ │ │ ├── _menu.scss │ │ │ ├── _message.scss │ │ │ └── _table.scss │ │ ├── elements │ │ │ ├── _all.scss │ │ │ ├── _button.scss │ │ │ ├── _container.scss │ │ │ ├── _divider.scss │ │ │ ├── _flag.scss │ │ │ ├── _header.scss │ │ │ ├── _icon.scss │ │ │ ├── _image.scss │ │ │ ├── _input.scss │ │ │ ├── _label.scss │ │ │ ├── _list.scss │ │ │ ├── _loader.scss │ │ │ ├── _rail.scss │ │ │ ├── _reveal.scss │ │ │ ├── _segment.scss │ │ │ └── _step.scss │ │ ├── globals │ │ │ ├── _all.scss │ │ │ ├── _reset.scss │ │ │ └── _site.scss │ │ ├── modules │ │ │ ├── _accordion.scss │ │ │ ├── _all.scss │ │ │ ├── _checkbox.scss │ │ │ ├── _dimmer.scss │ │ │ ├── _dropdown.scss │ │ │ ├── _embed.scss │ │ │ ├── _modal.scss │ │ │ ├── _nag.scss │ │ │ ├── _popup.scss │ │ │ ├── _progress.scss │ │ │ ├── _rating.scss │ │ │ ├── _search.scss │ │ │ ├── _shape.scss │ │ │ ├── _sidebar.scss │ │ │ ├── _sticky.scss │ │ │ ├── _tab.scss │ │ │ ├── _transition.scss │ │ │ └── _video.scss │ │ └── views │ │ │ ├── _ad.scss │ │ │ ├── _all.scss │ │ │ ├── _card.scss │ │ │ ├── _comment.scss │ │ │ ├── _feed.scss │ │ │ ├── _item.scss │ │ │ └── _statistic.scss │ ├── site.css │ └── site.scss │ ├── fonts │ └── semantic-ui │ │ ├── icons.eot │ │ ├── icons.otf │ │ ├── icons.svg │ │ ├── icons.ttf │ │ ├── icons.woff │ │ └── icons.woff2 │ ├── images │ ├── SampleNotification.png │ ├── bell-prenotify.jpg │ ├── bell.jpg │ └── settings │ │ ├── SafariRequiredSettings.png │ │ ├── SafariWebId.png │ │ ├── SampleNotification.png │ │ ├── app_id-1.jpg │ │ ├── chrome-http.jpg │ │ ├── chrome-https.jpg │ │ ├── chrome-push.jpg │ │ ├── chrome-push.png │ │ ├── create-1.jpg │ │ ├── create-10.jpg │ │ ├── create-2.jpg │ │ ├── create-3.jpg │ │ ├── create-4.jpg │ │ ├── create-5.jpg │ │ ├── create-6.jpg │ │ ├── create-7a.jpg │ │ ├── create-7b.jpg │ │ ├── create-8.jpg │ │ ├── create-9.jpg │ │ ├── firefox-1.jpg │ │ ├── firefox-http.jpg │ │ ├── firefox-https.jpg │ │ ├── firefox-push.jpg │ │ ├── firefox-push.png │ │ ├── gcm-1-2.jpg │ │ ├── gcm-1.jpg │ │ ├── gcm-10.jpg │ │ ├── gcm-11.jpg │ │ ├── gcm-12.jpg │ │ ├── gcm-2.jpg │ │ ├── gcm-3-1.jpg │ │ ├── gcm-3.jpg │ │ ├── gcm-4.jpg │ │ ├── gcm-5.jpg │ │ ├── gcm-6.jpg │ │ ├── gcm-7.jpg │ │ ├── gcm-8.jpg │ │ ├── gcm-9.jpg │ │ ├── http-permission-request-post-modal.png │ │ ├── http-prompt.jpg │ │ ├── http-prompt.png │ │ ├── https-prompt.png │ │ ├── https-url.png │ │ ├── keys-1.jpg │ │ ├── keys-2.jpg │ │ ├── keys-2b.jpg │ │ ├── keys-2c.jpg │ │ ├── keys-3.jpg │ │ ├── nb-unsubscribe.png │ │ ├── notify-button.jpg │ │ ├── safari-1.jpg │ │ ├── safari-2.jpg │ │ ├── safari-3.jpg │ │ ├── safari-4.jpg │ │ ├── safari-https.jpg │ │ ├── safari-prompt.jpg │ │ ├── safari-push.jpg │ │ ├── safari-push.png │ │ ├── test.jpg │ │ ├── web-push.jpg │ │ ├── welcome-notification.jpg │ │ └── widget.jpg │ ├── index.html │ └── javascript │ ├── semantic-ui.js │ └── site-admin.js └── v3 ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── build_release.sh ├── index.php ├── onesignal-admin ├── images │ └── onesignal.svg ├── onesignal-admin.css ├── onesignal-admin.js └── onesignal-admin.php ├── onesignal-helpers.php ├── onesignal-init.php ├── onesignal-metabox ├── onesignal-metabox.css ├── onesignal-metabox.js └── onesignal-metabox.php └── onesignal-notification.php /.github/ISSUE_TEMPLATE/ask-question.yml: -------------------------------------------------------------------------------- 1 | name: 🙋 Ask a question 2 | description: Tell us what's on your mind 3 | title: "[question]: " 4 | labels: ["Question"] 5 | 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | Having issues integrating the plugin? 11 | - type: textarea 12 | id: question 13 | attributes: 14 | label: How can we help? 15 | description: Specific question regarding integrating this plugin. 16 | placeholder: How do I...? 17 | validations: 18 | required: true 19 | - type: checkboxes 20 | id: terms 21 | attributes: 22 | label: Code of Conduct 23 | description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/OneSignal/OneSignal-WordPress-Plugin/blob/main/CONTRIBUTING.md) 24 | options: 25 | - label: I agree to follow this project's Code of Conduct 26 | required: true 27 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report.yml: -------------------------------------------------------------------------------- 1 | name: 🪳 Bug report 2 | description: File a bug report 3 | title: "[Bug]: " 4 | labels: ["Bug"] 5 | 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | Thanks for taking the time to fill out this bug report! 11 | - type: textarea 12 | id: what-happened 13 | attributes: 14 | label: What happened? 15 | description: Provide a thorough description of whats going on. 16 | placeholder: The latest version of the plugin causes a runtime error. 17 | validations: 18 | required: true 19 | - type: input 20 | id: wp-version 21 | attributes: 22 | label: Wordpress version 23 | description: What version of Wordpress are you running? 24 | placeholder: 6.0.2 25 | validations: 26 | required: true 27 | - type: input 28 | id: plugin-version 29 | attributes: 30 | label: OneSignal Plugin version 31 | description: What version of the plugin are you running? 32 | placeholder: 2.2.7 33 | validations: 34 | required: true 35 | - type: textarea 36 | id: reproduction-steps 37 | attributes: 38 | label: Steps to reproduce? 39 | description: Provide as much detail as posible to reproduce the issue. 40 | placeholder: | 41 | 1. Install and set up the plugin (version X.Y.Z), etc... 42 | 2. Visit website 43 | 3. Click on the notification prompt 44 | 4. Note that this causes a runtime error and a failed subscription. 45 | render: Markdown 46 | validations: 47 | required: true 48 | - type: textarea 49 | id: what-are-expectations 50 | attributes: 51 | label: What did you expect to happen? 52 | description: Also tell us, what did you expect to happen? 53 | placeholder: I expected the notification prompt to cause a native permission change in the browser. 54 | validations: 55 | required: true 56 | - type: textarea 57 | id: logs 58 | attributes: 59 | label: Relevant log output 60 | description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. 61 | render: Shell 62 | - type: checkboxes 63 | id: terms 64 | attributes: 65 | label: Code of Conduct 66 | description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/OneSignal/OneSignal-WordPress-Plugin/blob/main/CONTRIBUTING.md) 67 | options: 68 | - label: I agree to follow this project's Code of Conduct 69 | required: true 70 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/general-feedback.yml: -------------------------------------------------------------------------------- 1 | name: 📣 General feedback 2 | description: Tell us what's on your mind 3 | title: "[Feedback]: " 4 | labels: ["Feedback"] 5 | 6 | body: 7 | - type: markdown 8 | attributes: 9 | value: | 10 | Thanks for sharing your valuable feedback! 11 | - type: textarea 12 | id: feedback 13 | attributes: 14 | label: What's on your mind? 15 | description: Feedback regarding this SDK. 16 | placeholder: Share your feedback... 17 | validations: 18 | required: true 19 | - type: checkboxes 20 | id: terms 21 | attributes: 22 | label: Code of Conduct 23 | description: By submitting this issue, you agree to follow our [Code of Conduct](https://github.com/OneSignal/OneSignal-WordPress-Plugin/blob/main/CONTRIBUTING.md) 24 | options: 25 | - label: I agree to follow this project's Code of Conduct 26 | required: true 27 | -------------------------------------------------------------------------------- /.github/os_probot_metadata.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Based on probot-metadata - https://github.com/probot/metadata 3 | */ 4 | const regex = /\n\n/ 5 | 6 | const { Octokit } = require("@octokit/action") 7 | 8 | const octokit = new Octokit() 9 | 10 | module.exports = (context, issue = null) => { 11 | console.log(context) 12 | const prefix = "onesignal-probot" 13 | 14 | if (!issue) issue = context.payload.issue 15 | 16 | return { 17 | async get (key = null) { 18 | let body = issue.body 19 | 20 | if (!body) { 21 | body = (await octokit.issues.get(issue)).data.body || '' 22 | } 23 | 24 | const match = body.match(regex) 25 | 26 | if (match) { 27 | const data = JSON.parse(match[1])[prefix] 28 | return key ? data && data[key] : data 29 | } 30 | }, 31 | 32 | async set (key, value) { 33 | let body = issue.body 34 | let data = {} 35 | 36 | if (!body) body = (await octokit.issues.get(issue)).data.body || '' 37 | 38 | body = body.replace(regex, (_, json) => { 39 | data = JSON.parse(json) 40 | return '' 41 | }) 42 | 43 | if (!data[prefix]) data[prefix] = {} 44 | 45 | if (typeof key === 'object') { 46 | Object.assign(data[prefix], key) 47 | } else { 48 | data[prefix][key] = value 49 | } 50 | 51 | body = `${body}\n\n` 52 | 53 | const [owner, repo] = process.env.GITHUB_REPOSITORY.split("/") 54 | const issue_number = context.payload.issue.number 55 | return octokit.issues.update({ owner, repo, issue_number, body }) 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name-template: $RESOLVED_VERSION 2 | tag-template: $RESOLVED_VERSION 3 | categories: 4 | - title: 🚀 Features 5 | label: Enhancement / Feature 6 | - title: 🐛 Bug Fixes 7 | label: Bug 8 | - title: 🧰 Improvements 9 | label: Improvement 10 | - title: down arrow Dependency Updates 11 | label: Dependencies 12 | change-template: '- $TITLE (#$NUMBER)' 13 | version-resolver: 14 | major: 15 | labels: 16 | - 'major' 17 | minor: 18 | labels: 19 | - 'minor' 20 | patch: 21 | labels: 22 | - 'patch' 23 | default: patch 24 | template: | 25 | ## Other Changes 26 | 27 | $CHANGES 28 | -------------------------------------------------------------------------------- /.github/set_response_times.js: -------------------------------------------------------------------------------- 1 | function calcResponseTimeForIssueCreatedAt(createdAt) { 2 | const issueOpenedDate = new Date(createdAt); 3 | const issueTriagedDate = new Date(); 4 | const businessDaysResponseTime = calcBusinessDaysBetweenDates(issueOpenedDate, issueTriagedDate); 5 | return businessDaysResponseTime; 6 | } 7 | 8 | function calcBusinessDaysBetweenDates(openedDate, triagedDate) { 9 | let differenceInWeeks, responseTime; 10 | if (triagedDate < openedDate) 11 | return -1; // error code if dates transposed 12 | let openedDay = openedDate.getDay(); // day of week 13 | let triagedDay = triagedDate.getDay(); 14 | openedDay = (openedDay == 0) ? 7 : openedDay; // change Sunday from 0 to 7 15 | triagedDay = (triagedDay == 0) ? 7 : triagedDay; 16 | openedDay = (openedDay > 5) ? 5 : openedDay; // only count weekdays 17 | triagedDay = (triagedDay > 5) ? 5 : triagedDay; 18 | // calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000) 19 | differenceInWeeks = Math.floor((triagedDate.getTime() - openedDate.getTime()) / 604800000); 20 | if (openedDay < triagedDay) { //Equal to makes it reduce 5 days 21 | responseTime = (differenceInWeeks * 5) + (triagedDay - openedDay); 22 | } 23 | else if (openedDay == triagedDay) { 24 | responseTime = differenceInWeeks * 5; 25 | } 26 | else { 27 | responseTime = ((differenceInWeeks + 1) * 5) - (openedDay - triagedDay); 28 | } 29 | return (responseTime); 30 | } 31 | 32 | module.exports = async(context, osmetadata) => { 33 | const foundResponseTime = await osmetadata(context).get('response_time_in_business_days'); 34 | if (foundResponseTime) { 35 | const foundString = "already found response time in business days: " + foundResponseTime 36 | console.log(foundString); 37 | return foundString; 38 | } 39 | if (context.payload.comment && context.payload.comment.author_association != "MEMBER" && context.payload.comment.author_association != "OWNER" && context.payload.comment.author_association != "CONTRIBUTOR") { 40 | return; 41 | } 42 | const businessDaysResponseTime = calcResponseTimeForIssueCreatedAt(context.payload.issue.created_at); 43 | console.log("response time in business days: " + businessDaysResponseTime); 44 | const result = osmetadata(context, context.payload.issue).set('response_time_in_business_days', businessDaysResponseTime) 45 | console.log("osmetadata update result: " + result); 46 | return "set response time in business days: " + businessDaysResponseTime; 47 | } 48 | -------------------------------------------------------------------------------- /.github/workflows/Zapier.yml: -------------------------------------------------------------------------------- 1 | # This is an action to close asana tasks that were generated by Github issues 2 | 3 | name: Zapier web hook 4 | 5 | # Controls when the workflow will run 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the "main" branch 8 | issues: 9 | types: [closed] 10 | 11 | permissions: 12 | issues: read 13 | 14 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 15 | jobs: 16 | # This workflow contains a single job called "build" 17 | build: 18 | # The type of runner that the job will run on 19 | runs-on: ubuntu-latest 20 | 21 | # Steps represent a sequence of tasks that will be executed as part of the job 22 | steps: 23 | # Runs a set of commands using the runners shell 24 | - name: Call Zapier web hook to close Asana task 25 | if: ${{ !github.event.issue.pull_request }} 26 | env: 27 | ISSUE_TITLE: ${{ github.event.issue.title }} 28 | run: | 29 | curl --location --request POST 'https://hooks.zapier.com/hooks/catch/12728683/b7009qc/' \ 30 | --header 'Content-Type: application/json' \ 31 | --header 'Accept: application/json' \ 32 | --data-raw '{ 33 | "task_name" : "$ISSUE_TITLE" 34 | }' 35 | -------------------------------------------------------------------------------- /.github/workflows/project.yml: -------------------------------------------------------------------------------- 1 | name: Add issues to project 2 | 3 | on: 4 | issues: 5 | types: 6 | - opened 7 | 8 | jobs: 9 | add-to-project: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Add issue to project 13 | uses: actions/add-to-project@v1.0.2 14 | with: 15 | # SDK Web Project 16 | project-url: https://github.com/orgs/OneSignal/projects/9 17 | github-token: ${{ secrets.GH_PROJECTS_TOKEN }} 18 | -------------------------------------------------------------------------------- /.github/workflows/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name: Release Drafter 2 | 3 | on: 4 | push: 5 | # branches to consider in the event; optional, defaults to all 6 | branches: 7 | - main 8 | # pull_request event is required only for autolabeler 9 | pull_request: 10 | # Only following types are handled by the action, but one can default to all as well 11 | types: [opened, reopened, synchronize] 12 | # pull_request_target event is required for autolabeler to support PRs from forks 13 | # pull_request_target: 14 | # types: [opened, reopened, synchronize] 15 | 16 | permissions: 17 | contents: read 18 | 19 | jobs: 20 | update_release_draft: 21 | permissions: 22 | # write permission is required to create a github release 23 | contents: write 24 | # write permission is required for autolabeler 25 | # otherwise, read permission is required at least 26 | pull-requests: write 27 | runs-on: ubuntu-latest 28 | steps: 29 | # (Optional) GitHub Enterprise requires GHE_HOST variable set 30 | #- name: Set GHE_HOST 31 | # run: | 32 | # echo "GHE_HOST=${GITHUB_SERVER_URL##https:\/\/}" >> $GITHUB_ENV 33 | 34 | # Drafts your next Release notes as Pull Requests are merged into "master" 35 | - uses: release-drafter/release-drafter@v5 36 | # (Optional) specify config name to use, relative to .github/. Default: release-drafter.yml 37 | # with: 38 | # config-name: my-config.yml 39 | # disable-autolabeler: true 40 | env: 41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 42 | -------------------------------------------------------------------------------- /.github/workflows/set_response_time.yml: -------------------------------------------------------------------------------- 1 | name: Set Response Time 2 | on: 3 | issue_comment: 4 | types: 5 | - created 6 | issues: 7 | types: 8 | - closed 9 | jobs: 10 | calculate: 11 | name: set reponse time for the issue 12 | if: github.event.issue.pull_request == null 13 | runs-on: ubuntu-latest 14 | permissions: 15 | issues: write 16 | steps: 17 | - uses: actions/checkout@v3 18 | with: 19 | token: ${{ secrets.GITHUB_TOKEN }} 20 | - run: npm install @octokit/action 21 | - uses: actions/github-script@v6 22 | id: set-time 23 | with: 24 | result-encoding: string 25 | script: | 26 | const os_probot_metadata = require('./.github/os_probot_metadata.js') 27 | const set_response_time = require('./.github/set_response_times.js') 28 | return await set_response_time(context, os_probot_metadata) 29 | env: 30 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 31 | - name: Get result 32 | run: echo "${{steps.set-time.outputs.result}}" >> $GITHUB_STEP_SUMMARY 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ChromePhp.php 2 | onesignal-free-web-push-notifications.zip 3 | views/images/settings/ParseToOneSignal.png 4 | .vscode/ 5 | 6 | .map 7 | **/*.map 8 | onesignal-free-push-notifications.zip 9 | 10 | ### JetBrains template 11 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio 12 | 13 | *.iml 14 | 15 | ## Directory-based project format: 16 | .idea/ 17 | # if you remove the above rule, at least ignore the following: 18 | 19 | # User-specific stuff: 20 | # .idea/workspace.xml 21 | # .idea/tasks.xml 22 | # .idea/dictionaries 23 | 24 | # Sensitive or high-churn files: 25 | # .idea/dataSources.ids 26 | # .idea/dataSources.xml 27 | # .idea/sqlDataSources.xml 28 | # .idea/dynamic.xml 29 | # .idea/uiDesigner.xml 30 | 31 | # Gradle: 32 | # .idea/gradle.xml 33 | # .idea/libraries 34 | 35 | # Mongo Explorer plugin: 36 | # .idea/mongoSettings.xml 37 | 38 | ## File-based project format: 39 | *.ipr 40 | *.iws 41 | 42 | ## Plugin-specific files: 43 | 44 | # IntelliJ 45 | /out/ 46 | 47 | # mpeltonen/sbt-idea plugin 48 | .idea_modules/ 49 | 50 | # JIRA plugin 51 | atlassian-ide-plugin.xml 52 | 53 | # Crashlytics plugin (for Android Studio and IntelliJ) 54 | com_crashlytics_export_strings.xml 55 | crashlytics.properties 56 | crashlytics-build.properties 57 | 58 | # Created by .ignore support plugin (hsz.mobi) 59 | 60 | .DS_Store 61 | 62 | onesignal-extra.php 63 | 64 | docker-instance-files/* 65 | # Expection to the rule as we need this files to modify plugin upload limits 66 | !uploads.ini 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | OneSignal WordPress Push Notification Plugin 2 | ==================================== 3 | 4 | OneSignal is a push notification service for web and mobile apps. This plugin makes it easy to integrate your WordPress site with OneSignal Push Notifications. 5 | 6 | - Download and install from the [WordPress Plugin Directory](https://wordpress.org/plugins/onesignal-free-web-push-notifications/) -------------------------------------------------------------------------------- /build_release.sh: -------------------------------------------------------------------------------- 1 | WORDPRESS_GIT_SRC_PATH="." 2 | DESTINATION_PATH="../onesignal-free-web-push-notifications/trunk/" 3 | RELEASE_ARCHIVE_FILENAME="onesignal-free-web-push-notifications.zip" 4 | 5 | # Prevent accidental rm -rf issues if running as root 6 | if (( EUID == 0 )); then 7 | echo "Please do not run this script as root for removing directory safety reasons." 8 | exit 1 9 | fi 10 | 11 | # Using exclude .* excludes dot files and dot directories like .git, .vscode 12 | if [[ $DESTINATION_PATH != *onesignal-free-web-push-notifications/trunk/ ]]; then 13 | echo "Script was going to remove ${DESTINATION_PATH}, but quitting because destination path unexpectedly does not end in ...onesignal-free-web-push-notifications/trunk/. Exiting to prevent removing unexpected directory." 14 | exit 1 15 | fi 16 | 17 | echo "Building Release Version of OneSignal WordPress Plugin" 18 | echo "──────────────────────────────────────────────────────" 19 | 20 | echo "Removing destination folder '${DESTINATION_PATH}'." 21 | rm -rf $DESTINATION_PATH 22 | 23 | echo "Creating new empty destination folder '${DESTINATION_PATH}'." 24 | mkdir -p $DESTINATION_PATH 25 | 26 | # The --delete option remove files from destination that are not present in source 27 | exclude_options=( 28 | "--exclude=.git/" 29 | "--exclude=.env" 30 | "--exclude=.gitignore" 31 | "--exclude=.github" 32 | "--exclude=.vscode/" 33 | "--exclude=build_release.sh" 34 | "--exclude=*.zip" 35 | "--exclude=onesignal-free-web-push-notifications" 36 | "--exclude=onesignal-free-web-push-notifications.zip" 37 | "--exclude=CONTRIBUTING.md" 38 | "--exclude=LICENSE" 39 | "--exclude=docker*" 40 | "--exclude=PluginDevDockerUsage.md" 41 | "--exclude=README.md" 42 | "--exclude=index.php" 43 | "--exclude=views/css/*.scss" 44 | "--exclude=views/css/callout.css" 45 | "--exclude=views/css/link.css" 46 | "--exclude=views/css/link.css" 47 | "--exclude=views/css/semantic-ui" 48 | ) 49 | rsync --archive --delete "${exclude_options[@]}" $WORDPRESS_GIT_SRC_PATH/ $DESTINATION_PATH 50 | 51 | # Add new unversioned directories to SVN 52 | svn status $DESTINATION_PATH | grep "^\?" | awk '{print $2}' | xargs -I {} svn add {} 53 | 54 | echo "Creating archive of release contents as '${RELEASE_ARCHIVE_FILENAME}' in source directory '${WORDPRESS_GIT_SRC_PATH}'." 55 | cd $WORDPRESS_GIT_SRC_PATH 56 | zip -qr -x ".*" -x="build_release.sh" -x="*.zip" -x="onesignal-free-web-push-notifications" ${RELEASE_ARCHIVE_FILENAME} ./* 57 | cd - 58 | -------------------------------------------------------------------------------- /onesignal.php: -------------------------------------------------------------------------------- 1 | id === 'plugins') { 71 | echo '
72 |

OneSignal Migration Needed: All OneSignal prompt configurations are moving to OneSignal.com. See the plugin page for more info.

73 |
'; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /sdk_files/OneSignalSDKWorker.js: -------------------------------------------------------------------------------- 1 | importScripts("https://cdn.onesignal.com/sdks/web/v16/OneSignalSDK.sw.js"); 2 | -------------------------------------------------------------------------------- /sdk_files/OneSignalSDKWorker.js.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /sdk_files/amp-permission-dialog.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /sdk_files/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /sdk_files/push/onesignal/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /v2/.env: -------------------------------------------------------------------------------- 1 | CONTAINER=wordpress 2 | WORDPRESS_HTTP_PORT=8000 -------------------------------------------------------------------------------- /v2/.gitignore: -------------------------------------------------------------------------------- 1 | ChromePhp.php 2 | onesignal-free-web-push-notifications.zip 3 | views/images/settings/ParseToOneSignal.png 4 | .vscode/ 5 | 6 | .map 7 | **/*.map 8 | onesignal-free-push-notifications.zip 9 | 10 | ### JetBrains template 11 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio 12 | 13 | *.iml 14 | 15 | ## Directory-based project format: 16 | .idea/ 17 | # if you remove the above rule, at least ignore the following: 18 | 19 | # User-specific stuff: 20 | # .idea/workspace.xml 21 | # .idea/tasks.xml 22 | # .idea/dictionaries 23 | 24 | # Sensitive or high-churn files: 25 | # .idea/dataSources.ids 26 | # .idea/dataSources.xml 27 | # .idea/sqlDataSources.xml 28 | # .idea/dynamic.xml 29 | # .idea/uiDesigner.xml 30 | 31 | # Gradle: 32 | # .idea/gradle.xml 33 | # .idea/libraries 34 | 35 | # Mongo Explorer plugin: 36 | # .idea/mongoSettings.xml 37 | 38 | ## File-based project format: 39 | *.ipr 40 | *.iws 41 | 42 | ## Plugin-specific files: 43 | 44 | # IntelliJ 45 | /out/ 46 | 47 | # mpeltonen/sbt-idea plugin 48 | .idea_modules/ 49 | 50 | # JIRA plugin 51 | atlassian-ide-plugin.xml 52 | 53 | # Crashlytics plugin (for Android Studio and IntelliJ) 54 | com_crashlytics_export_strings.xml 55 | crashlytics.properties 56 | crashlytics-build.properties 57 | 58 | # Created by .ignore support plugin (hsz.mobi) 59 | 60 | .DS_Store 61 | 62 | onesignal-extra.php 63 | 64 | docker-instance-files/* 65 | # Expection to the rule as we need this files to modify plugin upload limits 66 | !uploads.ini -------------------------------------------------------------------------------- /v2/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to the OneSignal Wordpress Plugin 2 | 3 | :+1::tada: First off, thanks for taking the time to contribute! :tada::+1: 4 | 5 | ### How to Contribute 6 | We love the open source community and enjoy the support and contributions of many of our users. We ask that any potential contributors to the plugin follow the following guidelines: 7 | 8 | If your proposed contribution is a small bug fix, please feel free to create your own fork of the repository and create a pull request. 9 | 10 | If your contribution would _break_ or _change_ the functionality of the plugin, please reach out to us before you put in a lot of effort into a change we may not be able to use. We try our best to make sure that the plugin remains stable so that developers do not have to continually change their code, however some breaking changes _are_ desirable, so please get in touch to discuss your idea before you put in a lot of effort. 11 | 12 | #### Before Submitting A Bug Report 13 | Before creating bug reports, please check this list of steps to follow. 14 | 15 | 1. Make sure that you are actually encountering an _issue_ and not a _question_. If you simply have a question about the plugin, we would be more than happy to assist you in our Support section on the web (https://www.onesignal.com - click the Message button at the bottom right) 16 | 2. Please make sure to [include as many details as possible](#how-do-i-submit-a-good-bug-report) 17 | 18 | > **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. 19 | 20 | 21 | #### How Do I Submit a Good Bug Report 22 | * **Use a clear and descriptive title** for the issue to identify the problem. 23 | * **Include Reproducibility** It is nearly always a good idea to include steps to reproduct the issue. If you cannot reliably reproduce the issue yourself, that's ok, but reproducible steps help best. 24 | * **Describe your environment**, tell us what version of the Unity OneSignal Plugin you are using, what version of Wordpress the issue occurs on, related code samples, and so on. 25 | * **Include log output/error messages** If your issue involves a crash/exception, ***PLEASE*** post the log output to help us identify the root issue. 26 | -------------------------------------------------------------------------------- /v2/LICENSE: -------------------------------------------------------------------------------- 1 | Modified MIT License 2 | 3 | Copyright 2022 OneSignal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | 1. The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | 2. All copies of substantial portions of the Software may only be used in connection 16 | with services provided by OneSignal. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | -------------------------------------------------------------------------------- /v2/PluginDevDockerUsage.md: -------------------------------------------------------------------------------- 1 | ## Setup 2 | 1. Run `./docker.sh` 3 | 2. Go to http://localhost:8000/ in your browser. 4 | 3. Follow the WordPress page's setup guide create your user 5 | 4. After logging in to the WordPress admin go to "Plugins" > "Add New" > "Upload Plugin" 6 | 5. Zip up all file in this directory expect "docker-instance-files" 7 | 6. Upload this on the page from step 4. above 8 | 7. Make sure to active the plugin on the Plugins page 9 | 8. Your done, happy editing! 10 | 11 | ## Editing 12 | 1. Test changes by editing files under docker-instance-files/plugins/ 13 | - Modify these directly on your host machine, changes take effect immediately! 14 | 2. Make sure to get your changes in to the original source to commit 15 | - Careful not to re-upload your plugin, it will overwrite files docker-instance-files/plugins/ 16 | -------------------------------------------------------------------------------- /v2/build_release.sh: -------------------------------------------------------------------------------- 1 | WORDPRESS_GIT_SRC_PATH="." 2 | DESTINATION_PATH="../onesignal-free-web-push-notifications/trunk/" 3 | RELEASE_ARCHIVE_FILENAME="onesignal-free-web-push-notifications.zip" 4 | 5 | # Prevent accidental rm -rf issues if running as root 6 | if (( EUID == 0 )); then 7 | echo "Please do not run this script as root for removing directory safety reasons." 8 | exit 1 9 | fi 10 | 11 | # Using exclude .* excludes dot files and dot directories like .git, .vscode 12 | if [[ $DESTINATION_PATH != *onesignal-free-web-push-notifications/trunk/ ]]; then 13 | echo "Script was going to remove ${DESTINATION_PATH}, but quitting because destination path unexpectedly does not end in ...onesignal-free-web-push-notifications/trunk/. Exiting to prevent removing unexpected directory." 14 | exit 1 15 | fi 16 | 17 | echo "Building Release Version of OneSignal WordPress Plugin" 18 | echo "──────────────────────────────────────────────────────" 19 | 20 | echo "Removing destination folder '${DESTINATION_PATH}'." 21 | rm -rf $DESTINATION_PATH 22 | 23 | echo "Creating new empty destination folder '${DESTINATION_PATH}'." 24 | mkdir -p $DESTINATION_PATH 25 | 26 | # The --delete option remove files from destination that are not present in source 27 | exclude_options=( 28 | "--exclude=.git/" 29 | "--exclude=.env" 30 | "--exclude=.gitignore" 31 | "--exclude=.github" 32 | "--exclude=.vscode/" 33 | "--exclude=build_release.sh" 34 | "--exclude=*.zip" 35 | "--exclude=onesignal-free-web-push-notifications" 36 | "--exclude=CONTRIBUTING.md" 37 | "--exclude=LICENSE" 38 | "--exclude=docker*" 39 | "--exclude=PluginDevDockerUsage.md" 40 | "--exclude=README.md" 41 | "--exclude=index.php" 42 | "--exclude=views/css/*.scss" 43 | "--exclude=views/css/callout.css" 44 | "--exclude=views/css/link.css" 45 | "--exclude=views/css/link.css" 46 | "--exclude=views/css/semantic-ui" 47 | ) 48 | rsync --archive --delete "${exclude_options[@]}" $WORDPRESS_GIT_SRC_PATH/ $DESTINATION_PATH 49 | 50 | echo "Creating archive of release contents as '${RELEASE_ARCHIVE_FILENAME}' in source directory '${WORDPRESS_GIT_SRC_PATH}'." 51 | cd $WORDPRESS_GIT_SRC_PATH 52 | zip -qr -x ".*" -x="build_release.sh" -x="*.zip" -x="onesignal-free-web-push-notifications" ${RELEASE_ARCHIVE_FILENAME} ./* 53 | cd - 54 | -------------------------------------------------------------------------------- /v2/complete-migration.php: -------------------------------------------------------------------------------- 1 | '/^app_id/', 16 | 'General Options' => '/^(chrome_auto_|persist_|default_|utm_additional_)/', 17 | 'Slide Prompt Customizations' => '/^(prompt_customize_|prompt_action_|prompt_accept_|prompt_cancel_|prompt_auto_register)/', 18 | 'Subscription Bell Customizations' => '/^notifyButton_/', 19 | 'Welcome Notification Customizations' => '/^(send_welcome_|welcome_)/', 20 | 'Plugin Settings & HTTP Setup - NO LONGER REQUIRED / DEPRECATED' => '/^(allowed_custom_|customize_http_|custom_manifest_|gcm_|is_site_|notification_on_|notification_title|onesignal_sw_|origin|prompt_auto_accept_title|prompt_example_|prompt_site_name|send_to_mobile_|showNotification|show_gcm_|how_notification_send_|subdomain|use_)/' 21 | ]; 22 | 23 | // sort settings into the defined groups 24 | foreach ($settings as $key => $value) { 25 | foreach ($groups as $group_name => $pattern) { 26 | if (preg_match($pattern, $key)) { 27 | $grouped_settings[$group_name][$key] = is_array($value) ? json_encode($value) : $value; 28 | break; 29 | } 30 | } 31 | } 32 | 33 | // create txt file with main title, group names, and settings. 34 | $txt_data = "OneSignal Push Configuration Export\n\n\n"; 35 | 36 | foreach ($groups as $group_name => $pattern) { 37 | if (isset($grouped_settings[$group_name])) { 38 | $txt_data .= "=== $group_name ===\n"; 39 | 40 | foreach ($grouped_settings[$group_name] as $key => $value) { 41 | $txt_data .= "$key: $value\n"; 42 | } 43 | 44 | $txt_data .= "\n\n"; 45 | } 46 | } 47 | 48 | header('Content-Type: text/plain'); 49 | header('Content-Disposition: attachment; filename="onesignal-configuration-export.txt"'); 50 | header('Content-Length: ' . strlen($txt_data)); 51 | header('Pragma: public'); 52 | 53 | echo $txt_data; 54 | exit; 55 | } 56 | } 57 | 58 | add_action('admin_init', 'onesignal_handle_export'); 59 | -------------------------------------------------------------------------------- /v2/css/onsignal-amp-style.css: -------------------------------------------------------------------------------- 1 | /* 2 | * The file contains CSS for Subscribe and Unsubscribe button on AMP endpoints which will be enqued only at AMP endpoints. 3 | * 4 | /* 5 | Created on : Jul 14, 2021, 11:57:12 PM 6 | Author : milind 7 | */ 8 | 9 | amp-web-push-widget button.subscribe.subscribe, amp-web-push-widget button.unsubscribe { 10 | margin: 0; 11 | padding: 0; 12 | border: 0; 13 | cursor: pointer; 14 | outline: none; 15 | position: fixed; 16 | bottom: 20px; 17 | right: 20px; 18 | z-index: 999; 19 | background-color: transparent; 20 | height: 48px; 21 | width: 48px; 22 | } 23 | 24 | amp-web-push-widget button.unsubscribe{ 25 | opacity: 0.5; 26 | } 27 | 28 | amp-web-push-widget button.unsubscribe:hover { 29 | opacity: 1; 30 | } 31 | 32 | amp-web-push-widget button.subscribe svg.onesignal-bell-svg, amp-web-push-widget button.unsubscribe svg.onesignal-bell-svg { 33 | width: 100%; 34 | height: 100%; 35 | overflow: visible; 36 | } 37 | 38 | amp-web-push-widget button.subscribe svg.onesignal-bell-svg .background, amp-web-push-widget button.unsubscribe svg.onesignal-bell-svg .background { 39 | fill: #e54b4d; 40 | } 41 | 42 | amp-web-push-widget button.subscribe svg.onesignal-bell-svg .foreground, amp-web-push-widget button.unsubscribe svg.onesignal-bell-svg .foreground { 43 | fill: #ffffff; 44 | } 45 | 46 | amp-web-push-widget button.subscribe svg.onesignal-bell-svg .stroke, amp-web-push-widget button.unsubscribe svg.onesignal-bell-svg .stroke { 47 | fill: none; 48 | stroke: #ffffff; 49 | stroke-width: 3px; 50 | stroke-miterlimit: 10; 51 | } 52 | 53 | /* Tooltip text */ 54 | amp-web-push-widget button.subscribe .tooltiptext, amp-web-push-widget button.unsubscribe .tooltiptext { 55 | visibility: hidden; 56 | min-width: 350px; 57 | background-color: black; 58 | color: #fff; 59 | text-align: center; 60 | padding: 5px 0; 61 | border-radius: 6px; 62 | top: 5px; 63 | right: 120%; 64 | position: absolute; 65 | z-index: 1; 66 | font-size: 1em; 67 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; 68 | } 69 | 70 | amp-web-push-widget button.subscribe .tooltiptext::after, amp-web-push-widget button.unsubscribe .tooltiptext::after { 71 | content: ""; 72 | position: absolute; 73 | top: 50%; 74 | left: 100%; 75 | margin-top: -5px; 76 | border-width: 5px; 77 | border-style: solid; 78 | border-color: transparent transparent transparent black; 79 | } 80 | 81 | amp-web-push-widget button.subscribe:hover .tooltiptext, amp-web-push-widget button.unsubscribe:hover .tooltiptext { 82 | visibility: visible; 83 | } 84 | -------------------------------------------------------------------------------- /v2/docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.3' 2 | 3 | services: 4 | db: 5 | image: mysql:8.0 6 | volumes: 7 | - db_data:/var/lib/mysql 8 | restart: always 9 | environment: 10 | MYSQL_ROOT_PASSWORD: somewordpress 11 | MYSQL_DATABASE: wordpress 12 | MYSQL_USER: wordpress 13 | MYSQL_PASSWORD: wordpress 14 | 15 | wordpress: 16 | depends_on: 17 | - db 18 | image: wordpress:6.5 19 | ports: 20 | - "${WORDPRESS_HTTP_PORT}:80" 21 | restart: always 22 | container_name: "${CONTAINER}" 23 | environment: 24 | WORDPRESS_DB_HOST: db:3306 25 | WORDPRESS_DB_USER: wordpress 26 | WORDPRESS_DB_PASSWORD: wordpress 27 | WORDPRESS_DB_NAME: wordpress 28 | WORDPRESS_DEBUG: 1 29 | working_dir: /var/www/html 30 | volumes: 31 | - ./docker-instance-files/plugins:/var/www/html/wp-content/plugins 32 | - ./docker-instance-files/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini 33 | volumes: 34 | db_data: {} 35 | -------------------------------------------------------------------------------- /v2/docker-instance-files/uploads.ini: -------------------------------------------------------------------------------- 1 | file_uploads = On 2 | memory_limit = 64M 3 | upload_max_filesize = 64M 4 | post_max_size = 64M 5 | max_execution_time = 600 -------------------------------------------------------------------------------- /v2/docker.sh: -------------------------------------------------------------------------------- 1 | # The purpose of this script is to provide write access to the wordpress plugins folder for 2 | # both the host machine and the docker container itself. 3 | # This makes plugin testing much easy as the the file in the plugins folder can be directly 4 | # edited on the host machine's IDE. 5 | # This means no more needing to copy files from host->container or using vim in the container! 6 | 7 | export $(xargs < .env) 8 | 9 | USER_ID=`id -u` 10 | GROUP_ID=`id -g` 11 | 12 | # Starting docker images without allowing them to execute anything yet. 13 | # This is so we can correctly set the permission below before it starts creating files 14 | echo "Starting $CONTAINER in --no-start mode" 15 | docker-compose up --no-start $CONTAINER 16 | docker-compose up --detach $CONTAINER 17 | 18 | echo "Wait for all wordpress files to be comes available" 19 | docker exec -ti $CONTAINER /bin/bash -c 'until [[ -f .htaccess ]]; do sleep 1; done' 20 | 21 | echo "Allowing Wordpress container to modify any files in the docker-instance-file/plugins folder" 22 | docker exec -ti $CONTAINER /bin/bash -c "usermod -u ${USER_ID} www-data" 23 | docker exec -ti $CONTAINER /bin/bash -c "groupmod -g ${GROUP_ID} www-data" 24 | echo "Restart container for permsision settings to take effect" 25 | docker container restart $CONTAINER 26 | 27 | echo "Updating '/var/www' folder ownership" 28 | docker exec -ti $CONTAINER /bin/bash -c 'chown -R www-data:www-data /var/www' 29 | 30 | echo "Started Scuessfully!" 31 | echo "──────────────────────────────────────────────────────" 32 | 33 | echo "Tailing logs" 34 | docker-compose up -------------------------------------------------------------------------------- /v2/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Generated by OneSignal 7 | 8 | 9 | -------------------------------------------------------------------------------- /v2/notice.js: -------------------------------------------------------------------------------- 1 | jQuery(document).ready(notice); 2 | 3 | var state = { 4 | post_id: ajax_object.post_id, // post id sent from php backend 5 | first_modified: undefined, // when the post was first modified 6 | started: false, // post notification requests started 7 | interval: undefined, // global interval for reattempting requests 8 | interval_count: 0, // how many times has the request been attempted 9 | status: undefined // whether the post is scheduled or published 10 | } 11 | 12 | function notice() { 13 | if (!isWpCoreEditorDefined()) { 14 | return; 15 | } 16 | 17 | const editor = wp.data.select("core/editor"); 18 | 19 | /* 20 | * Subscribes function to WP's state-change listener 21 | * - checks change in post modified date 22 | * - triggers interval that checks if recipient meta data available in backend 23 | */ 24 | wp.data.subscribe(() => { 25 | // runs with each change in wp state 26 | const post = editor.getCurrentPost(); 27 | 28 | // runs until post data loads 29 | if (!post || post === {}) { 30 | return; 31 | } 32 | 33 | // post is defined now 34 | if (!state.first_modified) { 35 | // captures last modified date of loaded post 36 | state.first_modified = post.modified; 37 | } 38 | 39 | // latest modified date, status of the post 40 | const { modified, status } = post; 41 | state.status = status; 42 | 43 | // is checked 44 | let send_os_notif; 45 | const htmlElement = jQuery("#send_onesignal_notification")[0]; 46 | 47 | if (!!htmlElement) { 48 | send_os_notif = htmlElement.checked; 49 | } 50 | 51 | // if last modified differs from first modified times, post_modified = true 52 | const post_modified = modified !== state.first_modified; 53 | 54 | const is_published = status === "publish"; 55 | 56 | // if hasn't started, change detected, box checked, and the status is 'publish' 57 | if (!state.started && post_modified && send_os_notif && is_published) { 58 | state.interval = setInterval(get_metadata, 3000); // starts requests 59 | state.started = true; 60 | } 61 | }); 62 | 63 | /* 64 | * Checks if post has meta for "recipients" on server 65 | * - means request to OS has finished 66 | */ 67 | const get_metadata = () => { 68 | const data = { 69 | action: "has_metadata", 70 | post_id: state.post_id 71 | }; 72 | 73 | jQuery.get(ajax_object.ajax_url, data, function (response) { 74 | response = JSON.parse(response); 75 | let { status_code, response_body } = response; 76 | 77 | if (window.DEBUG_MODE) { 78 | console.log(response); 79 | } 80 | 81 | const is_status_empty = status_code.length == 0; 82 | 83 | if (!is_status_empty) { 84 | status_code = parseInt(status_code); 85 | 86 | // status 0: HTTP request failed 87 | if (status_code === 0) { 88 | error_notice("OneSignal Push: request failed with status code 0. " + response_body); 89 | reset_state(); 90 | return; 91 | } 92 | 93 | // 400 & 500 level errors 94 | if (status_code >= 400) { 95 | if (!response_body) { 96 | error_notice( 97 | "OneSignal Push: there was a " + 98 | status_code + 99 | " error sending your notification" 100 | ); 101 | } else { 102 | error_notice("OneSignal Push: there was a " + status_code + " error sending your notification: " + response_body); 103 | } 104 | 105 | reset_state(); 106 | return; 107 | } 108 | 109 | show_notice(); 110 | reset_state(); 111 | } 112 | }); 113 | 114 | // try for 1 minute (each interval = 3s) 115 | if (state.interval_count > 20) { 116 | error_notice( 117 | "OneSignal Push: Did not receive a response status from last notification sent" 118 | ); 119 | reset_state(); 120 | } 121 | 122 | state.interval_count += 1; 123 | }; 124 | 125 | /* 126 | * Gets recipient count and shows notice 127 | */ 128 | const show_notice = () => { 129 | var delivery_link_text = ""; 130 | 131 | if (state.status === "publish") { 132 | var notice_text = "OneSignal Push: Successfully sent a notification."; 133 | delivery_link_text = " Go to your app's Delivery tab to check sent messages: https://dashboard.onesignal.com/apps/"; 134 | } else if (state.status === "future") { 135 | var notice_text = "OneSignal Push: Successfully scheduled a notification."; 136 | } 137 | 138 | wp.data 139 | .dispatch("core/notices") 140 | .createNotice( 141 | "info", 142 | notice_text + delivery_link_text, 143 | { 144 | id: 'onesignal-notice', 145 | isDismissible: true 146 | } 147 | ); 148 | }; 149 | 150 | const error_notice = error => { 151 | wp.data.dispatch("core/notices").createNotice("error", error, { 152 | isDismissible: true, 153 | id: 'onesignal-error' 154 | }); 155 | }; 156 | 157 | const reset_state = () => { 158 | clearInterval(state.interval); 159 | state.interval = undefined; 160 | state.interval_count = 0; 161 | state.started = false; 162 | state.first_modified = undefined; 163 | } 164 | }; 165 | 166 | const isWpCoreEditorDefined = () => { 167 | var unloadable = ""; // variable name that couldn't be loaded 168 | if (!wp || !wp.data || !wp.data.select("core/editor")) { 169 | if (!wp) { 170 | unloadable = "wp"; 171 | } else if (!wp.data) { 172 | unloadable = "wp.data"; 173 | } else if (!wp.data.select("core/editor")) { 174 | unloadable = 'wp.data.select("core/editor")'; 175 | } 176 | 177 | console.warn( 178 | `OneSignal Push: could not load ${unloadable}. https:\/\/bit.ly/2F4G0bt` 179 | ); 180 | return false; 181 | } else { 182 | return true; 183 | } 184 | }; 185 | 186 | /** 187 | * - use the debug method in the console to show data about the request 188 | * - works in Gutenberg editor 189 | * 190 | * returns an object in the format 191 | * { status : "200", 192 | * recipients : "1374", 193 | * response_body : [] 194 | * } 195 | */ 196 | window.OneSignal = { 197 | debug: () => { 198 | window.DEBUG_MODE = window.DEBUG_MODE ? !window.DEBUG_MODE : true; 199 | notice(); 200 | } 201 | }; 202 | -------------------------------------------------------------------------------- /v2/onesignal-utils.php: -------------------------------------------------------------------------------- 1 | = PHP 5.4, ENT_HTML401 | ENT_QUOTES will correctly decode most entities including both double and single quotes. 8 | In PHP 5.3, ENT_HTML401 does not exist, so we have to use `str_replace("'","'", $value)` before feeding it to html_entity_decode(). */ 9 | public static function decode_entities($string) { 10 | $HTML_ENTITY_DECODE_FLAGS = ENT_QUOTES; 11 | if (defined('ENT_HTML401')) { 12 | $HTML_ENTITY_DECODE_FLAGS = ENT_HTML401 | $HTML_ENTITY_DECODE_FLAGS; 13 | } 14 | return html_entity_decode(str_replace([''', ''', ''', '"'], '\'', $string), $HTML_ENTITY_DECODE_FLAGS, 'UTF-8'); 15 | } 16 | 17 | public static function url_contains_parameter($text) { 18 | if (array_key_exists('REQUEST_URI', $_SERVER)) { 19 | return strpos(sanitize_text_field($_SERVER['REQUEST_URI']), $text); 20 | } 21 | } 22 | 23 | public static function html_safe($string) { 24 | $HTML_ENTITY_DECODE_FLAGS = ENT_QUOTES; 25 | if (defined('ENT_HTML401')) { 26 | $HTML_ENTITY_DECODE_FLAGS = ENT_HTML401 | $HTML_ENTITY_DECODE_FLAGS; 27 | } 28 | return htmlspecialchars($string, $HTML_ENTITY_DECODE_FLAGS, 'UTF-8'); 29 | } 30 | 31 | public static function contains($string, $substring) { 32 | return strpos($string, $substring) !== false; 33 | } 34 | 35 | /** 36 | * Describes whether the user can view "OneSignal Push" on the left sidebar. 37 | */ 38 | public static function can_modify_plugin_settings() { 39 | // Only administrators are allowed to do this, see: 40 | // https://codex.wordpress.org/Roles_and_Capabilities#delete_users 41 | return OneSignalUtils::is_admin_user(); 42 | } 43 | 44 | /** 45 | * Describes whether the user can send notifications for a post. 46 | */ 47 | public static function can_send_notifications() { 48 | // Only administrators are allowed to do this, see: 49 | // https://codex.wordpress.org/Roles_and_Capabilities#delete_users 50 | return current_user_can('publish_posts') || current_user_can('edit_published_posts'); 51 | } 52 | 53 | /** 54 | * To keep the plugin working the same as it was before, only allow administrators to perform important actions. 55 | */ 56 | public static function is_admin_user() { 57 | // Only administrators are allowed to do this, see: 58 | // https://codex.wordpress.org/Roles_and_Capabilities#delete_users 59 | return current_user_can('delete_users'); 60 | } 61 | } -------------------------------------------------------------------------------- /v2/onesignal-widget.php: -------------------------------------------------------------------------------- 1 | 'Subscribe to notifications')); 9 | } 10 | 11 | // Admin editor 12 | function form($instance) { 13 | $title = ! empty( $instance['title'] ) ? $instance['title'] : 'Follow'; 14 | $text = ! empty( $instance['text'] ) ? $instance['text'] : 'Subscribe to notifications'; 15 | ?> 16 |

17 | 18 | 19 | 20 | 21 |

22 | ' . wp_kses_post($instance['text']) . ''; 41 | } 42 | echo wp_kses_post($args['after_widget']); 43 | } 44 | } 45 | 46 | add_action('widgets_init', function(){register_widget("OneSignalWidget");}); 47 | 48 | ?> -------------------------------------------------------------------------------- /v2/views/css/callout.css: -------------------------------------------------------------------------------- 1 | /* 2 | Error: Undefined variable: "$color-teallink". 3 | on line 6 of callouts.scss 4 | 5 | 1: $callout-default-color: #777777; 6 | 2: $callout-primary-color: #428bca; 7 | 3: $callout-success-color: #5cb85c; 8 | 4: $callout-danger-color: #d9534f; 9 | 5: $callout-warning-color: #f0ad4e; 10 | 6: $callout-info-color: $color-teallink; 11 | 7: $callout-padding: 10px; 12 | 8: $callout-width: 4px; 13 | 9: $callout-border-radius: 3px; 14 | 10: 15 | 11: /* 16 | 17 | Backtrace: 18 | callouts.scss:6 19 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/script/tree/variable.rb:49:in `_perform' 20 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/script/tree/node.rb:50:in `perform' 21 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/perform.rb:469:in `visit_variable' 22 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/base.rb:36:in `visit' 23 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/perform.rb:158:in `block in visit' 24 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/stack.rb:79:in `block in with_base' 25 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/stack.rb:115:in `with_frame' 26 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/stack.rb:79:in `with_base' 27 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/perform.rb:158:in `visit' 28 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/base.rb:52:in `block in visit_children' 29 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/base.rb:52:in `map' 30 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/base.rb:52:in `visit_children' 31 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/perform.rb:167:in `block in visit_children' 32 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/perform.rb:179:in `with_environment' 33 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/perform.rb:166:in `visit_children' 34 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/base.rb:36:in `block in visit' 35 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/perform.rb:186:in `visit_root' 36 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/base.rb:36:in `visit' 37 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/perform.rb:157:in `visit' 38 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/visitors/perform.rb:8:in `visit' 39 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/root_node.rb:36:in `css_tree' 40 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/tree/root_node.rb:29:in `render_with_sourcemap' 41 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/engine.rb:378:in `_render_with_sourcemap' 42 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/engine.rb:295:in `render_with_sourcemap' 43 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:490:in `update_stylesheet' 44 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:215:in `block in update_stylesheets' 45 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:209:in `each' 46 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/plugin/compiler.rb:209:in `update_stylesheets' 47 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/plugin.rb:82:in `update_stylesheets' 48 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/exec/sass_scss.rb:364:in `watch_or_update' 49 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/exec/sass_scss.rb:51:in `process_result' 50 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/exec/base.rb:52:in `parse' 51 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/lib/sass/exec/base.rb:19:in `parse!' 52 | /Users/jpang/.rvm/gems/ruby-2.2.1/gems/sass-3.4.18/bin/scss:13:in `' 53 | /Users/jpang/.rvm/gems/ruby-2.2.1/bin/scss:23:in `load' 54 | /Users/jpang/.rvm/gems/ruby-2.2.1/bin/scss:23:in `
' 55 | /Users/jpang/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `eval' 56 | /Users/jpang/.rvm/gems/ruby-2.2.1/bin/ruby_executable_hooks:15:in `
' 57 | */ 58 | body:before{white-space:pre;font-family:monospace;content:"Error:Undefined variable:\"$color-teallink\".\A on line 6 of callouts.scss\A \A 1:$callout-default-color:#777;\A 2:$callout-primary-color:#428bca;\A 3:$callout-success-color:#5cb85c;\A 4:$callout-danger-color:#d9534f;\A 5:$callout-warning-color:#f0ad4e;\A 6:$callout-info-color:$color-teallink;\A 7:$callout-padding:10px;\A 8:$callout-width:4px;\A 9:$callout-border-radius:3px;\A 10:\A 11:/*"} -------------------------------------------------------------------------------- /v2/views/css/callout.scss: -------------------------------------------------------------------------------- 1 | $callout-default-color: #777777; 2 | $callout-primary-color: #428bca; 3 | $callout-success-color: #5cb85c; 4 | $callout-danger-color: #d9534f; 5 | $callout-warning-color: #f0ad4e; 6 | $callout-info-color: #71bec0; 7 | $callout-padding: 1em; 8 | $callout-width: 4px; 9 | $callout-border-radius: 3px; 10 | 11 | $font-sourcesans: "Source Sans Pro", "Helvetica Neue", sans-serif !default; 12 | $font-raleway: "Raleway", sans-serif !default; 13 | 14 | 15 | /* 16 | * Dotted Border - A SASS mixin to help you increase spacing between the dots of border-style:dotted. 17 | * By @florbraz 18 | * Documentation and examples - github.com/florbraz/Dotted-Border-w-custom-spacing-SCSS-Mixin 19 | * V1.0 20 | */ 21 | 22 | @mixin dottedBorder($color: #8f8f8f, $orientation: horizontal, $position: bottom, $spacing: 5px, $size: 1px) { 23 | background-position: $position; 24 | @if $orientation == horizontal { 25 | background-image: linear-gradient(to right, $color $size/$spacing * 100%, rgba(255,255,255,0) 50%); 26 | background-size: $spacing $size; 27 | background-repeat: repeat-x; 28 | } 29 | @else { 30 | background-image: linear-gradient($color $size/$spacing * 100%, rgba(255,255,255,0) 0%); 31 | background-size: $size $spacing; 32 | background-repeat: repeat-y; 33 | } 34 | } 35 | 36 | @mixin callout-link($callout-color, $callout-hover-color) { 37 | a { 38 | @include link( 39 | $font-weight: 500, 40 | $color: $callout-color, 41 | $hover-color: darken($callout-color, 15%) 42 | ); 43 | @include dottedBorder($color: $callout-color, $size: 1px, $spacing: 4px) 44 | } 45 | } 46 | 47 | .callout { 48 | padding: $callout-padding; 49 | margin: 15px 0; 50 | 51 | h3 { 52 | padding: 0; 53 | margin: 0; 54 | margin-bottom: 0.7em; 55 | font-size: 1em; 56 | font-family: $font-sourcesans; 57 | font-weight: 600; 58 | text-transform: uppercase; 59 | letter-spacing: 0.05em; 60 | word-spacing: 0.12em; 61 | } 62 | 63 | p { 64 | font-family: $font-sourcesans; 65 | font-weight: 300; 66 | font-size: 1.05em; 67 | color: inherit; 68 | } 69 | 70 | p:last-child { 71 | margin-bottom: 0; 72 | } 73 | 74 | code { 75 | border-radius: 3px; 76 | } 77 | 78 | & + .callout { 79 | margin-top: -5px; 80 | } 81 | 82 | &.default { 83 | border-left-color: $callout-default-color; 84 | border: 1px solid $callout-default-color; 85 | border-left-width: $callout-width; 86 | border-radius: $callout-border-radius; 87 | background-color: lighten($callout-default-color, 51%); 88 | color: $callout-default-color; 89 | @include callout-link($callout-default-color, lighten($callout-default-color, 51%)); 90 | } 91 | 92 | &.primary { 93 | border-left-color: $callout-primary-color; 94 | border: 1px solid $callout-primary-color; 95 | border-left-width: $callout-width; 96 | border-radius: $callout-border-radius; 97 | color: $callout-primary-color; 98 | background-color: lighten($callout-primary-color, 45%); 99 | @include callout-link($callout-primary-color, lighten($callout-primary-color, 45%)); 100 | } 101 | 102 | &.success { 103 | border-left-color: $callout-success-color; 104 | border: 1px solid $callout-success-color; 105 | border-left-width: $callout-width; 106 | border-radius: $callout-border-radius; 107 | color: $callout-success-color; 108 | background-color: lighten($callout-success-color, 44%); 109 | @include callout-link($callout-success-color, lighten($callout-success-color, 44%)); 110 | } 111 | 112 | &.danger { 113 | border-left-color: $callout-danger-color; 114 | border: 1px solid $callout-danger-color; 115 | border-left-width: $callout-width; 116 | border-radius: $callout-border-radius; 117 | background-color: lighten($callout-danger-color, 40%); 118 | color: $callout-danger-color; 119 | @include callout-link($callout-danger-color, lighten($callout-danger-color, 40%)); 120 | } 121 | 122 | &.warning { 123 | border-left-color: $callout-warning-color; 124 | border: 1px solid $callout-warning-color; 125 | border-left-width: $callout-width; 126 | border-radius: $callout-border-radius; 127 | color: $callout-warning-color; 128 | background-color: lighten($callout-warning-color, 36%); 129 | @include callout-link($callout-warning-color, lighten($callout-warning-color, 36%)); 130 | } 131 | 132 | &.info { 133 | border-left-color: $callout-info-color; 134 | border: 1px solid $callout-info-color; 135 | border-left-width: $callout-width; 136 | border-radius: $callout-border-radius; 137 | color: darken($callout-info-color, 15%); 138 | background-color: lighten($callout-info-color, 39%); 139 | @include callout-link($callout-info-color, lighten($callout-info-color, 39%)); 140 | } 141 | 142 | ul { 143 | li { 144 | strong { 145 | font-weight: 600; 146 | } 147 | } 148 | } 149 | } -------------------------------------------------------------------------------- /v2/views/css/icons.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:'Icons';src:url(../fonts/semantic-ui/icons.eot);src:url(../fonts/semantic-ui/icons.eot?#iefix) format("embedded-opentype"),url(../fonts/semantic-ui/icons.woff2) format("woff2"),url(../fonts/semantic-ui/icons.woff) format("woff"),url(../fonts/semantic-ui/icons.ttf) format("truetype"),url(../fonts/semantic-ui/icons.svg#icons) format("svg");font-style:normal;font-weight:normal;font-variant:normal;text-decoration:inherit;text-transform:none} -------------------------------------------------------------------------------- /v2/views/css/icons.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Icons'; 3 | src: url("../fonts/semantic-ui/icons.eot"); 4 | src: url("../fonts/semantic-ui/icons.eot?#iefix") format('embedded-opentype'), url("../fonts/semantic-ui/icons.woff2") format('woff2'), url("../fonts/semantic-ui/icons.woff") format('woff'), url("../fonts/semantic-ui/icons.ttf") format('truetype'), url("../fonts/semantic-ui/icons.svg#icons") format('svg'); 5 | font-style: normal; 6 | font-weight: normal; 7 | font-variant: normal; 8 | text-decoration: inherit; 9 | text-transform: none; 10 | } -------------------------------------------------------------------------------- /v2/views/css/link.css: -------------------------------------------------------------------------------- 1 | /*# sourceMappingURL=link.css.map */ -------------------------------------------------------------------------------- /v2/views/css/link.scss: -------------------------------------------------------------------------------- 1 | @mixin link($font-family: inherit, $font-size: inherit, $font-weight: inherit, $text-align: center, $border: 0, $color: inherit, $hover-color: $color, $background-color: none, $hover-background-color: $background-color, $active-background-color: $background-color, $padding: 0, $border-radius: 4px, $letter-spacing: initial) { 2 | display: inline; 3 | font-size: $font-size; 4 | font-family: $font-family; 5 | font-weight: $font-weight; 6 | text-align: $text-align; 7 | touch-action: manipulation; 8 | cursor: pointer; 9 | color: $color; 10 | background-color: $background-color; 11 | padding: $padding; 12 | border-radius: $border-radius; 13 | letter-spacing: $letter-spacing; 14 | text-decoration: none; 15 | word-wrap: break-word; 16 | white-space: normal; 17 | 18 | &, 19 | &:active, 20 | &.active { 21 | &:focus, 22 | &.focus {} 23 | } 24 | 25 | &:hover { 26 | color: $hover-color; 27 | background-color: $hover-background-color; 28 | } 29 | 30 | &:active, 31 | &.active { 32 | color: $color; 33 | } 34 | 35 | &[disabled] { 36 | pointer-events: none; 37 | } 38 | 39 | &.disabled, 40 | &[disabled], 41 | fieldset[disabled] & { 42 | cursor: not-allowed; 43 | opacity: .65; 44 | box-shadow: none; 45 | } 46 | 47 | a { 48 | &.disabled, 49 | fieldset[disabled] & { 50 | pointer-events: none; // Future-proof disabling of clicks on `` elements 51 | 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /v2/views/css/lusitana.css: -------------------------------------------------------------------------------- 1 | @font-face{font-family:"Lusitana";src:url(lusitana/Lusitana-Regular-OTF.ttf) format("opentype");font-style:normal;font-weight:normal}@font-face{font-family:"LusitanaBold";src:url(lusitana/Lusitana-Bold-OTF.ttf) format("opentype");font-style:normal;font-weight:normal}@font-face{font-family:"LusitanaItalic";src:url(lusitana/Lusitana-Italic-OTF.ttf) format("opentype");font-style:normal;font-weight:normal}@font-face{font-family:"LusitanaItalicBold";src:url(lusitana/Lusitana-BoldItalic-OTF.ttf) format("opentype");font-style:normal;font-weight:normal} -------------------------------------------------------------------------------- /v2/views/css/lusitana.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Lusitana"; 3 | src: url("lusitana/Lusitana-Regular-OTF.ttf") format("opentype"); 4 | font-style: normal; 5 | font-weight: normal; 6 | } 7 | @font-face { 8 | font-family: "LusitanaBold"; 9 | src: url("lusitana/Lusitana-Bold-OTF.ttf") format("opentype"); 10 | font-style: normal; 11 | font-weight: normal; 12 | } 13 | @font-face { 14 | font-family: "LusitanaItalic"; 15 | src: url("lusitana/Lusitana-Italic-OTF.ttf") format("opentype"); 16 | font-style: normal; 17 | font-weight: normal; 18 | } 19 | @font-face { 20 | font-family: "LusitanaItalicBold"; 21 | src: url("lusitana/Lusitana-BoldItalic-OTF.ttf") format("opentype"); 22 | font-style: normal; 23 | font-weight: normal; 24 | } 25 | -------------------------------------------------------------------------------- /v2/views/css/lusitana/Lusitana-Bold-OTF.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/css/lusitana/Lusitana-Bold-OTF.ttf -------------------------------------------------------------------------------- /v2/views/css/lusitana/Lusitana-BoldItalic-OTF.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/css/lusitana/Lusitana-BoldItalic-OTF.ttf -------------------------------------------------------------------------------- /v2/views/css/lusitana/Lusitana-Italic-OTF.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/css/lusitana/Lusitana-Italic-OTF.ttf -------------------------------------------------------------------------------- /v2/views/css/lusitana/Lusitana-Regular-OTF.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/css/lusitana/Lusitana-Regular-OTF.ttf -------------------------------------------------------------------------------- /v2/views/css/onesignal-font.scss: -------------------------------------------------------------------------------- 1 | /* Generated by Glyphter (http://www.glyphter.com) on Fri Jan 22 2016*/ 2 | @font-face { 3 | font-family: 'OneSignal'; 4 | src: url('onesignal-font/OneSignal.eot'); 5 | src: url('onesignal-font/OneSignal.eot?#iefix') format('embedded-opentype'), 6 | url('onesignal-font/OneSignal.woff') format('woff'), 7 | url('onesignal-font/OneSignal.ttf') format('truetype'), 8 | url('onesignal-font/OneSignal.svg#OneSignal') format('svg'); 9 | font-weight: normal; 10 | font-style: normal; 11 | } -------------------------------------------------------------------------------- /v2/views/css/onesignal-font/OneSignal.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/css/onesignal-font/OneSignal.eot -------------------------------------------------------------------------------- /v2/views/css/onesignal-font/OneSignal.svg: -------------------------------------------------------------------------------- 1 | Generated by Glyphter -------------------------------------------------------------------------------- /v2/views/css/onesignal-font/OneSignal.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/css/onesignal-font/OneSignal.ttf -------------------------------------------------------------------------------- /v2/views/css/onesignal-font/OneSignal.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/css/onesignal-font/OneSignal.woff -------------------------------------------------------------------------------- /v2/views/css/onesignal-menu-styles.css: -------------------------------------------------------------------------------- 1 | /* Generated by Glyphter (http://www.glyphter.com) on Fri Jan 22 2016*/ 2 | @font-face{font-family:'OneSignal';src:url(onesignal-font/OneSignal.eot);src:url(onesignal-font/OneSignal.eot?#iefix) format("embedded-opentype"),url(onesignal-font/OneSignal.woff) format("woff"),url(onesignal-font/OneSignal.ttf) format("truetype"),url(onesignal-font/OneSignal.svg#OneSignal) format("svg");font-weight:normal;font-style:normal}#adminmenu .toplevel_page_onesignal-push.menu-icon-generic div.wp-menu-image:before{font-family:'OneSignal'!important;content:'\0041';font-size:1.3em!important}#adminmenu #menu-posts-product .menu-icon-post div.wp-menu-image:before,#adminmenu #menu-posts-product .menu-icon-product div.wp-menu-image:before{font-family:'OneSignal'!important;content:"\0041";font-size:1.3em!important}#adminmenu #toplevel_page_wc-reports .menu-icon-generic div.wp-menu-image:before{font-family:'OneSignal'!important;content:"\0041";font-size:1.3em!important} -------------------------------------------------------------------------------- /v2/views/css/onesignal-menu-styles.scss: -------------------------------------------------------------------------------- 1 | @import "onesignal-font"; 2 | 3 | #adminmenu .toplevel_page_onesignal-push.menu-icon-generic div.wp-menu-image:before { 4 | font-family: 'OneSignal' !important; 5 | content: '\0041'; 6 | font-size: 1.3em !important; 7 | } 8 | 9 | #adminmenu #menu-posts-product .menu-icon-post div.wp-menu-image:before, 10 | #adminmenu #menu-posts-product .menu-icon-product div.wp-menu-image:before { 11 | font-family: 'OneSignal' !important; 12 | content: "\0041"; 13 | font-size: 1.3em !important; 14 | } 15 | 16 | #adminmenu #toplevel_page_wc-reports .menu-icon-generic div.wp-menu-image:before { 17 | font-family: 'OneSignal' !important; 18 | content: "\0041"; 19 | font-size: 1.3em !important; 20 | } -------------------------------------------------------------------------------- /v2/views/css/semantic-ui.scss: -------------------------------------------------------------------------------- 1 | @import 'semantic-ui/globals/all'; 2 | 3 | @import 'semantic-ui/collections/all'; 4 | @import 'semantic-ui/elements/all'; 5 | @import 'semantic-ui/modules/all'; 6 | @import 'semantic-ui/views/all'; 7 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/collections/_all.scss: -------------------------------------------------------------------------------- 1 | @import 'breadcrumb'; 2 | @import 'form'; 3 | @import 'grid'; 4 | @import 'menu'; 5 | @import 'message'; 6 | @import 'table'; 7 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/collections/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Breadcrumb 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Breadcrumb 15 | *******************************/ 16 | 17 | .ui.breadcrumb { 18 | line-height: 1; 19 | display: inline-block; 20 | margin: 0em 0em; 21 | vertical-align: middle; 22 | } 23 | .ui.breadcrumb:first-child { 24 | margin-top: 0em; 25 | } 26 | .ui.breadcrumb:last-child { 27 | margin-bottom: 0em; 28 | } 29 | 30 | 31 | /******************************* 32 | Content 33 | *******************************/ 34 | 35 | 36 | /* Divider */ 37 | .ui.breadcrumb .divider { 38 | display: inline-block; 39 | opacity: 0.7; 40 | margin: 0em 0.21428571rem 0em; 41 | font-size: 0.92857143em; 42 | color: rgba(0, 0, 0, 0.4); 43 | vertical-align: baseline; 44 | } 45 | 46 | /* Link */ 47 | .ui.breadcrumb a { 48 | color: #4183c4; 49 | } 50 | .ui.breadcrumb a:hover { 51 | color: #1e70bf; 52 | } 53 | 54 | /* Icon Divider */ 55 | .ui.breadcrumb .icon.divider { 56 | font-size: 0.85714286em; 57 | vertical-align: baseline; 58 | } 59 | 60 | /* Section */ 61 | .ui.breadcrumb a.section { 62 | cursor: pointer; 63 | } 64 | .ui.breadcrumb .section { 65 | display: inline-block; 66 | margin: 0em; 67 | padding: 0em; 68 | } 69 | 70 | /* Loose Coupling */ 71 | .ui.breadcrumb.segment { 72 | display: inline-block; 73 | padding: 0.71428571em 1em; 74 | } 75 | 76 | 77 | /******************************* 78 | States 79 | *******************************/ 80 | 81 | .ui.breadcrumb .active.section { 82 | font-weight: bold; 83 | } 84 | 85 | 86 | /******************************* 87 | Variations 88 | *******************************/ 89 | 90 | .ui.mini.breadcrumb { 91 | font-size: 0.71428571rem; 92 | } 93 | .ui.tiny.breadcrumb { 94 | font-size: 0.85714286rem; 95 | } 96 | .ui.small.breadcrumb { 97 | font-size: 0.92857143rem; 98 | } 99 | .ui.breadcrumb { 100 | font-size: 1rem; 101 | } 102 | .ui.large.breadcrumb { 103 | font-size: 1.14285714rem; 104 | } 105 | .ui.big.breadcrumb { 106 | font-size: 1.28571429rem; 107 | } 108 | .ui.huge.breadcrumb { 109 | font-size: 1.42857143rem; 110 | } 111 | .ui.massive.breadcrumb { 112 | font-size: 1.71428571rem; 113 | } 114 | 115 | 116 | /******************************* 117 | Theme Overrides 118 | *******************************/ 119 | 120 | 121 | 122 | /******************************* 123 | Site Overrides 124 | *******************************/ 125 | 126 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/elements/_all.scss: -------------------------------------------------------------------------------- 1 | @import 'button'; 2 | @import 'container'; 3 | @import 'divider'; 4 | @import 'flag'; 5 | @import 'header'; 6 | @import 'icon'; 7 | @import 'image'; 8 | @import 'input'; 9 | @import 'label'; 10 | @import 'list'; 11 | @import 'loader'; 12 | @import 'rail'; 13 | @import 'reveal'; 14 | @import 'segment'; 15 | @import 'step'; 16 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/elements/_container.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Container 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Container 15 | *******************************/ 16 | 17 | 18 | /* All Sizes */ 19 | .ui.container { 20 | display: block; 21 | max-width: 100% !important; 22 | } 23 | 24 | /* Mobile */ 25 | @media only screen and (max-width: 767px) { 26 | .ui.container { 27 | width: auto !important; 28 | margin-left: 1em !important; 29 | margin-right: 1em !important; 30 | } 31 | .ui.grid.container { 32 | width: auto !important; 33 | } 34 | .ui.relaxed.grid.container { 35 | width: auto !important; 36 | } 37 | .ui.very.relaxed.grid.container { 38 | width: auto !important; 39 | } 40 | } 41 | 42 | /* Tablet */ 43 | @media only screen and (min-width: 768px) and (max-width: 991px) { 44 | .ui.container { 45 | width: 723px; 46 | margin-left: auto !important; 47 | margin-right: auto !important; 48 | } 49 | .ui.grid.container { 50 | width: calc( 723px + 2rem ) !important; 51 | } 52 | .ui.relaxed.grid.container { 53 | width: calc( 723px + 3rem ) !important; 54 | } 55 | .ui.very.relaxed.grid.container { 56 | width: calc( 723px + 5rem ) !important; 57 | } 58 | } 59 | 60 | /* Small Monitor */ 61 | @media only screen and (min-width: 992px) and (max-width: 1199px) { 62 | .ui.container { 63 | width: 933px; 64 | margin-left: auto !important; 65 | margin-right: auto !important; 66 | } 67 | .ui.grid.container { 68 | width: calc( 933px + 2rem ) !important; 69 | } 70 | .ui.relaxed.grid.container { 71 | width: calc( 933px + 3rem ) !important; 72 | } 73 | .ui.very.relaxed.grid.container { 74 | width: calc( 933px + 5rem ) !important; 75 | } 76 | } 77 | 78 | /* Large Monitor */ 79 | @media only screen and (min-width: 1200px) { 80 | .ui.container { 81 | width: 1127px; 82 | margin-left: auto !important; 83 | margin-right: auto !important; 84 | } 85 | .ui.grid.container { 86 | width: calc( 1127px + 2rem ) !important; 87 | } 88 | .ui.relaxed.grid.container { 89 | width: calc( 1127px + 3rem ) !important; 90 | } 91 | .ui.very.relaxed.grid.container { 92 | width: calc( 1127px + 5rem ) !important; 93 | } 94 | } 95 | 96 | 97 | /******************************* 98 | Types 99 | *******************************/ 100 | 101 | 102 | /* Text Container */ 103 | .ui.text.container { 104 | font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; 105 | max-width: 700px !important; 106 | line-height: 1.5; 107 | } 108 | .ui.text.container { 109 | font-size: 1.14285714rem; 110 | } 111 | 112 | /* Fluid */ 113 | .ui.fluid.container { 114 | width: 100%; 115 | } 116 | 117 | 118 | /******************************* 119 | Variations 120 | *******************************/ 121 | 122 | .ui[class*="left aligned"].container { 123 | text-align: left; 124 | } 125 | .ui[class*="center aligned"].container { 126 | text-align: center; 127 | } 128 | .ui[class*="right aligned"].container { 129 | text-align: right; 130 | } 131 | .ui.justified.container { 132 | text-align: justify; 133 | -webkit-hyphens: auto; 134 | -moz-hyphens: auto; 135 | -ms-hyphens: auto; 136 | hyphens: auto; 137 | } 138 | 139 | 140 | /******************************* 141 | Theme Overrides 142 | *******************************/ 143 | 144 | 145 | 146 | /******************************* 147 | Site Overrides 148 | *******************************/ 149 | 150 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/elements/_divider.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Divider 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Divider 15 | *******************************/ 16 | 17 | .ui.divider { 18 | margin: 1rem 0rem; 19 | line-height: 1; 20 | height: 0em; 21 | font-weight: bold; 22 | text-transform: uppercase; 23 | letter-spacing: 0.05em; 24 | color: rgba(0, 0, 0, 0.85); 25 | -webkit-user-select: none; 26 | -moz-user-select: none; 27 | -ms-user-select: none; 28 | user-select: none; 29 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 30 | } 31 | 32 | /*-------------- 33 | Basic 34 | ---------------*/ 35 | 36 | .ui.divider:not(.vertical):not(.horizontal) { 37 | border-top: 1px solid rgba(34, 36, 38, 0.15); 38 | border-bottom: 1px solid rgba(255, 255, 255, 0.1); 39 | } 40 | 41 | /*-------------- 42 | Coupling 43 | ---------------*/ 44 | 45 | 46 | /* Allow divider between each column row */ 47 | .ui.grid > .column + .divider, 48 | .ui.grid > .row > .column + .divider { 49 | left: auto; 50 | } 51 | 52 | /*-------------- 53 | Horizontal 54 | ---------------*/ 55 | 56 | .ui.horizontal.divider { 57 | display: table; 58 | white-space: nowrap; 59 | height: auto; 60 | margin: ''; 61 | overflow: hidden; 62 | line-height: 1; 63 | text-align: center; 64 | } 65 | .ui.horizontal.divider:before, 66 | .ui.horizontal.divider:after { 67 | content: ''; 68 | display: table-cell; 69 | position: relative; 70 | top: 50%; 71 | width: 50%; 72 | background-repeat: no-repeat; 73 | } 74 | .ui.horizontal.divider:before { 75 | background-position: right 1em top 50%; 76 | } 77 | .ui.horizontal.divider:after { 78 | background-position: left 1em top 50%; 79 | } 80 | 81 | /*-------------- 82 | Vertical 83 | ---------------*/ 84 | 85 | .ui.vertical.divider { 86 | position: absolute; 87 | z-index: 2; 88 | top: 50%; 89 | left: 50%; 90 | margin: 0rem; 91 | padding: 0em; 92 | width: auto; 93 | height: 50%; 94 | line-height: 0em; 95 | text-align: center; 96 | -webkit-transform: translateX(-50%); 97 | -ms-transform: translateX(-50%); 98 | transform: translateX(-50%); 99 | } 100 | .ui.vertical.divider:before, 101 | .ui.vertical.divider:after { 102 | position: absolute; 103 | left: 50%; 104 | content: ''; 105 | z-index: 3; 106 | border-left: 1px solid rgba(34, 36, 38, 0.15); 107 | border-right: 1px solid rgba(255, 255, 255, 0.1); 108 | width: 0%; 109 | height: calc(100% - 1rem ); 110 | } 111 | .ui.vertical.divider:before { 112 | top: -100%; 113 | } 114 | .ui.vertical.divider:after { 115 | top: auto; 116 | bottom: 0px; 117 | } 118 | 119 | /* Inside grid */ 120 | @media only screen and (max-width: 767px) { 121 | .ui.stackable.grid .ui.vertical.divider, 122 | .ui.grid .stackable.row .ui.vertical.divider { 123 | display: table; 124 | white-space: nowrap; 125 | height: auto; 126 | margin: ''; 127 | overflow: hidden; 128 | line-height: 1; 129 | text-align: center; 130 | position: static; 131 | top: 0; 132 | left: 0; 133 | -webkit-transform: none; 134 | -ms-transform: none; 135 | transform: none; 136 | } 137 | .ui.stackable.grid .ui.vertical.divider:before, 138 | .ui.grid .stackable.row .ui.vertical.divider:before, 139 | .ui.stackable.grid .ui.vertical.divider:after, 140 | .ui.grid .stackable.row .ui.vertical.divider:after { 141 | position: static; 142 | left: 0; 143 | border-left: none; 144 | border-right: none; 145 | content: ''; 146 | display: table-cell; 147 | position: relative; 148 | top: 50%; 149 | width: 50%; 150 | background-repeat: no-repeat; 151 | } 152 | .ui.stackable.grid .ui.vertical.divider:before, 153 | .ui.grid .stackable.row .ui.vertical.divider:before { 154 | background-position: right 1em top 50%; 155 | } 156 | .ui.stackable.grid .ui.vertical.divider:after, 157 | .ui.grid .stackable.row .ui.vertical.divider:after { 158 | background-position: left 1em top 50%; 159 | } 160 | } 161 | 162 | /*-------------- 163 | Icon 164 | ---------------*/ 165 | 166 | .ui.divider > .icon { 167 | margin: 0rem; 168 | font-size: 1rem; 169 | height: 1em; 170 | vertical-align: middle; 171 | } 172 | 173 | 174 | /******************************* 175 | Variations 176 | *******************************/ 177 | 178 | 179 | /*-------------- 180 | Hidden 181 | ---------------*/ 182 | 183 | .ui.hidden.divider { 184 | border-color: transparent !important; 185 | } 186 | .ui.hidden.divider:before, 187 | .ui.hidden.divider:after { 188 | display: none; 189 | } 190 | 191 | /*-------------- 192 | Inverted 193 | ---------------*/ 194 | 195 | .ui.divider.inverted, 196 | .ui.vertical.inverted.divider, 197 | .ui.horizontal.inverted.divider { 198 | color: #ffffff; 199 | } 200 | .ui.divider.inverted, 201 | .ui.divider.inverted:after, 202 | .ui.divider.inverted:before { 203 | border-top-color: rgba(34, 36, 38, 0.15) !important; 204 | border-left-color: rgba(34, 36, 38, 0.15) !important; 205 | border-bottom-color: rgba(255, 255, 255, 0.15) !important; 206 | border-right-color: rgba(255, 255, 255, 0.15) !important; 207 | } 208 | 209 | /*-------------- 210 | Fitted 211 | ---------------*/ 212 | 213 | .ui.fitted.divider { 214 | margin: 0em; 215 | } 216 | 217 | /*-------------- 218 | Clearing 219 | ---------------*/ 220 | 221 | .ui.clearing.divider { 222 | clear: both; 223 | } 224 | 225 | /*-------------- 226 | Section 227 | ---------------*/ 228 | 229 | .ui.section.divider { 230 | margin-top: 2rem; 231 | margin-bottom: 2rem; 232 | } 233 | 234 | /*-------------- 235 | Sizes 236 | ---------------*/ 237 | 238 | .ui.divider { 239 | font-size: 1rem; 240 | } 241 | 242 | 243 | /******************************* 244 | Theme Overrides 245 | *******************************/ 246 | 247 | .ui.horizontal.divider:before, 248 | .ui.horizontal.divider:after { 249 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC'); 250 | } 251 | @media only screen and (max-width: 767px) { 252 | .ui.stackable.grid .ui.vertical.divider:before, 253 | .ui.grid .stackable.row .ui.vertical.divider:before, 254 | .ui.stackable.grid .ui.vertical.divider:after, 255 | .ui.grid .stackable.row .ui.vertical.divider:after { 256 | background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABaAAAAACCAYAAACuTHuKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDE0IDc5LjE1MTQ4MSwgMjAxMy8wMy8xMy0xMjowOToxNSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1OThBRDY4OUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1OThBRDY4QUNDMTYxMUU0OUE3NUVGOEJDMzMzMjE2NyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU5OEFENjg3Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU5OEFENjg4Q0MxNjExRTQ5QTc1RUY4QkMzMzMyMTY3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+VU513gAAADVJREFUeNrs0DENACAQBDBIWLGBJQby/mUcJn5sJXQmOQMAAAAAAJqt+2prAAAAAACg2xdgANk6BEVuJgyMAAAAAElFTkSuQmCC'); 257 | } 258 | } 259 | 260 | 261 | /******************************* 262 | Site Overrides 263 | *******************************/ 264 | 265 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/elements/_image.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Image 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Image 15 | *******************************/ 16 | 17 | .ui.image { 18 | position: relative; 19 | display: inline-block; 20 | vertical-align: middle; 21 | max-width: 100%; 22 | background-color: transparent; 23 | } 24 | img.ui.image { 25 | display: block; 26 | } 27 | .ui.image svg, 28 | .ui.image img { 29 | display: block; 30 | max-width: 100%; 31 | height: auto; 32 | } 33 | 34 | 35 | /******************************* 36 | States 37 | *******************************/ 38 | 39 | .ui.hidden.images, 40 | .ui.hidden.image { 41 | display: none; 42 | } 43 | .ui.disabled.images, 44 | .ui.disabled.image { 45 | cursor: default; 46 | opacity: 0.45; 47 | } 48 | 49 | 50 | /******************************* 51 | Variations 52 | *******************************/ 53 | 54 | 55 | /*-------------- 56 | Inline 57 | ---------------*/ 58 | 59 | .ui.inline.image, 60 | .ui.inline.image svg, 61 | .ui.inline.image img { 62 | display: inline-block; 63 | } 64 | 65 | /*------------------ 66 | Vertical Aligned 67 | -------------------*/ 68 | 69 | .ui.top.aligned.images .image, 70 | .ui.top.aligned.image, 71 | .ui.top.aligned.image svg, 72 | .ui.top.aligned.image img { 73 | display: inline-block; 74 | vertical-align: top; 75 | } 76 | .ui.middle.aligned.images .image, 77 | .ui.middle.aligned.image, 78 | .ui.middle.aligned.image svg, 79 | .ui.middle.aligned.image img { 80 | display: inline-block; 81 | vertical-align: middle; 82 | } 83 | .ui.bottom.aligned.images .image, 84 | .ui.bottom.aligned.image, 85 | .ui.bottom.aligned.image svg, 86 | .ui.bottom.aligned.image img { 87 | display: inline-block; 88 | vertical-align: bottom; 89 | } 90 | 91 | /*-------------- 92 | Rounded 93 | ---------------*/ 94 | 95 | .ui.rounded.images .image, 96 | .ui.rounded.image, 97 | .ui.rounded.images .image > *, 98 | .ui.rounded.image > * { 99 | border-radius: 0.3125em; 100 | } 101 | 102 | /*-------------- 103 | Bordered 104 | ---------------*/ 105 | 106 | .ui.bordered.images .image, 107 | .ui.bordered.images img, 108 | .ui.bordered.images svg, 109 | .ui.bordered.image img, 110 | .ui.bordered.image svg, 111 | img.ui.bordered.image { 112 | border: 1px solid rgba(0, 0, 0, 0.1); 113 | } 114 | 115 | /*-------------- 116 | Circular 117 | ---------------*/ 118 | 119 | .ui.circular.images, 120 | .ui.circular.image { 121 | overflow: hidden; 122 | } 123 | .ui.circular.images .image, 124 | .ui.circular.image, 125 | .ui.circular.images .image > *, 126 | .ui.circular.image > * { 127 | border-radius: 500rem; 128 | } 129 | 130 | /*-------------- 131 | Fluid 132 | ---------------*/ 133 | 134 | .ui.fluid.images, 135 | .ui.fluid.image, 136 | .ui.fluid.images img, 137 | .ui.fluid.images svg, 138 | .ui.fluid.image svg, 139 | .ui.fluid.image img { 140 | display: block; 141 | width: 100%; 142 | height: auto; 143 | } 144 | 145 | /*-------------- 146 | Avatar 147 | ---------------*/ 148 | 149 | .ui.avatar.images .image, 150 | .ui.avatar.images img, 151 | .ui.avatar.images svg, 152 | .ui.avatar.image img, 153 | .ui.avatar.image svg, 154 | .ui.avatar.image { 155 | margin-right: 0.25em; 156 | display: inline-block; 157 | width: 2em; 158 | height: 2em; 159 | border-radius: 500rem; 160 | } 161 | 162 | /*------------------- 163 | Spaced 164 | --------------------*/ 165 | 166 | .ui.spaced.image { 167 | display: inline-block !important; 168 | margin-left: 0.5em; 169 | margin-right: 0.5em; 170 | } 171 | .ui[class*="left spaced"].image { 172 | margin-left: 0.5em; 173 | margin-right: 0em; 174 | } 175 | .ui[class*="right spaced"].image { 176 | margin-left: 0em; 177 | margin-right: 0.5em; 178 | } 179 | 180 | /*------------------- 181 | Floated 182 | --------------------*/ 183 | 184 | .ui.floated.image, 185 | .ui.floated.images { 186 | float: left; 187 | margin-right: 1em; 188 | margin-bottom: 1em; 189 | } 190 | .ui.right.floated.images, 191 | .ui.right.floated.image { 192 | float: right; 193 | margin-right: 0em; 194 | margin-bottom: 1em; 195 | margin-left: 1em; 196 | } 197 | .ui.floated.images:last-child, 198 | .ui.floated.image:last-child { 199 | margin-bottom: 0em; 200 | } 201 | .ui.centered.images, 202 | .ui.centered.image { 203 | margin-left: auto; 204 | margin-right: auto; 205 | } 206 | 207 | /*-------------- 208 | Sizes 209 | ---------------*/ 210 | 211 | .ui.mini.images .image, 212 | .ui.mini.images img, 213 | .ui.mini.images svg, 214 | .ui.mini.image { 215 | width: 35px; 216 | height: auto; 217 | font-size: 0.71428571rem; 218 | } 219 | .ui.tiny.images .image, 220 | .ui.tiny.images img, 221 | .ui.tiny.images svg, 222 | .ui.tiny.image { 223 | width: 80px; 224 | height: auto; 225 | font-size: 0.85714286rem; 226 | } 227 | .ui.small.images .image, 228 | .ui.small.images img, 229 | .ui.small.images svg, 230 | .ui.small.image { 231 | width: 150px; 232 | height: auto; 233 | font-size: 0.92857143rem; 234 | } 235 | .ui.medium.images .image, 236 | .ui.medium.images img, 237 | .ui.medium.images svg, 238 | .ui.medium.image { 239 | width: 300px; 240 | height: auto; 241 | font-size: 1rem; 242 | } 243 | .ui.large.images .image, 244 | .ui.large.images img, 245 | .ui.large.images svg, 246 | .ui.large.image { 247 | width: 450px; 248 | height: auto; 249 | font-size: 1.14285714rem; 250 | } 251 | .ui.big.images .image, 252 | .ui.big.images img, 253 | .ui.big.images svg, 254 | .ui.big.image { 255 | width: 600px; 256 | height: auto; 257 | font-size: 1.28571429rem; 258 | } 259 | .ui.huge.images .image, 260 | .ui.huge.images img, 261 | .ui.huge.images svg, 262 | .ui.huge.image { 263 | width: 800px; 264 | height: auto; 265 | font-size: 1.42857143rem; 266 | } 267 | .ui.massive.images .image, 268 | .ui.massive.images img, 269 | .ui.massive.images svg, 270 | .ui.massive.image { 271 | width: 960px; 272 | height: auto; 273 | font-size: 1.71428571rem; 274 | } 275 | 276 | 277 | /******************************* 278 | Groups 279 | *******************************/ 280 | 281 | .ui.images { 282 | font-size: 0em; 283 | margin: 0em -0.25rem 0rem; 284 | } 285 | .ui.images .image, 286 | .ui.images img, 287 | .ui.images svg { 288 | display: inline-block; 289 | margin: 0em 0.25rem 0.5rem; 290 | } 291 | 292 | 293 | /******************************* 294 | Theme Overrides 295 | *******************************/ 296 | 297 | 298 | 299 | /******************************* 300 | Site Overrides 301 | *******************************/ 302 | 303 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/elements/_loader.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Loader 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Loader 15 | *******************************/ 16 | 17 | 18 | /* Standard Size */ 19 | .ui.loader { 20 | display: none; 21 | position: absolute; 22 | top: 50%; 23 | left: 50%; 24 | margin: 0px; 25 | text-align: center; 26 | z-index: 1000; 27 | -webkit-transform: translateX(-50%) translateY(-50%); 28 | -ms-transform: translateX(-50%) translateY(-50%); 29 | transform: translateX(-50%) translateY(-50%); 30 | } 31 | 32 | /* Static Shape */ 33 | .ui.loader:before { 34 | position: absolute; 35 | content: ''; 36 | top: 0%; 37 | left: 50%; 38 | width: 100%; 39 | height: 100%; 40 | border-radius: 500rem; 41 | border: 0.2em solid rgba(0, 0, 0, 0.1); 42 | } 43 | 44 | /* Active Shape */ 45 | .ui.loader:after { 46 | position: absolute; 47 | content: ''; 48 | top: 0%; 49 | left: 50%; 50 | width: 100%; 51 | height: 100%; 52 | -webkit-animation: loader 0.6s linear; 53 | animation: loader 0.6s linear; 54 | -webkit-animation-iteration-count: infinite; 55 | animation-iteration-count: infinite; 56 | border-radius: 500rem; 57 | border-color: #767676 transparent transparent; 58 | border-style: solid; 59 | border-width: 0.2em; 60 | box-shadow: 0px 0px 0px 1px transparent; 61 | } 62 | 63 | /* Active Animation */ 64 | @-webkit-keyframes loader { 65 | from { 66 | -webkit-transform: rotate(0deg); 67 | transform: rotate(0deg); 68 | } 69 | to { 70 | -webkit-transform: rotate(360deg); 71 | transform: rotate(360deg); 72 | } 73 | } 74 | @keyframes loader { 75 | from { 76 | -webkit-transform: rotate(0deg); 77 | transform: rotate(0deg); 78 | } 79 | to { 80 | -webkit-transform: rotate(360deg); 81 | transform: rotate(360deg); 82 | } 83 | } 84 | 85 | /* Sizes */ 86 | .ui.loader:before, 87 | .ui.loader:after { 88 | width: 2.2585em; 89 | height: 2.2585em; 90 | margin: 0em 0em 0em -1.12925em; 91 | } 92 | .ui.mini.loader:before, 93 | .ui.mini.loader:after { 94 | width: 1.2857em; 95 | height: 1.2857em; 96 | margin: 0em 0em 0em -0.64285em; 97 | } 98 | .ui.small.loader:before, 99 | .ui.small.loader:after { 100 | width: 1.7142em; 101 | height: 1.7142em; 102 | margin: 0em 0em 0em -0.8571em; 103 | } 104 | .ui.large.loader:before, 105 | .ui.large.loader:after { 106 | width: 4.5714em; 107 | height: 4.5714em; 108 | margin: 0em 0em 0em -2.2857em; 109 | } 110 | 111 | /*------------------- 112 | Coupling 113 | --------------------*/ 114 | 115 | 116 | /* Show inside active dimmer */ 117 | .ui.dimmer .loader { 118 | display: block; 119 | } 120 | 121 | /* Black Dimmer */ 122 | .ui.dimmer .ui.loader { 123 | color: rgba(255, 255, 255, 0.9); 124 | } 125 | .ui.dimmer .ui.loader:before { 126 | border-color: rgba(255, 255, 255, 0.15); 127 | } 128 | .ui.dimmer .ui.loader:after { 129 | border-color: #ffffff transparent transparent; 130 | } 131 | 132 | /* White Dimmer (Inverted) */ 133 | .ui.inverted.dimmer .ui.loader { 134 | color: rgba(0, 0, 0, 0.87); 135 | } 136 | .ui.inverted.dimmer .ui.loader:before { 137 | border-color: rgba(0, 0, 0, 0.1); 138 | } 139 | .ui.inverted.dimmer .ui.loader:after { 140 | border-color: #767676 transparent transparent; 141 | } 142 | 143 | 144 | /******************************* 145 | Types 146 | *******************************/ 147 | 148 | 149 | /*------------------- 150 | Text 151 | --------------------*/ 152 | 153 | .ui.text.loader { 154 | width: auto !important; 155 | height: auto !important; 156 | text-align: center; 157 | font-style: normal; 158 | } 159 | 160 | 161 | /******************************* 162 | States 163 | *******************************/ 164 | 165 | .ui.indeterminate.loader:after { 166 | -webkit-animation-direction: reverse; 167 | animation-direction: reverse; 168 | -webkit-animation-duration: 1.2s; 169 | animation-duration: 1.2s; 170 | } 171 | .ui.loader.active, 172 | .ui.loader.visible { 173 | display: block; 174 | } 175 | .ui.loader.disabled, 176 | .ui.loader.hidden { 177 | display: none; 178 | } 179 | 180 | 181 | /******************************* 182 | Variations 183 | *******************************/ 184 | 185 | 186 | /*------------------- 187 | Sizes 188 | --------------------*/ 189 | 190 | 191 | /* Loader */ 192 | .ui.inverted.dimmer .ui.mini.loader, 193 | .ui.mini.loader { 194 | width: 1.2857em; 195 | height: 1.2857em; 196 | font-size: 0.71428571em; 197 | } 198 | .ui.inverted.dimmer .ui.small.loader, 199 | .ui.small.loader { 200 | width: 1.7142em; 201 | height: 1.7142em; 202 | font-size: 0.92857143em; 203 | } 204 | .ui.inverted.dimmer .ui.loader, 205 | .ui.loader { 206 | width: 2.2585em; 207 | height: 2.2585em; 208 | font-size: 1em; 209 | } 210 | .ui.inverted.dimmer .ui.loader.large, 211 | .ui.loader.large { 212 | width: 4.5714em; 213 | height: 4.5714em; 214 | font-size: 1.14285714em; 215 | } 216 | 217 | /* Text Loader */ 218 | .ui.mini.text.loader { 219 | min-width: 1.2857em; 220 | padding-top: 1.99998571em; 221 | } 222 | .ui.small.text.loader { 223 | min-width: 1.7142em; 224 | padding-top: 2.42848571em; 225 | } 226 | .ui.text.loader { 227 | min-width: 2.2585em; 228 | padding-top: 2.97278571em; 229 | } 230 | .ui.large.text.loader { 231 | min-width: 4.5714em; 232 | padding-top: 5.28568571em; 233 | } 234 | 235 | /*------------------- 236 | Inverted 237 | --------------------*/ 238 | 239 | .ui.inverted.loader { 240 | color: rgba(255, 255, 255, 0.9); 241 | } 242 | .ui.inverted.loader:before { 243 | border-color: rgba(255, 255, 255, 0.15); 244 | } 245 | .ui.inverted.loader:after { 246 | border-top-color: #ffffff; 247 | } 248 | 249 | /*------------------- 250 | Inline 251 | --------------------*/ 252 | 253 | .ui.inline.loader { 254 | position: relative; 255 | vertical-align: middle; 256 | margin: 0em; 257 | left: 0em; 258 | top: 0em; 259 | -webkit-transform: none; 260 | -ms-transform: none; 261 | transform: none; 262 | } 263 | .ui.inline.loader.active, 264 | .ui.inline.loader.visible { 265 | display: inline-block; 266 | } 267 | 268 | /* Centered Inline */ 269 | .ui.centered.inline.loader.active, 270 | .ui.centered.inline.loader.visible { 271 | display: block; 272 | margin-left: auto; 273 | margin-right: auto; 274 | } 275 | 276 | 277 | /******************************* 278 | Theme Overrides 279 | *******************************/ 280 | 281 | 282 | 283 | /******************************* 284 | Site Overrides 285 | *******************************/ 286 | 287 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/elements/_rail.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Rail 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Rails 15 | *******************************/ 16 | 17 | .ui.rail { 18 | position: absolute; 19 | top: 0%; 20 | width: 300px; 21 | height: 100%; 22 | } 23 | .ui.left.rail { 24 | left: auto; 25 | right: 100%; 26 | padding: 0em 2rem 0em 0em; 27 | margin: 0em 2rem 0em 0em; 28 | } 29 | .ui.right.rail { 30 | left: 100%; 31 | right: auto; 32 | padding: 0em 0em 0em 2rem; 33 | margin: 0em 0em 0em 2rem; 34 | } 35 | 36 | 37 | /******************************* 38 | Variations 39 | *******************************/ 40 | 41 | 42 | /*-------------- 43 | Internal 44 | ---------------*/ 45 | 46 | .ui.left.internal.rail { 47 | left: 0%; 48 | right: auto; 49 | padding: 0em 0em 0em 2rem; 50 | margin: 0em 0em 0em 2rem; 51 | } 52 | .ui.right.internal.rail { 53 | left: auto; 54 | right: 0%; 55 | padding: 0em 2rem 0em 0em; 56 | margin: 0em 2rem 0em 0em; 57 | } 58 | 59 | /*-------------- 60 | Dividing 61 | ---------------*/ 62 | 63 | .ui.dividing.rail { 64 | width: 302.5px; 65 | } 66 | .ui.left.dividing.rail { 67 | padding: 0em 2.5rem 0em 0em; 68 | margin: 0em 2.5rem 0em 0em; 69 | border-right: 1px solid rgba(34, 36, 38, 0.15); 70 | } 71 | .ui.right.dividing.rail { 72 | border-left: 1px solid rgba(34, 36, 38, 0.15); 73 | padding: 0em 0em 0em 2.5rem; 74 | margin: 0em 0em 0em 2.5rem; 75 | } 76 | 77 | /*-------------- 78 | Distance 79 | ---------------*/ 80 | 81 | .ui.close.rail { 82 | width: 301px; 83 | } 84 | .ui.close.left.rail { 85 | padding: 0em 1em 0em 0em; 86 | margin: 0em 1em 0em 0em; 87 | } 88 | .ui.close.right.rail { 89 | padding: 0em 0em 0em 1em; 90 | margin: 0em 0em 0em 1em; 91 | } 92 | .ui.very.close.rail { 93 | width: 300.5px; 94 | } 95 | .ui.very.close.left.rail { 96 | padding: 0em 0.5em 0em 0em; 97 | margin: 0em 0.5em 0em 0em; 98 | } 99 | .ui.very.close.right.rail { 100 | padding: 0em 0em 0em 0.5em; 101 | margin: 0em 0em 0em 0.5em; 102 | } 103 | 104 | /*-------------- 105 | Attached 106 | ---------------*/ 107 | 108 | .ui.attached.left.rail, 109 | .ui.attached.right.rail { 110 | padding: 0em; 111 | margin: 0em; 112 | } 113 | 114 | /*-------------- 115 | Sizing 116 | ---------------*/ 117 | 118 | .ui.rail { 119 | font-size: 1rem; 120 | } 121 | 122 | 123 | /******************************* 124 | Theme Overrides 125 | *******************************/ 126 | 127 | 128 | 129 | /******************************* 130 | Site Overrides 131 | *******************************/ 132 | 133 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/globals/_all.scss: -------------------------------------------------------------------------------- 1 | @import 'site'; 2 | @import 'reset'; -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/globals/_site.scss: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/css/semantic-ui/globals/_site.scss -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/modules/_all.scss: -------------------------------------------------------------------------------- 1 | @import 'accordion'; 2 | @import 'checkbox'; 3 | @import 'dimmer'; 4 | @import 'dropdown'; 5 | @import 'embed'; 6 | @import 'modal'; 7 | @import 'nag'; 8 | @import 'popup'; 9 | @import 'progress'; 10 | @import 'rating'; 11 | @import 'search'; 12 | @import 'shape'; 13 | @import 'sidebar'; 14 | @import 'sticky'; 15 | @import 'tab'; 16 | @import 'transition'; 17 | @import 'video'; 18 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/modules/_dimmer.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Dimmer 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Dimmer 15 | *******************************/ 16 | 17 | .dimmable { 18 | position: relative; 19 | } 20 | .ui.dimmer { 21 | display: none; 22 | position: absolute; 23 | top: 0em !important; 24 | left: 0em !important; 25 | width: 100%; 26 | height: 100%; 27 | text-align: center; 28 | vertical-align: middle; 29 | background-color: rgba(0, 0, 0, 0.85); 30 | opacity: 0; 31 | line-height: 1; 32 | -webkit-animation-fill-mode: both; 33 | animation-fill-mode: both; 34 | -webkit-animation-duration: 0.5s; 35 | animation-duration: 0.5s; 36 | -webkit-transition: background-color 0.5s linear; 37 | transition: background-color 0.5s linear; 38 | -webkit-user-select: none; 39 | -moz-user-select: none; 40 | -ms-user-select: none; 41 | user-select: none; 42 | will-change: opacity; 43 | z-index: 1000; 44 | } 45 | 46 | /* Dimmer Content */ 47 | .ui.dimmer > .content { 48 | width: 100%; 49 | height: 100%; 50 | display: table; 51 | -webkit-user-select: text; 52 | -moz-user-select: text; 53 | -ms-user-select: text; 54 | user-select: text; 55 | } 56 | .ui.dimmer > .content > * { 57 | display: table-cell; 58 | vertical-align: middle; 59 | color: #ffffff; 60 | } 61 | 62 | /* Loose Coupling */ 63 | .ui.segment > .ui.dimmer { 64 | border-radius: inherit !important; 65 | } 66 | 67 | 68 | /******************************* 69 | States 70 | *******************************/ 71 | 72 | .animating.dimmable:not(body), 73 | .dimmed.dimmable:not(body) { 74 | overflow: hidden; 75 | } 76 | .dimmed.dimmable > .ui.animating.dimmer, 77 | .dimmed.dimmable > .ui.visible.dimmer, 78 | .ui.active.dimmer { 79 | display: block; 80 | opacity: 1; 81 | } 82 | .ui.disabled.dimmer { 83 | width: 0 !important; 84 | height: 0 !important; 85 | } 86 | 87 | 88 | /******************************* 89 | Variations 90 | *******************************/ 91 | 92 | 93 | /*-------------- 94 | Page 95 | ---------------*/ 96 | 97 | .ui.page.dimmer { 98 | position: fixed; 99 | -webkit-transform-style: ''; 100 | transform-style: ''; 101 | -webkit-perspective: 2000px; 102 | perspective: 2000px; 103 | -webkit-transform-origin: center center; 104 | -ms-transform-origin: center center; 105 | transform-origin: center center; 106 | } 107 | body.animating.in.dimmable, 108 | body.dimmed.dimmable { 109 | overflow: hidden; 110 | } 111 | body.dimmable > .dimmer { 112 | position: fixed; 113 | } 114 | 115 | /*-------------- 116 | Blurring 117 | ---------------*/ 118 | 119 | .blurring.dimmable > :not(.dimmer) { 120 | -webkit-filter: blur(0px) grayscale(0); 121 | filter: blur(0px) grayscale(0); 122 | -webkit-transition: 800ms -webkit-filter ease, 800ms filter ease; 123 | transition: 800ms filter ease; 124 | } 125 | .blurring.dimmed.dimmable > :not(.dimmer) { 126 | -webkit-filter: blur(5px) grayscale(0.7); 127 | filter: blur(5px) grayscale(0.7); 128 | } 129 | 130 | /* Dimmer Color */ 131 | .blurring.dimmable > .dimmer { 132 | background-color: rgba(0, 0, 0, 0.6); 133 | } 134 | .blurring.dimmable > .inverted.dimmer { 135 | background-color: rgba(255, 255, 255, 0.6); 136 | } 137 | 138 | /*-------------- 139 | Aligned 140 | ---------------*/ 141 | 142 | .ui.dimmer > .top.aligned.content > * { 143 | vertical-align: top; 144 | } 145 | .ui.dimmer > .bottom.aligned.content > * { 146 | vertical-align: bottom; 147 | } 148 | 149 | /*-------------- 150 | Inverted 151 | ---------------*/ 152 | 153 | .ui.inverted.dimmer { 154 | background-color: rgba(255, 255, 255, 0.85); 155 | } 156 | .ui.inverted.dimmer > .content > * { 157 | color: #ffffff; 158 | } 159 | 160 | /*-------------- 161 | Simple 162 | ---------------*/ 163 | 164 | 165 | /* Displays without javascript */ 166 | .ui.simple.dimmer { 167 | display: block; 168 | overflow: hidden; 169 | opacity: 1; 170 | width: 0%; 171 | height: 0%; 172 | z-index: -100; 173 | background-color: rgba(0, 0, 0, 0); 174 | } 175 | .dimmed.dimmable > .ui.simple.dimmer { 176 | overflow: visible; 177 | opacity: 1; 178 | width: 100%; 179 | height: 100%; 180 | background-color: rgba(0, 0, 0, 0.85); 181 | z-index: 1; 182 | } 183 | .ui.simple.inverted.dimmer { 184 | background-color: rgba(255, 255, 255, 0); 185 | } 186 | .dimmed.dimmable > .ui.simple.inverted.dimmer { 187 | background-color: rgba(255, 255, 255, 0.85); 188 | } 189 | 190 | 191 | /******************************* 192 | Theme Overrides 193 | *******************************/ 194 | 195 | 196 | 197 | /******************************* 198 | User Overrides 199 | *******************************/ 200 | 201 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/modules/_embed.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Video 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Types 15 | *******************************/ 16 | 17 | .ui.embed { 18 | position: relative; 19 | max-width: 100%; 20 | height: 0px; 21 | overflow: hidden; 22 | background: #dcddde; 23 | padding-bottom: 56.25%; 24 | } 25 | 26 | /*----------------- 27 | Embedded Content 28 | ------------------*/ 29 | 30 | .ui.embed iframe, 31 | .ui.embed embed, 32 | .ui.embed object { 33 | position: absolute; 34 | border: none; 35 | width: 100%; 36 | height: 100%; 37 | top: 0px; 38 | left: 0px; 39 | margin: 0em; 40 | padding: 0em; 41 | } 42 | 43 | /*----------------- 44 | Embed 45 | ------------------*/ 46 | 47 | .ui.embed > .embed { 48 | display: none; 49 | } 50 | 51 | /*-------------- 52 | Placeholder 53 | ---------------*/ 54 | 55 | .ui.embed > .placeholder { 56 | position: absolute; 57 | cursor: pointer; 58 | top: 0px; 59 | left: 0px; 60 | display: block; 61 | width: 100%; 62 | height: 100%; 63 | background-color: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 64 | } 65 | 66 | /*-------------- 67 | Icon 68 | ---------------*/ 69 | 70 | .ui.embed > .icon { 71 | cursor: pointer; 72 | position: absolute; 73 | top: 0px; 74 | left: 0px; 75 | width: 100%; 76 | height: 100%; 77 | z-index: 2; 78 | } 79 | .ui.embed > .icon:after { 80 | position: absolute; 81 | top: 0%; 82 | left: 0%; 83 | width: 100%; 84 | height: 100%; 85 | z-index: 3; 86 | content: ''; 87 | background: -webkit-radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 88 | background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 89 | opacity: 0.5; 90 | -webkit-transition: opacity 0.5s ease; 91 | transition: opacity 0.5s ease; 92 | } 93 | .ui.embed > .icon:before { 94 | position: absolute; 95 | top: 50%; 96 | left: 50%; 97 | z-index: 4; 98 | -webkit-transform: translateX(-50%) translateY(-50%); 99 | -ms-transform: translateX(-50%) translateY(-50%); 100 | transform: translateX(-50%) translateY(-50%); 101 | color: #ffffff; 102 | font-size: 6rem; 103 | text-shadow: 0px 2px 10px rgba(34, 36, 38, 0.2); 104 | -webkit-transition: opacity 0.5s ease, color 0.5s ease; 105 | transition: opacity 0.5s ease, color 0.5s ease; 106 | z-index: 10; 107 | } 108 | 109 | 110 | /******************************* 111 | States 112 | *******************************/ 113 | 114 | 115 | /*-------------- 116 | Hover 117 | ---------------*/ 118 | 119 | .ui.embed .icon:hover:after { 120 | background: -webkit-radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 121 | background: radial-gradient(transparent 45%, rgba(0, 0, 0, 0.3)); 122 | opacity: 1; 123 | } 124 | .ui.embed .icon:hover:before { 125 | color: #ffffff; 126 | } 127 | 128 | /*-------------- 129 | Active 130 | ---------------*/ 131 | 132 | .ui.active.embed > .icon, 133 | .ui.active.embed > .placeholder { 134 | display: none; 135 | } 136 | .ui.active.embed > .embed { 137 | display: block; 138 | } 139 | 140 | 141 | /******************************* 142 | Video Overrides 143 | *******************************/ 144 | 145 | 146 | 147 | /******************************* 148 | Site Overrides 149 | *******************************/ 150 | 151 | 152 | 153 | /******************************* 154 | Variations 155 | *******************************/ 156 | 157 | .ui.square.embed { 158 | padding-bottom: 100%; 159 | } 160 | .ui[class*="4:3"].embed { 161 | padding-bottom: 75%; 162 | } 163 | .ui[class*="16:9"].embed { 164 | padding-bottom: 56.25%; 165 | } 166 | .ui[class*="21:9"].embed { 167 | padding-bottom: 42.85714286%; 168 | } 169 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/modules/_nag.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Nag 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Nag 15 | *******************************/ 16 | 17 | .ui.nag { 18 | display: none; 19 | opacity: 0.95; 20 | position: relative; 21 | top: 0em; 22 | left: 0px; 23 | z-index: 999; 24 | min-height: 0em; 25 | width: 100%; 26 | margin: 0em; 27 | padding: 0.75em 1em; 28 | background: #555555; 29 | box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.2); 30 | font-size: 1rem; 31 | text-align: center; 32 | color: rgba(0, 0, 0, 0.87); 33 | border-radius: 0em 0em 0.28571429rem 0.28571429rem; 34 | -webkit-transition: 0.2s background ease; 35 | transition: 0.2s background ease; 36 | } 37 | a.ui.nag { 38 | cursor: pointer; 39 | } 40 | .ui.nag > .title { 41 | display: inline-block; 42 | margin: 0em 0.5em; 43 | color: #ffffff; 44 | } 45 | .ui.nag > .close.icon { 46 | cursor: pointer; 47 | opacity: 0.4; 48 | position: absolute; 49 | top: 50%; 50 | right: 1em; 51 | font-size: 1em; 52 | margin: -0.5em 0em 0em; 53 | color: #ffffff; 54 | -webkit-transition: opacity 0.2s ease; 55 | transition: opacity 0.2s ease; 56 | } 57 | 58 | 59 | /******************************* 60 | States 61 | *******************************/ 62 | 63 | 64 | /* Hover */ 65 | .ui.nag:hover { 66 | background: #555555; 67 | opacity: 1; 68 | } 69 | .ui.nag .close:hover { 70 | opacity: 1; 71 | } 72 | 73 | 74 | /******************************* 75 | Variations 76 | *******************************/ 77 | 78 | 79 | /*-------------- 80 | Static 81 | ---------------*/ 82 | 83 | .ui.overlay.nag { 84 | position: absolute; 85 | display: block; 86 | } 87 | 88 | /*-------------- 89 | Fixed 90 | ---------------*/ 91 | 92 | .ui.fixed.nag { 93 | position: fixed; 94 | } 95 | 96 | /*-------------- 97 | Bottom 98 | ---------------*/ 99 | 100 | .ui.bottom.nags, 101 | .ui.bottom.nag { 102 | border-radius: 0.28571429rem 0.28571429rem 0em 0em; 103 | top: auto; 104 | bottom: 0em; 105 | } 106 | 107 | /*-------------- 108 | White 109 | ---------------*/ 110 | 111 | .ui.inverted.nags .nag, 112 | .ui.inverted.nag { 113 | background-color: #f3f4f5; 114 | color: rgba(0, 0, 0, 0.85); 115 | } 116 | .ui.inverted.nags .nag .close, 117 | .ui.inverted.nags .nag .title, 118 | .ui.inverted.nag .close, 119 | .ui.inverted.nag .title { 120 | color: rgba(0, 0, 0, 0.4); 121 | } 122 | 123 | 124 | /******************************* 125 | Groups 126 | *******************************/ 127 | 128 | .ui.nags .nag { 129 | border-radius: 0em !important; 130 | } 131 | .ui.nags .nag:last-child { 132 | border-radius: 0em 0em 0.28571429rem 0.28571429rem; 133 | } 134 | .ui.bottom.nags .nag:last-child { 135 | border-radius: 0.28571429rem 0.28571429rem 0em 0em; 136 | } 137 | 138 | 139 | /******************************* 140 | Theme Overrides 141 | *******************************/ 142 | 143 | 144 | 145 | /******************************* 146 | User Overrides 147 | *******************************/ 148 | 149 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/modules/_popup.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Popup 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Popup 15 | *******************************/ 16 | 17 | .ui.popup { 18 | display: none; 19 | position: absolute; 20 | top: 0px; 21 | right: 0px; 22 | 23 | /* Fixes content being squished when inline (moz only) */ 24 | min-width: -webkit-min-content; 25 | min-width: -moz-min-content; 26 | min-width: min-content; 27 | z-index: 1900; 28 | border: 1px solid #d4d4d5; 29 | line-height: 1.4285em; 30 | max-width: 250px; 31 | background-color: #ffffff; 32 | padding: 0.833em 1em; 33 | font-weight: normal; 34 | font-style: normal; 35 | color: rgba(0, 0, 0, 0.87); 36 | border-radius: 0.28571429rem; 37 | box-shadow: 0px 2px 4px 0px rgba(34, 36, 38, 0.12), 0px 2px 10px 0px rgba(34, 36, 38, 0.08); 38 | } 39 | .ui.popup > .header { 40 | padding: 0em; 41 | font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; 42 | font-size: 1.125em; 43 | line-height: 1.2; 44 | font-weight: bold; 45 | } 46 | .ui.popup > .header + .content { 47 | padding-top: 0.5em; 48 | } 49 | .ui.popup:before { 50 | position: absolute; 51 | content: ''; 52 | width: 0.75em; 53 | height: 0.75em; 54 | background: #ffffff; 55 | -webkit-transform: rotate(45deg); 56 | -ms-transform: rotate(45deg); 57 | transform: rotate(45deg); 58 | z-index: 2; 59 | box-shadow: 1px 1px 0px 0px #bababc; 60 | } 61 | 62 | 63 | /******************************* 64 | Types 65 | *******************************/ 66 | 67 | 68 | /*-------------- 69 | Spacing 70 | ---------------*/ 71 | 72 | .ui.popup { 73 | margin: 0em; 74 | } 75 | 76 | /* Extending from Top */ 77 | .ui.top.popup { 78 | margin: 0em 0em 0.75em; 79 | } 80 | .ui.top.left.popup { 81 | -webkit-transform-origin: left bottom; 82 | -ms-transform-origin: left bottom; 83 | transform-origin: left bottom; 84 | } 85 | .ui.top.center.popup { 86 | -webkit-transform-origin: center bottom; 87 | -ms-transform-origin: center bottom; 88 | transform-origin: center bottom; 89 | } 90 | .ui.top.right.popup { 91 | -webkit-transform-origin: right bottom; 92 | -ms-transform-origin: right bottom; 93 | transform-origin: right bottom; 94 | } 95 | 96 | /* Extending from Vertical Center */ 97 | .ui.left.center.popup { 98 | margin: 0em 0.75em 0em 0em; 99 | -webkit-transform-origin: right 50%; 100 | -ms-transform-origin: right 50%; 101 | transform-origin: right 50%; 102 | } 103 | .ui.right.center.popup { 104 | margin: 0em 0em 0em 0.75em; 105 | -webkit-transform-origin: left 50%; 106 | -ms-transform-origin: left 50%; 107 | transform-origin: left 50%; 108 | } 109 | 110 | /* Extending from Bottom */ 111 | .ui.bottom.popup { 112 | margin: 0.75em 0em 0em; 113 | } 114 | .ui.bottom.left.popup { 115 | -webkit-transform-origin: left top; 116 | -ms-transform-origin: left top; 117 | transform-origin: left top; 118 | } 119 | .ui.bottom.center.popup { 120 | -webkit-transform-origin: center top; 121 | -ms-transform-origin: center top; 122 | transform-origin: center top; 123 | } 124 | .ui.bottom.right.popup { 125 | -webkit-transform-origin: right top; 126 | -ms-transform-origin: right top; 127 | transform-origin: right top; 128 | } 129 | 130 | /*-------------- 131 | Pointer 132 | ---------------*/ 133 | 134 | 135 | /*--- Below ---*/ 136 | 137 | .ui.bottom.center.popup:before { 138 | margin-left: -0.325em; 139 | top: -0.325em; 140 | left: 50%; 141 | right: auto; 142 | bottom: auto; 143 | box-shadow: -1px -1px 0px 0px #bababc; 144 | } 145 | .ui.bottom.left.popup { 146 | margin-left: 0em; 147 | } 148 | .ui.bottom.left.popup:before { 149 | top: -0.325em; 150 | left: 1em; 151 | right: auto; 152 | bottom: auto; 153 | margin-left: 0em; 154 | box-shadow: -1px -1px 0px 0px #bababc; 155 | } 156 | .ui.bottom.right.popup { 157 | margin-right: 0em; 158 | } 159 | .ui.bottom.right.popup:before { 160 | top: -0.325em; 161 | right: 1em; 162 | bottom: auto; 163 | left: auto; 164 | margin-left: 0em; 165 | box-shadow: -1px -1px 0px 0px #bababc; 166 | } 167 | 168 | /*--- Above ---*/ 169 | 170 | .ui.top.center.popup:before { 171 | top: auto; 172 | right: auto; 173 | bottom: -0.325em; 174 | left: 50%; 175 | margin-left: -0.325em; 176 | } 177 | .ui.top.left.popup { 178 | margin-left: 0em; 179 | } 180 | .ui.top.left.popup:before { 181 | bottom: -0.325em; 182 | left: 1em; 183 | top: auto; 184 | right: auto; 185 | margin-left: 0em; 186 | } 187 | .ui.top.right.popup { 188 | margin-right: 0em; 189 | } 190 | .ui.top.right.popup:before { 191 | bottom: -0.325em; 192 | right: 1em; 193 | top: auto; 194 | left: auto; 195 | margin-left: 0em; 196 | } 197 | 198 | /*--- Left Center ---*/ 199 | 200 | .ui.left.center.popup:before { 201 | top: 50%; 202 | right: -0.325em; 203 | bottom: auto; 204 | left: auto; 205 | margin-top: -0.325em; 206 | box-shadow: 1px -1px 0px 0px #bababc; 207 | } 208 | 209 | /*--- Right Center ---*/ 210 | 211 | .ui.right.center.popup:before { 212 | top: 50%; 213 | left: -0.325em; 214 | bottom: auto; 215 | right: auto; 216 | margin-top: -0.325em; 217 | box-shadow: -1px 1px 0px 0px #bababc; 218 | } 219 | 220 | 221 | /******************************* 222 | Coupling 223 | *******************************/ 224 | 225 | 226 | /* Immediate Nested Grid */ 227 | .ui.popup > .ui.grid:not(.padded) { 228 | width: calc(100% + 1.75rem); 229 | margin: -0.7rem -0.875rem; 230 | } 231 | 232 | 233 | /******************************* 234 | States 235 | *******************************/ 236 | 237 | .ui.loading.popup { 238 | display: block; 239 | visibility: hidden; 240 | z-index: -1; 241 | } 242 | .ui.animating.popup, 243 | .ui.visible.popup { 244 | display: block; 245 | } 246 | .ui.visible.popup { 247 | -webkit-transform: translateZ(0px); 248 | transform: translateZ(0px); 249 | -webkit-backface-visibility: hidden; 250 | backface-visibility: hidden; 251 | } 252 | 253 | 254 | /******************************* 255 | Variations 256 | *******************************/ 257 | 258 | 259 | /*-------------- 260 | Basic 261 | ---------------*/ 262 | 263 | .ui.basic.popup:before { 264 | display: none; 265 | } 266 | 267 | /*-------------- 268 | Wide 269 | ---------------*/ 270 | 271 | .ui.wide.popup { 272 | max-width: 350px; 273 | } 274 | .ui[class*="very wide"].popup { 275 | max-width: 550px; 276 | } 277 | @media only screen and (max-width: 767px) { 278 | .ui.wide.popup, 279 | .ui[class*="very wide"].popup { 280 | max-width: 250px; 281 | } 282 | } 283 | 284 | /*-------------- 285 | Fluid 286 | ---------------*/ 287 | 288 | .ui.fluid.popup { 289 | width: 100%; 290 | max-width: none; 291 | } 292 | 293 | /*-------------- 294 | Colors 295 | ---------------*/ 296 | 297 | 298 | /* Inverted colors */ 299 | .ui.inverted.popup { 300 | background: #1b1c1d; 301 | color: #ffffff; 302 | border: none; 303 | box-shadow: none; 304 | } 305 | .ui.inverted.popup .header { 306 | background-color: none; 307 | color: #ffffff; 308 | } 309 | .ui.inverted.popup:before { 310 | background-color: #1b1c1d; 311 | box-shadow: none !important; 312 | } 313 | 314 | /*-------------- 315 | Flowing 316 | ---------------*/ 317 | 318 | .ui.flowing.popup { 319 | max-width: none; 320 | } 321 | 322 | /*-------------- 323 | Sizes 324 | ---------------*/ 325 | 326 | .ui.mini.popup { 327 | font-size: 0.71428571rem; 328 | } 329 | .ui.tiny.popup { 330 | font-size: 0.85714286rem; 331 | } 332 | .ui.small.popup { 333 | font-size: 0.92857143rem; 334 | } 335 | .ui.popup { 336 | font-size: 1rem; 337 | } 338 | .ui.large.popup { 339 | font-size: 1.14285714rem; 340 | } 341 | .ui.huge.popup { 342 | font-size: 1.42857143rem; 343 | } 344 | 345 | 346 | /******************************* 347 | Theme Overrides 348 | *******************************/ 349 | 350 | 351 | 352 | /******************************* 353 | User Overrides 354 | *******************************/ 355 | 356 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/modules/_shape.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Shape 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Shape 15 | *******************************/ 16 | 17 | .ui.shape { 18 | position: relative; 19 | vertical-align: top; 20 | display: inline-block; 21 | -webkit-perspective: 2000px; 22 | perspective: 2000px; 23 | -webkit-transition: -webkit-transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; 24 | transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; 25 | } 26 | .ui.shape .sides { 27 | -webkit-transform-style: preserve-3d; 28 | transform-style: preserve-3d; 29 | } 30 | .ui.shape .side { 31 | opacity: 1; 32 | width: 100%; 33 | margin: 0em !important; 34 | -webkit-backface-visibility: hidden; 35 | backface-visibility: hidden; 36 | } 37 | .ui.shape .side { 38 | display: none; 39 | } 40 | .ui.shape .side * { 41 | -webkit-backface-visibility: visible !important; 42 | backface-visibility: visible !important; 43 | } 44 | 45 | 46 | /******************************* 47 | Types 48 | *******************************/ 49 | 50 | .ui.cube.shape .side { 51 | min-width: 15em; 52 | height: 15em; 53 | padding: 2em; 54 | background-color: #e6e6e6; 55 | color: rgba(0, 0, 0, 0.87); 56 | box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.3); 57 | } 58 | .ui.cube.shape .side > .content { 59 | width: 100%; 60 | height: 100%; 61 | display: table; 62 | text-align: center; 63 | -webkit-user-select: text; 64 | -moz-user-select: text; 65 | -ms-user-select: text; 66 | user-select: text; 67 | } 68 | .ui.cube.shape .side > .content > div { 69 | display: table-cell; 70 | vertical-align: middle; 71 | font-size: 2em; 72 | } 73 | 74 | 75 | /******************************* 76 | Variations 77 | *******************************/ 78 | 79 | .ui.text.shape.animating .sides { 80 | position: static; 81 | } 82 | .ui.text.shape .side { 83 | white-space: nowrap; 84 | } 85 | .ui.text.shape .side > * { 86 | white-space: normal; 87 | } 88 | 89 | 90 | /******************************* 91 | States 92 | *******************************/ 93 | 94 | 95 | /*-------------- 96 | Loading 97 | ---------------*/ 98 | 99 | .ui.loading.shape { 100 | position: absolute; 101 | top: -9999px; 102 | left: -9999px; 103 | } 104 | 105 | /*-------------- 106 | Animating 107 | ---------------*/ 108 | 109 | .ui.shape .animating.side { 110 | position: absolute; 111 | top: 0px; 112 | left: 0px; 113 | display: block; 114 | z-index: 100; 115 | } 116 | .ui.shape .hidden.side { 117 | opacity: 0.6; 118 | } 119 | 120 | /*-------------- 121 | CSS 122 | ---------------*/ 123 | 124 | .ui.shape.animating .sides { 125 | position: absolute; 126 | } 127 | .ui.shape.animating .sides { 128 | -webkit-transition: -webkit-transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; 129 | transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out; 130 | } 131 | .ui.shape.animating .side { 132 | -webkit-transition: opacity 0.6s ease-in-out; 133 | transition: opacity 0.6s ease-in-out; 134 | } 135 | 136 | /*-------------- 137 | Active 138 | ---------------*/ 139 | 140 | .ui.shape .active.side { 141 | display: block; 142 | } 143 | 144 | 145 | /******************************* 146 | Theme Overrides 147 | *******************************/ 148 | 149 | 150 | 151 | /******************************* 152 | User Overrides 153 | *******************************/ 154 | 155 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/modules/_sticky.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Sticky 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Sticky 15 | *******************************/ 16 | 17 | .ui.sticky { 18 | position: static; 19 | -webkit-transition: none; 20 | transition: none; 21 | z-index: 800; 22 | } 23 | 24 | 25 | /******************************* 26 | States 27 | *******************************/ 28 | 29 | 30 | /* Bound */ 31 | .ui.sticky.bound { 32 | position: absolute; 33 | left: auto; 34 | right: auto; 35 | } 36 | 37 | /* Fixed */ 38 | .ui.sticky.fixed { 39 | position: fixed; 40 | left: auto; 41 | right: auto; 42 | } 43 | 44 | /* Bound/Fixed Position */ 45 | .ui.sticky.bound.top, 46 | .ui.sticky.fixed.top { 47 | top: 0px; 48 | bottom: auto; 49 | } 50 | .ui.sticky.bound.bottom, 51 | .ui.sticky.fixed.bottom { 52 | top: auto; 53 | bottom: 0px; 54 | } 55 | 56 | 57 | /******************************* 58 | Types 59 | *******************************/ 60 | 61 | .ui.native.sticky { 62 | position: -webkit-sticky; 63 | position: -moz-sticky; 64 | position: -ms-sticky; 65 | position: -o-sticky; 66 | position: sticky; 67 | } 68 | 69 | 70 | /******************************* 71 | Theme Overrides 72 | *******************************/ 73 | 74 | 75 | 76 | /******************************* 77 | Site Overrides 78 | *******************************/ 79 | 80 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/modules/_tab.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Tab 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | UI Tabs 15 | *******************************/ 16 | 17 | .ui.tab { 18 | display: none; 19 | } 20 | 21 | 22 | /******************************* 23 | States 24 | *******************************/ 25 | 26 | 27 | /*-------------------- 28 | Active 29 | ---------------------*/ 30 | 31 | .ui.tab.active, 32 | .ui.tab.open { 33 | display: block; 34 | } 35 | 36 | /*-------------------- 37 | Loading 38 | ---------------------*/ 39 | 40 | .ui.tab.loading { 41 | position: relative; 42 | overflow: hidden; 43 | display: block; 44 | min-height: 250px; 45 | } 46 | .ui.tab.loading * { 47 | position: relative !important; 48 | left: -10000px !important; 49 | } 50 | .ui.tab.loading:before, 51 | .ui.tab.loading.segment:before { 52 | position: absolute; 53 | content: ''; 54 | top: 100px; 55 | left: 50%; 56 | margin: -1.25em 0em 0em -1.25em; 57 | width: 2.5em; 58 | height: 2.5em; 59 | border-radius: 500rem; 60 | border: 0.2em solid rgba(0, 0, 0, 0.1); 61 | } 62 | .ui.tab.loading:after, 63 | .ui.tab.loading.segment:after { 64 | position: absolute; 65 | content: ''; 66 | top: 100px; 67 | left: 50%; 68 | margin: -1.25em 0em 0em -1.25em; 69 | width: 2.5em; 70 | height: 2.5em; 71 | -webkit-animation: button-spin 0.6s linear; 72 | animation: button-spin 0.6s linear; 73 | -webkit-animation-iteration-count: infinite; 74 | animation-iteration-count: infinite; 75 | border-radius: 500rem; 76 | border-color: #767676 transparent transparent; 77 | border-style: solid; 78 | border-width: 0.2em; 79 | box-shadow: 0px 0px 0px 1px transparent; 80 | } 81 | 82 | 83 | /******************************* 84 | Tab Overrides 85 | *******************************/ 86 | 87 | 88 | 89 | /******************************* 90 | User Overrides 91 | *******************************/ 92 | 93 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/modules/_video.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 1.12.3 - Video 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2014 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Video 15 | *******************************/ 16 | 17 | .ui.video { 18 | background-color: #dddddd; 19 | position: relative; 20 | max-width: 100%; 21 | padding-bottom: 56.25%; 22 | height: 0px; 23 | overflow: hidden; 24 | } 25 | 26 | /*-------------- 27 | Content 28 | ---------------*/ 29 | 30 | 31 | /* Placeholder Image */ 32 | .ui.video .placeholder { 33 | background-color: #333333; 34 | } 35 | 36 | /* Play Icon Overlay */ 37 | .ui.video .play { 38 | cursor: pointer; 39 | position: absolute; 40 | top: 0px; 41 | left: 0px; 42 | z-index: 10; 43 | width: 100%; 44 | height: 100%; 45 | opacity: 0.8; 46 | -webkit-transition: opacity 0.3s; 47 | transition: opacity 0.3s; 48 | } 49 | .ui.video .play.icon:before { 50 | position: absolute; 51 | top: 50%; 52 | left: 50%; 53 | z-index: 11; 54 | background: rgba(0, 0, 0, 0.3); 55 | width: 8rem; 56 | height: 8rem; 57 | line-height: 8rem; 58 | border-radius: 500rem; 59 | color: #ffffff; 60 | font-size: 8rem; 61 | text-shadow: none; 62 | -webkit-transform: translateX(-50%) translateY(-50%); 63 | -ms-transform: translateX(-50%) translateY(-50%); 64 | transform: translateX(-50%) translateY(-50%); 65 | } 66 | .ui.video .placeholder { 67 | position: absolute; 68 | top: 0px; 69 | left: 0px; 70 | display: block; 71 | width: 100%; 72 | height: 100%; 73 | } 74 | 75 | /* IFrame Embed */ 76 | .ui.video .embed iframe, 77 | .ui.video .embed embed, 78 | .ui.video .embed object { 79 | position: absolute; 80 | border: none; 81 | width: 100%; 82 | height: 100%; 83 | top: 0px; 84 | left: 0px; 85 | margin: 0em; 86 | padding: 0em; 87 | } 88 | 89 | 90 | /******************************* 91 | States 92 | *******************************/ 93 | 94 | 95 | /*-------------- 96 | Hover 97 | ---------------*/ 98 | 99 | .ui.video .play:hover { 100 | opacity: 1; 101 | } 102 | 103 | /*-------------- 104 | Active 105 | ---------------*/ 106 | 107 | .ui.video.active .play, 108 | .ui.video.active .placeholder { 109 | display: none; 110 | } 111 | .ui.video.active .embed { 112 | display: inline; 113 | } 114 | 115 | 116 | /******************************* 117 | Video Overrides 118 | *******************************/ 119 | 120 | 121 | 122 | /******************************* 123 | Site Overrides 124 | *******************************/ 125 | 126 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/views/_ad.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Ad 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2013 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Advertisement 15 | *******************************/ 16 | 17 | .ui.ad { 18 | display: block; 19 | overflow: hidden; 20 | margin: 1em 0em; 21 | } 22 | .ui.ad:first-child { 23 | margin: 0em; 24 | } 25 | .ui.ad:last-child { 26 | margin: 0em; 27 | } 28 | .ui.ad iframe { 29 | margin: 0em; 30 | padding: 0em; 31 | border: none; 32 | overflow: hidden; 33 | } 34 | 35 | /*-------------- 36 | Common 37 | ---------------*/ 38 | 39 | 40 | /* Leaderboard */ 41 | .ui.leaderboard.ad { 42 | width: 728px; 43 | height: 90px; 44 | } 45 | 46 | /* Medium Rectangle */ 47 | .ui[class*="medium rectangle"].ad { 48 | width: 300px; 49 | height: 250px; 50 | } 51 | 52 | /* Large Rectangle */ 53 | .ui[class*="large rectangle"].ad { 54 | width: 336px; 55 | height: 280px; 56 | } 57 | 58 | /* Half Page */ 59 | .ui[class*="half page"].ad { 60 | width: 300px; 61 | height: 600px; 62 | } 63 | 64 | /*-------------- 65 | Square 66 | ---------------*/ 67 | 68 | 69 | /* Square */ 70 | .ui.square.ad { 71 | width: 250px; 72 | height: 250px; 73 | } 74 | 75 | /* Small Square */ 76 | .ui[class*="small square"].ad { 77 | width: 200px; 78 | height: 200px; 79 | } 80 | 81 | /*-------------- 82 | Rectangle 83 | ---------------*/ 84 | 85 | 86 | /* Small Rectangle */ 87 | .ui[class*="small rectangle"].ad { 88 | width: 180px; 89 | height: 150px; 90 | } 91 | 92 | /* Vertical Rectangle */ 93 | .ui[class*="vertical rectangle"].ad { 94 | width: 240px; 95 | height: 400px; 96 | } 97 | 98 | /*-------------- 99 | Button 100 | ---------------*/ 101 | 102 | .ui.button.ad { 103 | width: 120px; 104 | height: 90px; 105 | } 106 | .ui[class*="square button"].ad { 107 | width: 125px; 108 | height: 125px; 109 | } 110 | .ui[class*="small button"].ad { 111 | width: 120px; 112 | height: 60px; 113 | } 114 | 115 | /*-------------- 116 | Skyscrapers 117 | ---------------*/ 118 | 119 | 120 | /* Skyscraper */ 121 | .ui.skyscraper.ad { 122 | width: 120px; 123 | height: 600px; 124 | } 125 | 126 | /* Wide Skyscraper */ 127 | .ui[class*="wide skyscraper"].ad { 128 | width: 160px; 129 | } 130 | 131 | /*-------------- 132 | Banners 133 | ---------------*/ 134 | 135 | 136 | /* Banner */ 137 | .ui.banner.ad { 138 | width: 468px; 139 | height: 60px; 140 | } 141 | 142 | /* Vertical Banner */ 143 | .ui[class*="vertical banner"].ad { 144 | width: 120px; 145 | height: 240px; 146 | } 147 | 148 | /* Top Banner */ 149 | .ui[class*="top banner"].ad { 150 | width: 930px; 151 | height: 180px; 152 | } 153 | 154 | /* Half Banner */ 155 | .ui[class*="half banner"].ad { 156 | width: 234px; 157 | height: 60px; 158 | } 159 | 160 | /*-------------- 161 | Boards 162 | ---------------*/ 163 | 164 | 165 | /* Leaderboard */ 166 | .ui[class*="large leaderboard"].ad { 167 | width: 970px; 168 | height: 90px; 169 | } 170 | 171 | /* Billboard */ 172 | .ui.billboard.ad { 173 | width: 970px; 174 | height: 250px; 175 | } 176 | 177 | /*-------------- 178 | Panorama 179 | ---------------*/ 180 | 181 | 182 | /* Panorama */ 183 | .ui.panorama.ad { 184 | width: 980px; 185 | height: 120px; 186 | } 187 | 188 | /*-------------- 189 | Netboard 190 | ---------------*/ 191 | 192 | 193 | /* Netboard */ 194 | .ui.netboard.ad { 195 | width: 580px; 196 | height: 400px; 197 | } 198 | 199 | /*-------------- 200 | Mobile 201 | ---------------*/ 202 | 203 | 204 | /* Large Mobile Banner */ 205 | .ui[class*="large mobile banner"].ad { 206 | width: 320px; 207 | height: 100px; 208 | } 209 | 210 | /* Mobile Leaderboard */ 211 | .ui[class*="mobile leaderboard"].ad { 212 | width: 320px; 213 | height: 50px; 214 | } 215 | 216 | 217 | /******************************* 218 | Types 219 | *******************************/ 220 | 221 | 222 | /* Mobile Sizes */ 223 | .ui.mobile.ad { 224 | display: none; 225 | } 226 | @media only screen and (max-width: 767px) { 227 | .ui.mobile.ad { 228 | display: block; 229 | } 230 | } 231 | 232 | 233 | /******************************* 234 | Variations 235 | *******************************/ 236 | 237 | .ui.centered.ad { 238 | margin-left: auto; 239 | margin-right: auto; 240 | } 241 | .ui.test.ad { 242 | position: relative; 243 | background: #545454; 244 | } 245 | .ui.test.ad:after { 246 | position: absolute; 247 | top: 50%; 248 | left: 50%; 249 | width: 100%; 250 | text-align: center; 251 | -webkit-transform: translateX(-50%) translateY(-50%); 252 | -ms-transform: translateX(-50%) translateY(-50%); 253 | transform: translateX(-50%) translateY(-50%); 254 | content: 'Ad'; 255 | color: #ffffff; 256 | font-size: 1em; 257 | font-weight: bold; 258 | } 259 | .ui.mobile.test.ad:after { 260 | font-size: 0.85714286em; 261 | } 262 | .ui.test.ad[data-text]:after { 263 | content: attr(data-text); 264 | } 265 | 266 | 267 | /******************************* 268 | Theme Overrides 269 | *******************************/ 270 | 271 | 272 | 273 | /******************************* 274 | User Variable Overrides 275 | *******************************/ 276 | 277 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/views/_all.scss: -------------------------------------------------------------------------------- 1 | @import 'ad'; 2 | @import 'card'; 3 | @import 'comment'; 4 | @import 'feed'; 5 | @import 'item'; 6 | @import 'statistic'; 7 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/views/_comment.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Comment 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Standard 15 | *******************************/ 16 | 17 | 18 | /*-------------- 19 | Comments 20 | ---------------*/ 21 | 22 | .ui.comments { 23 | margin: 1.5em 0em; 24 | max-width: 650px; 25 | } 26 | .ui.comments:first-child { 27 | margin-top: 0em; 28 | } 29 | .ui.comments:last-child { 30 | margin-bottom: 0em; 31 | } 32 | 33 | /*-------------- 34 | Comment 35 | ---------------*/ 36 | 37 | .ui.comments .comment { 38 | position: relative; 39 | background: none; 40 | margin: 0.5em 0em 0em; 41 | padding: 0.5em 0em 0em; 42 | border: none; 43 | border-top: none; 44 | line-height: 1.2; 45 | } 46 | .ui.comments .comment:first-child { 47 | margin-top: 0em; 48 | padding-top: 0em; 49 | } 50 | 51 | /*-------------------- 52 | Nested Comments 53 | ---------------------*/ 54 | 55 | .ui.comments .comment .comments { 56 | margin: 0em 0em 0.5em 0.5em; 57 | padding: 1em 0em 1em 1em; 58 | } 59 | .ui.comments .comment .comments:before { 60 | position: absolute; 61 | top: 0px; 62 | left: 0px; 63 | } 64 | .ui.comments .comment .comments .comment { 65 | border: none; 66 | border-top: none; 67 | background: none; 68 | } 69 | 70 | /*-------------- 71 | Avatar 72 | ---------------*/ 73 | 74 | .ui.comments .comment .avatar { 75 | display: block; 76 | width: 2.5em; 77 | height: auto; 78 | float: left; 79 | margin: 0.2em 0em 0em; 80 | } 81 | .ui.comments .comment img.avatar, 82 | .ui.comments .comment .avatar img { 83 | display: block; 84 | margin: 0em auto; 85 | width: 100%; 86 | height: 100%; 87 | border-radius: 0.25rem; 88 | } 89 | 90 | /*-------------- 91 | Content 92 | ---------------*/ 93 | 94 | .ui.comments .comment > .content { 95 | display: block; 96 | } 97 | 98 | /* If there is an avatar move content over */ 99 | .ui.comments .comment > .avatar ~ .content { 100 | margin-left: 3.5em; 101 | } 102 | 103 | /*-------------- 104 | Author 105 | ---------------*/ 106 | 107 | .ui.comments .comment .author { 108 | font-size: 1em; 109 | color: rgba(0, 0, 0, 0.87); 110 | font-weight: bold; 111 | } 112 | .ui.comments .comment a.author { 113 | cursor: pointer; 114 | } 115 | .ui.comments .comment a.author:hover { 116 | color: #1e70bf; 117 | } 118 | 119 | /*-------------- 120 | Metadata 121 | ---------------*/ 122 | 123 | .ui.comments .comment .metadata { 124 | display: inline-block; 125 | margin-left: 0.5em; 126 | color: rgba(0, 0, 0, 0.4); 127 | font-size: 0.875em; 128 | } 129 | .ui.comments .comment .metadata > * { 130 | display: inline-block; 131 | margin: 0em 0.5em 0em 0em; 132 | } 133 | .ui.comments .comment .metadata > :last-child { 134 | margin-right: 0em; 135 | } 136 | 137 | /*-------------------- 138 | Comment Text 139 | ---------------------*/ 140 | 141 | .ui.comments .comment .text { 142 | margin: 0.25em 0em 0.5em; 143 | font-size: 1em; 144 | word-wrap: break-word; 145 | color: rgba(0, 0, 0, 0.87); 146 | line-height: 1.3; 147 | } 148 | 149 | /*-------------------- 150 | User Actions 151 | ---------------------*/ 152 | 153 | .ui.comments .comment .actions { 154 | font-size: 0.875em; 155 | } 156 | .ui.comments .comment .actions a { 157 | cursor: pointer; 158 | display: inline-block; 159 | margin: 0em 0.75em 0em 0em; 160 | color: rgba(0, 0, 0, 0.4); 161 | } 162 | .ui.comments .comment .actions a:last-child { 163 | margin-right: 0em; 164 | } 165 | .ui.comments .comment .actions a.active, 166 | .ui.comments .comment .actions a:hover { 167 | color: rgba(0, 0, 0, 0.8); 168 | } 169 | 170 | /*-------------------- 171 | Reply Form 172 | ---------------------*/ 173 | 174 | .ui.comments > .reply.form { 175 | margin-top: 1em; 176 | } 177 | .ui.comments .comment .reply.form { 178 | width: 100%; 179 | margin-top: 1em; 180 | } 181 | .ui.comments .reply.form textarea { 182 | font-size: 1em; 183 | height: 12em; 184 | } 185 | 186 | 187 | /******************************* 188 | State 189 | *******************************/ 190 | 191 | .ui.collapsed.comments, 192 | .ui.comments .collapsed.comments, 193 | .ui.comments .collapsed.comment { 194 | display: none; 195 | } 196 | 197 | 198 | /******************************* 199 | Variations 200 | *******************************/ 201 | 202 | 203 | /*-------------------- 204 | Threaded 205 | ---------------------*/ 206 | 207 | .ui.threaded.comments .comment .comments { 208 | margin: -1.5em 0 -1em 1.25em; 209 | padding: 3em 0em 2em 2.25em; 210 | box-shadow: -1px 0px 0px rgba(34, 36, 38, 0.15); 211 | } 212 | 213 | /*-------------------- 214 | Minimal 215 | ---------------------*/ 216 | 217 | .ui.minimal.comments .comment .actions { 218 | opacity: 0; 219 | position: absolute; 220 | top: 0px; 221 | right: 0px; 222 | left: auto; 223 | -webkit-transition: opacity 0.2s ease; 224 | transition: opacity 0.2s ease; 225 | -webkit-transition-delay: 0.1s; 226 | transition-delay: 0.1s; 227 | } 228 | .ui.minimal.comments .comment > .content:hover > .actions { 229 | opacity: 1; 230 | } 231 | 232 | /*-------------------- 233 | Sizes 234 | ---------------------*/ 235 | 236 | .ui.small.comments { 237 | font-size: 0.9em; 238 | } 239 | .ui.comments { 240 | font-size: 1em; 241 | } 242 | .ui.large.comments { 243 | font-size: 1.1em; 244 | } 245 | .ui.huge.comments { 246 | font-size: 1.2em; 247 | } 248 | 249 | 250 | /******************************* 251 | Theme Overrides 252 | *******************************/ 253 | 254 | 255 | 256 | /******************************* 257 | User Variable Overrides 258 | *******************************/ 259 | 260 | -------------------------------------------------------------------------------- /v2/views/css/semantic-ui/views/_feed.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * # Semantic UI 2.1.3 - Feed 3 | * http://github.com/semantic-org/semantic-ui/ 4 | * 5 | * 6 | * Copyright 2015 Contributors 7 | * Released under the MIT license 8 | * http://opensource.org/licenses/MIT 9 | * 10 | */ 11 | 12 | 13 | /******************************* 14 | Activity Feed 15 | *******************************/ 16 | 17 | .ui.feed { 18 | margin: 1em 0em; 19 | } 20 | .ui.feed:first-child { 21 | margin-top: 0em; 22 | } 23 | .ui.feed:last-child { 24 | margin-bottom: 0em; 25 | } 26 | 27 | 28 | /******************************* 29 | Content 30 | *******************************/ 31 | 32 | 33 | /* Event */ 34 | .ui.feed > .event { 35 | display: -webkit-box; 36 | display: -webkit-flex; 37 | display: -ms-flexbox; 38 | display: flex; 39 | -webkit-box-orient: horizontal; 40 | -webkit-box-direction: normal; 41 | -webkit-flex-direction: row; 42 | -ms-flex-direction: row; 43 | flex-direction: row; 44 | width: 100%; 45 | padding: 0.21428571rem 0em; 46 | margin: 0em; 47 | background: none; 48 | border-top: none; 49 | } 50 | .ui.feed > .event:first-child { 51 | border-top: 0px; 52 | padding-top: 0em; 53 | } 54 | .ui.feed > .event:last-child { 55 | padding-bottom: 0em; 56 | } 57 | 58 | /* Event Label */ 59 | .ui.feed > .event > .label { 60 | display: block; 61 | -webkit-box-flex: 0; 62 | -webkit-flex: 0 0 auto; 63 | -ms-flex: 0 0 auto; 64 | flex: 0 0 auto; 65 | width: 2.5em; 66 | height: auto; 67 | -webkit-align-self: stretch; 68 | -ms-flex-item-align: stretch; 69 | align-self: stretch; 70 | text-align: left; 71 | } 72 | .ui.feed > .event > .label .icon { 73 | opacity: 1; 74 | font-size: 1.5em; 75 | width: 100%; 76 | padding: 0.25em; 77 | background: none; 78 | border: none; 79 | border-radius: none; 80 | color: rgba(0, 0, 0, 0.6); 81 | } 82 | .ui.feed > .event > .label img { 83 | width: 100%; 84 | height: auto; 85 | border-radius: 500rem; 86 | } 87 | .ui.feed > .event > .label + .content { 88 | margin: 0.5em 0em 0.35714286em 1.14285714em; 89 | } 90 | 91 | /*-------------- 92 | Content 93 | ---------------*/ 94 | 95 | 96 | /* Content */ 97 | .ui.feed > .event > .content { 98 | display: block; 99 | -webkit-box-flex: 1; 100 | -webkit-flex: 1 1 auto; 101 | -ms-flex: 1 1 auto; 102 | flex: 1 1 auto; 103 | -webkit-align-self: stretch; 104 | -ms-flex-item-align: stretch; 105 | align-self: stretch; 106 | text-align: left; 107 | word-wrap: break-word; 108 | } 109 | .ui.feed > .event:last-child > .content { 110 | padding-bottom: 0em; 111 | } 112 | 113 | /* Link */ 114 | .ui.feed > .event > .content a { 115 | cursor: pointer; 116 | } 117 | 118 | /*-------------- 119 | Date 120 | ---------------*/ 121 | 122 | .ui.feed > .event > .content .date { 123 | margin: -0.5rem 0em 0em; 124 | padding: 0em; 125 | font-weight: normal; 126 | font-size: 1em; 127 | font-style: normal; 128 | color: rgba(0, 0, 0, 0.4); 129 | } 130 | 131 | /*-------------- 132 | Summary 133 | ---------------*/ 134 | 135 | .ui.feed > .event > .content .summary { 136 | margin: 0em; 137 | font-size: 1em; 138 | font-weight: bold; 139 | color: rgba(0, 0, 0, 0.87); 140 | } 141 | 142 | /* Summary Image */ 143 | .ui.feed > .event > .content .summary img { 144 | display: inline-block; 145 | width: auto; 146 | height: 10em; 147 | margin: -0.25em 0.25em 0em 0em; 148 | border-radius: 0.25em; 149 | vertical-align: middle; 150 | } 151 | 152 | /*-------------- 153 | User 154 | ---------------*/ 155 | 156 | .ui.feed > .event > .content .user { 157 | display: inline-block; 158 | font-weight: bold; 159 | margin-right: 0em; 160 | vertical-align: baseline; 161 | } 162 | .ui.feed > .event > .content .user img { 163 | margin: -0.25em 0.25em 0em 0em; 164 | width: auto; 165 | height: 10em; 166 | vertical-align: middle; 167 | } 168 | 169 | /*-------------- 170 | Inline Date 171 | ---------------*/ 172 | 173 | 174 | /* Date inside Summary */ 175 | .ui.feed > .event > .content .summary > .date { 176 | display: inline-block; 177 | float: none; 178 | font-weight: normal; 179 | font-size: 0.85714286em; 180 | font-style: normal; 181 | margin: 0em 0em 0em 0.5em; 182 | padding: 0em; 183 | color: rgba(0, 0, 0, 0.4); 184 | } 185 | 186 | /*-------------- 187 | Extra Summary 188 | ---------------*/ 189 | 190 | .ui.feed > .event > .content .extra { 191 | margin: 0.5em 0em 0em; 192 | background: none; 193 | padding: 0em; 194 | color: rgba(0, 0, 0, 0.87); 195 | } 196 | 197 | /* Images */ 198 | .ui.feed > .event > .content .extra.images img { 199 | display: inline-block; 200 | margin: 0em 0.25em 0em 0em; 201 | width: 6em; 202 | } 203 | 204 | /* Text */ 205 | .ui.feed > .event > .content .extra.text { 206 | padding: 0em; 207 | border-left: none; 208 | font-size: 1em; 209 | max-width: 500px; 210 | line-height: 1.4285em; 211 | } 212 | 213 | /*-------------- 214 | Meta 215 | ---------------*/ 216 | 217 | .ui.feed > .event > .content .meta { 218 | display: inline-block; 219 | font-size: 0.85714286em; 220 | margin: 0.5em 0em 0em; 221 | background: none; 222 | border: none; 223 | border-radius: 0; 224 | box-shadow: none; 225 | padding: 0em; 226 | color: rgba(0, 0, 0, 0.6); 227 | } 228 | .ui.feed > .event > .content .meta > * { 229 | position: relative; 230 | margin-left: 0.75em; 231 | } 232 | .ui.feed > .event > .content .meta > *:after { 233 | content: ''; 234 | color: rgba(0, 0, 0, 0.2); 235 | top: 0em; 236 | left: -1em; 237 | opacity: 1; 238 | position: absolute; 239 | vertical-align: top; 240 | } 241 | .ui.feed > .event > .content .meta .like { 242 | color: ''; 243 | -webkit-transition: 0.2s color ease; 244 | transition: 0.2s color ease; 245 | } 246 | .ui.feed > .event > .content .meta .like:hover .icon { 247 | color: #ff2733; 248 | } 249 | .ui.feed > .event > .content .meta .active.like .icon { 250 | color: #ef404a; 251 | } 252 | 253 | /* First element */ 254 | .ui.feed > .event > .content .meta > :first-child { 255 | margin-left: 0em; 256 | } 257 | .ui.feed > .event > .content .meta > :first-child::after { 258 | display: none; 259 | } 260 | 261 | /* Action */ 262 | .ui.feed > .event > .content .meta a, 263 | .ui.feed > .event > .content .meta > .icon { 264 | cursor: pointer; 265 | opacity: 1; 266 | color: rgba(0, 0, 0, 0.5); 267 | -webkit-transition: color 0.1s ease; 268 | transition: color 0.1s ease; 269 | } 270 | .ui.feed > .event > .content .meta a:hover, 271 | .ui.feed > .event > .content .meta a:hover .icon, 272 | .ui.feed > .event > .content .meta > .icon:hover { 273 | color: rgba(0, 0, 0, 0.95); 274 | } 275 | 276 | 277 | /******************************* 278 | Variations 279 | *******************************/ 280 | 281 | .ui.small.feed { 282 | font-size: 0.92857143rem; 283 | } 284 | .ui.feed { 285 | font-size: 1rem; 286 | } 287 | .ui.large.feed { 288 | font-size: 1.14285714rem; 289 | } 290 | 291 | 292 | /******************************* 293 | Theme Overrides 294 | *******************************/ 295 | 296 | 297 | 298 | /******************************* 299 | User Variable Overrides 300 | *******************************/ 301 | 302 | -------------------------------------------------------------------------------- /v2/views/fonts/semantic-ui/icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/fonts/semantic-ui/icons.eot -------------------------------------------------------------------------------- /v2/views/fonts/semantic-ui/icons.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/fonts/semantic-ui/icons.otf -------------------------------------------------------------------------------- /v2/views/fonts/semantic-ui/icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/fonts/semantic-ui/icons.ttf -------------------------------------------------------------------------------- /v2/views/fonts/semantic-ui/icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/fonts/semantic-ui/icons.woff -------------------------------------------------------------------------------- /v2/views/fonts/semantic-ui/icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/fonts/semantic-ui/icons.woff2 -------------------------------------------------------------------------------- /v2/views/images/SampleNotification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/SampleNotification.png -------------------------------------------------------------------------------- /v2/views/images/bell-prenotify.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/bell-prenotify.jpg -------------------------------------------------------------------------------- /v2/views/images/bell.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/bell.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/SafariRequiredSettings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/SafariRequiredSettings.png -------------------------------------------------------------------------------- /v2/views/images/settings/SafariWebId.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/SafariWebId.png -------------------------------------------------------------------------------- /v2/views/images/settings/SampleNotification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/SampleNotification.png -------------------------------------------------------------------------------- /v2/views/images/settings/app_id-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/app_id-1.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/chrome-http.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/chrome-http.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/chrome-https.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/chrome-https.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/chrome-push.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/chrome-push.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/chrome-push.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/chrome-push.png -------------------------------------------------------------------------------- /v2/views/images/settings/create-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-1.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-10.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-2.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-3.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-4.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-5.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-6.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-7a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-7a.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-7b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-7b.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-8.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/create-9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/create-9.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/firefox-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/firefox-1.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/firefox-http.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/firefox-http.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/firefox-https.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/firefox-https.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/firefox-push.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/firefox-push.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/firefox-push.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/firefox-push.png -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-1-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-1-2.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-1.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-10.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-11.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-12.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-2.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-3-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-3-1.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-3.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-4.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-5.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-6.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-7.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-8.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/gcm-9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/gcm-9.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/http-permission-request-post-modal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/http-permission-request-post-modal.png -------------------------------------------------------------------------------- /v2/views/images/settings/http-prompt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/http-prompt.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/http-prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/http-prompt.png -------------------------------------------------------------------------------- /v2/views/images/settings/https-prompt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/https-prompt.png -------------------------------------------------------------------------------- /v2/views/images/settings/https-url.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/https-url.png -------------------------------------------------------------------------------- /v2/views/images/settings/keys-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/keys-1.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/keys-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/keys-2.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/keys-2b.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/keys-2b.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/keys-2c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/keys-2c.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/keys-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/keys-3.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/nb-unsubscribe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/nb-unsubscribe.png -------------------------------------------------------------------------------- /v2/views/images/settings/notify-button.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/notify-button.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/safari-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/safari-1.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/safari-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/safari-2.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/safari-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/safari-3.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/safari-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/safari-4.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/safari-https.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/safari-https.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/safari-prompt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/safari-prompt.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/safari-push.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/safari-push.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/safari-push.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/safari-push.png -------------------------------------------------------------------------------- /v2/views/images/settings/test.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/test.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/web-push.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/web-push.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/welcome-notification.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/welcome-notification.jpg -------------------------------------------------------------------------------- /v2/views/images/settings/widget.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OneSignal/OneSignal-WordPress-Plugin/4435fa9f2ed18bf487a7803800207ac946a85fbe/v2/views/images/settings/widget.jpg -------------------------------------------------------------------------------- /v2/views/index.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /v3/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to the OneSignal Wordpress Plugin 2 | 3 | :+1::tada: First off, thanks for taking the time to contribute! :tada::+1: 4 | 5 | ### How to Contribute 6 | We love the open source community and enjoy the support and contributions of many of our users. We ask that any potential contributors to the plugin follow the following guidelines: 7 | 8 | If your proposed contribution is a small bug fix, please feel free to create your own fork of the repository and create a pull request. 9 | 10 | If your contribution would _break_ or _change_ the functionality of the plugin, please reach out to us before you put in a lot of effort into a change we may not be able to use. We try our best to make sure that the plugin remains stable so that developers do not have to continually change their code, however some breaking changes _are_ desirable, so please get in touch to discuss your idea before you put in a lot of effort. 11 | 12 | #### Before Submitting A Bug Report 13 | Before creating bug reports, please check this list of steps to follow. 14 | 15 | 1. Make sure that you are actually encountering an _issue_ and not a _question_. If you simply have a question about the plugin, we would be more than happy to assist you in our Support section on the web (https://www.onesignal.com - click the Message button at the bottom right) 16 | 2. Please make sure to [include as many details as possible](#how-do-i-submit-a-good-bug-report) 17 | 18 | > **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one. 19 | 20 | 21 | #### How Do I Submit a Good Bug Report 22 | * **Use a clear and descriptive title** for the issue to identify the problem. 23 | * **Include Reproducibility** It is nearly always a good idea to include steps to reproduct the issue. If you cannot reliably reproduce the issue yourself, that's ok, but reproducible steps help best. 24 | * **Describe your environment**, tell us what version of the Unity OneSignal Plugin you are using, what version of Wordpress the issue occurs on, related code samples, and so on. 25 | * **Include log output/error messages** If your issue involves a crash/exception, ***PLEASE*** post the log output to help us identify the root issue. 26 | -------------------------------------------------------------------------------- /v3/LICENSE: -------------------------------------------------------------------------------- 1 | Modified MIT License 2 | 3 | Copyright 2024 OneSignal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | 1. The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | 2. All copies of substantial portions of the Software may only be used in connection 16 | with services provided by OneSignal. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | -------------------------------------------------------------------------------- /v3/README.md: -------------------------------------------------------------------------------- 1 | OneSignal WordPress Plugin - v3.0.0 2 | ==================================== 3 | [OneSignal WordPress Plugin 3.0 – Documentation](https://documentation.onesignal.com/docs/wordpress) 4 | 5 | ## Overview 6 | 7 | - 🚀 Initialises the latest OneSignal Web SDK (v16). 8 | - ⏩ Automatically sends Push Notifications when a WordPress post is published. 9 | - 💬 Setup [prompts](https://documentation.onesignal.com/docs/permission-requests) within the OneSignal dashboard. No custom code required. 10 | - 🧑‍🤝‍🧑 Choose which [Segment](https://documentation.onesignal.com/docs/segmentation) should recieve notifications for each post. 11 | - 📑 [Web Topics](https://documentation.onesignal.com/docs/web-push-topic-collapsing) included by default. 12 | - 📲 Send to mobile app subscribers, with an option to direct them to a different URL ([Deep Link](https://documentation.onesignal.com/docs/links#deep-linking)). 13 | -------------------------------------------------------------------------------- /v3/build_release.sh: -------------------------------------------------------------------------------- 1 | WORDPRESS_GIT_SRC_PATH="." 2 | DESTINATION_PATH="../onesignal-free-web-push-notifications/trunk/" 3 | RELEASE_ARCHIVE_FILENAME="onesignal-free-web-push-notifications.zip" 4 | 5 | # Prevent accidental rm -rf issues if running as root 6 | if (( EUID == 0 )); then 7 | echo "Please do not run this script as root for removing directory safety reasons." 8 | exit 1 9 | fi 10 | 11 | # Using exclude .* excludes dot files and dot directories like .git, .vscode 12 | if [[ $DESTINATION_PATH != *onesignal-free-web-push-notifications/trunk/ ]]; then 13 | echo "Script was going to remove ${DESTINATION_PATH}, but quitting because destination path unexpectedly does not end in ...onesignal-free-web-push-notifications/trunk/. Exiting to prevent removing unexpected directory." 14 | exit 1 15 | fi 16 | 17 | echo "Building Release Version of OneSignal WordPress Plugin" 18 | echo "──────────────────────────────────────────────────────" 19 | 20 | echo "Removing destination folder '${DESTINATION_PATH}'." 21 | rm -rf $DESTINATION_PATH 22 | 23 | echo "Creating new empty destination folder '${DESTINATION_PATH}'." 24 | mkdir -p $DESTINATION_PATH 25 | 26 | # The --delete option remove files from destination that are not present in source 27 | exclude_options=( 28 | "--exclude=.git/" 29 | "--exclude=.env" 30 | "--exclude=.gitignore" 31 | "--exclude=.github" 32 | "--exclude=.vscode/" 33 | "--exclude=build_release.sh" 34 | "--exclude=*.zip" 35 | "--exclude=onesignal-free-web-push-notifications" 36 | "--exclude=CONTRIBUTING.md" 37 | "--exclude=LICENSE" 38 | "--exclude=docker*" 39 | "--exclude=PluginDevDockerUsage.md" 40 | "--exclude=README.md" 41 | "--exclude=index.php" 42 | "--exclude=views/css/*.scss" 43 | "--exclude=views/css/callout.css" 44 | "--exclude=views/css/link.css" 45 | "--exclude=views/css/link.css" 46 | "--exclude=views/css/semantic-ui" 47 | ) 48 | rsync --archive --delete "${exclude_options[@]}" $WORDPRESS_GIT_SRC_PATH/ $DESTINATION_PATH 49 | 50 | echo "Creating archive of release contents as '${RELEASE_ARCHIVE_FILENAME}' in source directory '${WORDPRESS_GIT_SRC_PATH}'." 51 | cd $WORDPRESS_GIT_SRC_PATH 52 | zip -qr -x ".*" -x="build_release.sh" -x="*.zip" -x="onesignal-free-web-push-notifications" ${RELEASE_ARCHIVE_FILENAME} ./* 53 | cd - 54 | -------------------------------------------------------------------------------- /v3/index.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Generated by OneSignal 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /v3/onesignal-admin/onesignal-admin.css: -------------------------------------------------------------------------------- 1 | .toplevel_page_onesignal-admin-page #wpcontent { 2 | padding: 0; 3 | } 4 | 5 | .toplevel_page_onesignal-admin-page header { 6 | min-height: 125px; 7 | min-width: 100%; 8 | background-color: #14143c; 9 | display: flex; 10 | justify-content: center; 11 | } 12 | 13 | .toplevel_page_onesignal-admin-page header img { 14 | max-width: 225px; 15 | } 16 | 17 | .os-content { 18 | padding: 40px 60px 25px; 19 | font-size: 16px !important; 20 | line-height: 1.5rem; 21 | font-weight: 400; 22 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI;", Roboto, Helvetica, 23 | Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol" !important; 24 | } 25 | 26 | .api-key-badge { 27 | font-size: 12px; 28 | margin-left: 10px; 29 | } 30 | 31 | .api-key-type-rich { 32 | color: #eee; 33 | background-color: #14143c; 34 | border-radius: 5px; 35 | padding: 4px; 36 | } 37 | 38 | .api-key-type-legacy { 39 | color: #fff; 40 | background-color: rgb(155, 161, 167); 41 | border-radius: 5px; 42 | padding: 4px; 43 | } 44 | 45 | .os-content label { 46 | color: rgb(66, 77, 87); 47 | margin-bottom: 5px; 48 | display: inline-block; 49 | } 50 | 51 | .os-content label[for="appid"]:after, 52 | .os-content label[for="apikey"]:after { 53 | content: "*"; 54 | font-size: 125%; 55 | color: #e54b4d; 56 | margin-left: 3px; 57 | } 58 | 59 | .os-content label[for="apikey"] { 60 | margin-top: 20px; 61 | } 62 | 63 | .os-content input[type="text"] { 64 | display: block; 65 | font-size: 16px; 66 | height: 2.25rem; 67 | padding: 0.5rem 0.75rem; 68 | outline: none 0px; 69 | width: 100%; 70 | color: rgb(5, 27, 44); 71 | border-radius: 0.25rem; 72 | border: 1px solid rgb(203, 209, 215); 73 | } 74 | 75 | .os-content input[type="text"]:active, 76 | .os-content input[type="text"]:focus { 77 | border: 1px solid rgb(67, 70, 206); 78 | background: rgb(236, 236, 252); 79 | } 80 | 81 | .os-content .checkbox-wrapper { 82 | margin-top: 40px; 83 | } 84 | 85 | .os-content input[type="checkbox"] { 86 | opacity: 0; 87 | width: 0px !important; 88 | height: 0px; 89 | margin: 0px; 90 | min-width: unset !important; 91 | border: unset !important; 92 | } 93 | 94 | .os-content .checkbox { 95 | display: inline-block; 96 | position: relative; 97 | border-radius: 1rem; 98 | background-color: rgb(116, 128, 139); 99 | width: 1.5rem; 100 | height: 1rem; 101 | vertical-align: -2px; 102 | } 103 | 104 | .os-content .checkbox:after { 105 | content: ""; 106 | position: absolute; 107 | background-color: white; 108 | display: block; 109 | box-shadow: rgba(0, 0, 0, 0.15) 0px 4px 2px; 110 | border-radius: 50%; 111 | left: 0.125rem; 112 | top: 0.125rem; 113 | transition: all 0.3s ease 0s; 114 | width: 0.75rem; 115 | height: 0.75rem; 116 | } 117 | 118 | .os-content input[type="checkbox"]:checked + .checkbox:after { 119 | transform: translateX(-100%); 120 | left: calc(100% - 0.125rem); 121 | } 122 | 123 | .os-content input[type="checkbox"]:checked + .checkbox { 124 | background-color: rgb(67, 70, 206); 125 | } 126 | 127 | .os-content .help { 128 | min-width: 16px; 129 | width: 16px; 130 | height: 16px; 131 | filter: none; 132 | color: inherit; 133 | opacity: 1; 134 | display: inline-block; 135 | vertical-align: -2px; 136 | margin-left: 10px; 137 | cursor: pointer; 138 | } 139 | 140 | .os-content .information { 141 | box-shadow: rgba(5, 27, 44, 0.12) 0px 1px 6px -1px, 142 | rgba(5, 27, 44, 0.08) 0px 6px 18px -4px; 143 | border-radius: 0.25rem; 144 | border: 1px solid rgb(185, 194, 202); 145 | padding: 1rem 2rem; 146 | background-color: #eee; 147 | margin-bottom: 20px; 148 | margin-top: 20px; 149 | } 150 | 151 | .os-content input[type="submit"] { 152 | cursor: pointer; 153 | padding: 0.5rem 0.75rem; 154 | font-size: 1rem; 155 | border-radius: 0.25rem; 156 | background-color: rgb(67, 70, 206); 157 | line-height: 1.125rem; 158 | border: 1px solid rgb(58, 61, 179); 159 | box-shadow: rgba(5, 27, 44, 0.16) 0px 1px 1px, 160 | rgba(255, 255, 255, 0.05) 0px 1px 0px inset; 161 | color: rgb(255, 255, 255) !important; 162 | } 163 | 164 | .os-content input[type="submit"]:hover, 165 | .os-content input[type="submit"]:active, 166 | .os-content input[type="submit"]:focus { 167 | background-color: rgb(58, 61, 179); 168 | border-color: rgb(58, 61, 179); 169 | color: rgb(255, 255, 255) !important; 170 | } 171 | 172 | /* Wrap input and validation icon together */ 173 | .input-with-icon { 174 | position: relative; 175 | display: block; 176 | max-width: 500px; /* Set a max width for the input box */ 177 | margin-bottom: 20px; 178 | width: 100%; /* Make the input box responsive */ 179 | } 180 | 181 | .input-with-icon input[type="text"], 182 | .input-with-icon input[type="password"] { 183 | padding-left: 3rem; /* Leave space for the validation icon */ 184 | display: block; 185 | font-size: 16px; 186 | height: 2.25rem; 187 | outline: none; 188 | width: 100%; /* Ensure input box scales within the container */ 189 | color: rgb(5, 27, 44); 190 | border-radius: 0.25rem; 191 | border: 1px solid rgb(203, 209, 215); 192 | background: #fff; 193 | margin: 0 auto; /* Center the input box */ 194 | } 195 | 196 | .input-with-icon input[type="text"]:active, 197 | .input-with-icon input[type="text"]:focus, 198 | .input-with-icon input[type="password"]:active, 199 | .input-with-icon input[type="password"]:focus { 200 | border: 1px solid rgb(67, 70, 206); 201 | background: rgb(236, 236, 252); 202 | } 203 | 204 | /* Validation icon styling */ 205 | .validation-icon { 206 | position: absolute; 207 | top: 50%; 208 | left: 0.75rem; /* Position the icon at the left */ 209 | transform: translateY(-50%); 210 | font-size: 1.25rem; 211 | pointer-events: none; 212 | color: #e54b4d; /* Default error color */ 213 | } 214 | 215 | .input-with-icon input[type="text"]:not(:placeholder-shown):valid + .validation-icon, 216 | .input-with-icon input[type="password"]:not(:placeholder-shown):valid + .validation-icon { 217 | color: #28a745; /* Success color */ 218 | } 219 | 220 | /* Responsive adjustments */ 221 | @media (max-width: 768px) { 222 | .input-with-icon { 223 | max-width: 90%; /* Adjust for smaller screens */ 224 | } 225 | } 226 | 227 | @media (max-width: 480px) { 228 | .input-with-icon { 229 | max-width: 100%; /* Full width for very small screens */ 230 | } 231 | } 232 | -------------------------------------------------------------------------------- /v3/onesignal-admin/onesignal-admin.js: -------------------------------------------------------------------------------- 1 | window.addEventListener("DOMContentLoaded", () => { 2 | const sendToMobileHelpIcon = document.querySelector(".mobile-app .help"); 3 | const sendToMobileInfoDiv = document.querySelector(".mobile-app .information"); 4 | const utmParamsHelpIcon = document.querySelector(".utm-params .help"); 5 | const utmParamsInfoDiv = document.querySelector(".utm-params .information"); 6 | const customPostTypesHelpIcon = document.querySelector(".custom-post-types .help"); 7 | const customPostTypesInfoDiv = document.querySelector(".custom-post-types .information"); 8 | const notificationOnPostFromPluginHelpIcon = document.querySelector(".notification-on-post-from-plugin .help"); 9 | const notificationOnPostFromPluginInfoDiv = document.querySelector(".notification-on-post-from-plugin .information"); 10 | 11 | const setupToggleAction = (helpIcon, infoDiv) => { 12 | if (helpIcon && infoDiv) { 13 | helpIcon.addEventListener("click", () => { 14 | infoDiv.style.display = 15 | infoDiv.style.display === "none" ? "inherit" : "none"; 16 | }); 17 | } 18 | }; 19 | 20 | setupToggleAction(sendToMobileHelpIcon, sendToMobileInfoDiv); 21 | setupToggleAction(utmParamsHelpIcon, utmParamsInfoDiv); 22 | setupToggleAction(customPostTypesHelpIcon, customPostTypesInfoDiv); 23 | setupToggleAction(notificationOnPostFromPluginHelpIcon, notificationOnPostFromPluginInfoDiv); 24 | }); 25 | 26 | window.addEventListener("DOMContentLoaded", () => { 27 | const appIdInput = document.querySelector("#appid"); 28 | const apiKeyInput = document.querySelector("#apikey"); 29 | const utmInput = document.querySelector("#utm-params"); 30 | const autoSendCheckbox = document.querySelector("#auto-send"); 31 | const sendToMobileCheckbox = document.querySelector("#send-to-mobile"); 32 | const saveButton = document.querySelector("#save-settings-button"); 33 | const customPostTypesInput = document.querySelector("#custom-post-types"); 34 | const notificationOnPostFromPluginCheckbox = document.querySelector("#notification-on-post-from-plugin"); 35 | const notificationOnPageCheckbox = document.querySelector("#auto-send-pages"); 36 | 37 | const haveAllAdminInputsLoaded = appIdInput && 38 | apiKeyInput && 39 | autoSendCheckbox && 40 | sendToMobileCheckbox && 41 | utmInput && 42 | saveButton && 43 | customPostTypesInput && 44 | notificationOnPostFromPluginCheckbox && 45 | notificationOnPageCheckbox; 46 | 47 | if (haveAllAdminInputsLoaded) { 48 | const initialAppId = appIdInput.value; 49 | const initialApiKey = apiKeyInput.value; 50 | const initialUtmInput = utmInput.value; 51 | const initialAutoSend = autoSendCheckbox.checked; 52 | const initialSendToMobile = sendToMobileCheckbox.checked; 53 | const initialCustomPostTypes = customPostTypesInput.value; 54 | const initialNotificationOnPostFromPlugin = notificationOnPostFromPluginCheckbox.checked; 55 | const initialNotificationOnPage = notificationOnPageCheckbox.checked; 56 | 57 | function isValidUUID(uuid) { 58 | const uuidRegex = 59 | /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; 60 | return uuid.length > 0 && uuidRegex.test(uuid); // Ensure it's not empty and matches regex 61 | } 62 | 63 | function isValidApiKey(apiKey) { 64 | const base64Regex = 65 | /^(?:[A-Za-z0-9+/]{4}){12,}(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/; // At least 48 characters in Base64 66 | const opaqueTokenRegex = /^os_v[2-9]_app_[2-7a-z]{56,}$/; 67 | return ( 68 | base64Regex.test(apiKey) || opaqueTokenRegex.test(apiKey) 69 | ); // Ensure it's not empty and matches regex 70 | } 71 | 72 | function updateValidationIcon(input, isValid) { 73 | const icon = input.parentElement.querySelector(".validation-icon"); 74 | if (icon) { 75 | icon.textContent = isValid ? "✅" : "❌"; 76 | } 77 | } 78 | 79 | function hasFormChanged() { 80 | const appIdChanged = appIdInput.value !== initialAppId; 81 | const apiKeyChanged = apiKeyInput.value !== initialApiKey; 82 | const utmChanged = utmInput.value !== initialUtmInput; 83 | const autoSendChanged = autoSendCheckbox.checked !== initialAutoSend; 84 | const sendToMobileChanged = sendToMobileCheckbox.checked !== initialSendToMobile; 85 | const customPostTypesChanged = customPostTypesInput.value !== initialCustomPostTypes; 86 | const notificationOnPostFromPluginChanged = notificationOnPostFromPluginCheckbox.checked !== initialNotificationOnPostFromPlugin; 87 | const notificationOnPageChanged = notificationOnPageCheckbox.checked !== initialNotificationOnPage; 88 | 89 | return appIdChanged || 90 | apiKeyChanged || 91 | autoSendChanged || 92 | sendToMobileChanged || 93 | utmChanged || 94 | customPostTypesChanged || 95 | notificationOnPostFromPluginChanged || 96 | notificationOnPageChanged; 97 | } 98 | 99 | function toggleSaveButton() { 100 | const appIdValid = isValidUUID(appIdInput.value); 101 | const apiKeyValid = apiKeyInput.value.length == 0 || isValidApiKey(apiKeyInput.value); 102 | const formChanged = hasFormChanged(); 103 | 104 | // Enable button if either text inputs are valid or toggles have changed 105 | const enabled = formChanged && appIdValid && apiKeyValid; 106 | saveButton.disabled = !enabled; 107 | } 108 | 109 | appIdInput.addEventListener("input", () => { 110 | const isValid = isValidUUID(appIdInput.value); 111 | updateValidationIcon(appIdInput, isValid); 112 | toggleSaveButton(); 113 | }); 114 | 115 | apiKeyInput.addEventListener("input", () => { 116 | const isValid = isValidApiKey(apiKeyInput.value); 117 | updateValidationIcon(apiKeyInput, isValid); 118 | toggleSaveButton(); 119 | }); 120 | 121 | utmInput.addEventListener("input", toggleSaveButton); 122 | autoSendCheckbox.addEventListener("change", toggleSaveButton); 123 | sendToMobileCheckbox.addEventListener("change", toggleSaveButton); 124 | customPostTypesInput.addEventListener("input", toggleSaveButton); 125 | notificationOnPostFromPluginCheckbox.addEventListener("change", toggleSaveButton); 126 | notificationOnPageCheckbox.addEventListener("change", toggleSaveButton); 127 | 128 | // Initial state on page load 129 | toggleSaveButton(); 130 | } 131 | }); 132 | -------------------------------------------------------------------------------- /v3/onesignal-helpers.php: -------------------------------------------------------------------------------- 1 | = PHP 5.4, ENT_HTML401 | ENT_QUOTES will correctly decode most entities including both double and single quotes. 22 | In PHP 5.3, ENT_HTML401 does not exist, so we have to use `str_replace("'","'", $value)` before feeding it to html_entity_decode(). */ 23 | function decode_entities($string) { 24 | $HTML_ENTITY_DECODE_FLAGS = ENT_QUOTES; 25 | if (defined('ENT_HTML401')) { 26 | $HTML_ENTITY_DECODE_FLAGS = ENT_HTML401 | $HTML_ENTITY_DECODE_FLAGS; 27 | } 28 | return html_entity_decode(str_replace([''', ''', ''', '"'], '\'', $string), $HTML_ENTITY_DECODE_FLAGS, 'UTF-8'); 29 | } 30 | 31 | function sanitize_content_for_excerpt($content) { 32 | $decoded = wp_specialchars_decode($content); 33 | $stripped_slashes = stripslashes_deep($decoded); 34 | $cleaned_content = wp_strip_all_tags(strip_shortcodes($stripped_slashes)); 35 | return $cleaned_content; 36 | } 37 | 38 | function onesignal_is_post_type_allowed($post_type) { 39 | if ($post_type === 'post') return true; 40 | 41 | $settings = get_option("OneSignalWPSetting"); 42 | 43 | if($post_type === 'page' && !empty($settings['notification_on_page'])) return true; 44 | 45 | if (empty($settings['allowed_custom_post_types'])) return false; 46 | 47 | $allowed_post_types = array_map('trim', explode(',', $settings['allowed_custom_post_types'])); 48 | return in_array($post_type, $allowed_post_types); 49 | } 50 | -------------------------------------------------------------------------------- /v3/onesignal-init.php: -------------------------------------------------------------------------------- 1 | 15 | 16 | 48 | { 2 | const sendPost = document.getElementById("os_update"); 3 | const optionsWrap = document.getElementById("os_options"); 4 | const customisePost = document.getElementById("os_customise"); 5 | const customiseWrap = document.getElementById("os_customisations"); 6 | 7 | // Guard against missing elements 8 | if (!sendPost || !optionsWrap || !customisePost || !customiseWrap) { 9 | console.error("OneSignal: required elements are missing in the DOM."); 10 | return; 11 | } 12 | 13 | const customiseWrapChild = customiseWrap.querySelectorAll("input"); 14 | 15 | function setDisplay(elem, checked) { 16 | elem.style.display = checked ? "inherit" : "none"; 17 | } 18 | 19 | function setDisabled(children, disabled) { 20 | children.forEach((child) => (child.disabled = disabled)); 21 | } 22 | 23 | function updateUI() { 24 | setDisplay(optionsWrap, sendPost.checked); 25 | setDisplay(customiseWrap, customisePost.checked); 26 | setDisabled(customiseWrapChild, !customisePost.checked); 27 | } 28 | 29 | updateUI(); 30 | 31 | sendPost.addEventListener("change", updateUI); 32 | customisePost.addEventListener("change", updateUI); 33 | 34 | let wasSaving = false; 35 | 36 | /* 37 | * Uncheck the "Send notification when post is published or updated" input whenever the post is published 38 | * This is to prevent users from accidentally sending notifications on subsequent updates 39 | * Instead, the user needs to opt-in again to send a notification when a post is updated 40 | */ 41 | if (isGutenbergEditorLoaded()) { 42 | // Gutenberg editor 43 | wp.data.subscribe(() => { 44 | const isSaving = wp?.data?.select('core/editor')?.isSavingPost(); 45 | const postStatus = wp?.data?.select('core/editor')?.getCurrentPost()?.status; 46 | 47 | // Check if the post has finished saving successfully and is published 48 | if (wasSaving && !isSaving && postStatus === 'publish') { 49 | if (sendPost && sendPost.checked) { 50 | sendPost.checked = false; 51 | updateUI(); 52 | } 53 | } 54 | 55 | // reset state for the next check 56 | wasSaving = isSaving; 57 | }); 58 | } else { 59 | // Classic editor 60 | jQuery(document).ready(function($) { 61 | /* 62 | * The classic editor doesn't have the same hooks as the Gutenberg editor 63 | * It also refreshes the page after saving, so we need to persist the "just published" state across page reloads 64 | */ 65 | if (sessionStorage.getItem('onesignal_just_published')) { 66 | if (sendPost && sendPost.checked) { 67 | sendPost.checked = false; 68 | updateUI(); 69 | } 70 | sessionStorage.removeItem('onesignal_just_published'); 71 | } 72 | 73 | $('#publish').click(function() { 74 | if (sendPost && sendPost.checked) { 75 | // Set flag before page refresh 76 | sessionStorage.setItem('onesignal_just_published', 'true'); 77 | } 78 | }); 79 | }); 80 | } 81 | }); 82 | 83 | function isGutenbergEditorLoaded() { 84 | return ( wp?.data !== undefined && wp?.data?.select( 'core/editor' ) !== undefined ); 85 | } 86 | -------------------------------------------------------------------------------- /v3/onesignal-metabox/onesignal-metabox.php: -------------------------------------------------------------------------------- 1 | ID, 'os_meta', true); 25 | if (!is_array($os_meta)) { 26 | $os_meta = array(); 27 | } 28 | 29 | // View segments API to populate Segments list. 30 | $args = array( 31 | 'headers' => array( 32 | 'Authorization' => 'Bearer ' . get_option('OneSignalWPSetting')['app_rest_api_key'], 33 | 'accept' => 'application/json', 34 | 'content-type' => 'application/json', 35 | ) 36 | ); 37 | 38 | // Make the API request, log errors, get segment names. 39 | $response = wp_remote_get('https://onesignal.com/api/v1/apps/' . get_option('OneSignalWPSetting')['app_id'] . '/segments', $args); 40 | 41 | if (is_wp_error($response)) { 42 | error_log('API request failed: ' . $response->get_error_message()); 43 | $json = null; // Handle error case 44 | } else { 45 | $body = wp_remote_retrieve_body($response); 46 | $json = json_decode($body); 47 | 48 | // Check if segments exist and are an array 49 | if (!isset($json->segments) || !is_array($json->segments)) { 50 | error_log('Unexpected API response: Missing or invalid key'); 51 | $json = null; 52 | } 53 | } 54 | 55 | // Meta box content -> js file hides sections depending on whats checked. 56 | ?> 57 | 68 |
69 | 70 | 85 |
86 | 88 |
89 | 90 | 91 | 92 | 93 |
94 | 95 |
96 | 97 | 98 | 99 |
100 | 101 | os_update; 17 | 18 | // do not send notification if not enabled 19 | if (empty($update)) { 20 | return; 21 | } 22 | 23 | // set api params 24 | $title = !empty($_POST['os_title']) ? sanitize_text_field($_POST['os_title']) : decode_entities(get_bloginfo('name')); 25 | $content = !empty($_POST['os_content']) ? sanitize_text_field($_POST['os_content']) : $post->post_title; 26 | $excerpt = sanitize_content_for_excerpt($content); 27 | $segment = $_POST['os_segment'] ?? 'All'; 28 | $config_utm_additional_url_params = $onesignal_wp_settings['utm_additional_url_params'] ?? ''; 29 | 30 | $url = get_permalink($post->ID); 31 | if (!empty($config_utm_additional_url_params)) { 32 | // validate and encode the URL parameters 33 | $params = urlencode($config_utm_additional_url_params); 34 | $url = $url . (strpos($url, '?') === false ? '?' : '&') . $params; 35 | } 36 | 37 | $apiKeyType = onesignal_get_api_key_type(); 38 | $authorizationHeader = $apiKeyType === "Rich" 39 | ? 'Key ' . get_option('OneSignalWPSetting')['app_rest_api_key'] 40 | : 'Basic ' . get_option('OneSignalWPSetting')['app_rest_api_key']; 41 | 42 | $args = array( 43 | 'headers' => array( 44 | 'Authorization' => $authorizationHeader, 45 | 'accept' => 'application/json', 46 | 'content-type' => 'application/json', 47 | ), 48 | 'body' => json_encode(array( 49 | 'app_id' => get_option('OneSignalWPSetting')['app_id'], 50 | 'headings' => array('en' => $title), 51 | 'contents' => array('en' => $excerpt), 52 | 'included_segments' => array($segment), 53 | 'web_push_topic' => str_replace(' ', '-', strtolower($segment)), 54 | 'isAnyWeb' => true, 55 | )), 56 | ); 57 | 58 | $fields = json_decode($args['body'], true); 59 | 60 | // Conditionally send or schedule 61 | $postDate = new DateTime('now', new DateTimeZone('UTC')); 62 | $sendDate = new DateTime($post->post_date_gmt, new DateTimeZone('UTC')); 63 | 64 | if ($sendDate > $postDate) { 65 | // Schedule the notification to be sent in the future 66 | $fields['send_after'] = $sendDate->format('Y-m-d H:i:s e'); 67 | } 68 | 69 | // Conditionally include mobile parameters 70 | if (get_option('OneSignalWPSetting')['send_to_mobile_platforms'] && get_option('OneSignalWPSetting')['send_to_mobile_platforms'] == 1) { 71 | $fields['isIos'] = true; 72 | $fields['isAndroid'] = true; 73 | $fields['isHuawei'] = true; 74 | $fields['isWP_WNS'] = true; 75 | if (!empty($_POST['os_mobile_url'])) { 76 | $fields['app_url'] = $_POST['os_mobile_url']; 77 | $fields['web_url'] = get_permalink($post->ID); 78 | } else { 79 | $fields['url'] = $url; 80 | } 81 | } else { 82 | $fields['url'] = $url; 83 | } 84 | // Set notification images based on the post's featured image 85 | if (has_post_thumbnail($post->ID)) { 86 | // Get the post thumbnail ID 87 | $post_thumbnail_id = get_post_thumbnail_id($post->ID); 88 | 89 | // Retrieve image URLs for different sizes 90 | $thumbnail_size_url = wp_get_attachment_image_src($post_thumbnail_id, array(192, 192), true)[0]; 91 | $large_size_url = wp_get_attachment_image_src($post_thumbnail_id, 'large', true)[0]; 92 | 93 | // Assign image URLs to notification fields 94 | $fields['firefox_icon'] = $thumbnail_size_url; 95 | $fields['chrome_web_icon'] = $thumbnail_size_url; 96 | $fields['chrome_web_image'] = $large_size_url; 97 | } 98 | 99 | // Include any fields from onesignal_send_notification filter 100 | if (has_filter('onesignal_send_notification')) { 101 | $fields = apply_filters('onesignal_send_notification', $fields, $post->ID); 102 | } 103 | 104 | $args['body'] = json_encode($fields); 105 | 106 | // Make the API request and log errors 107 | if (defined('REST_REQUEST') && REST_REQUEST) return; 108 | $response = wp_remote_post('https://onesignal.com/api/v1/notifications', $args); 109 | if (is_wp_error($response)) { 110 | error_log('API request failed: ' . $response->get_error_message()); 111 | } 112 | } 113 | } 114 | --------------------------------------------------------------------------------