@ -0,0 +1,28 @@ | |||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. | |||
# dependencies | |||
/node_modules | |||
/.pnp | |||
.pnp.js | |||
# testing | |||
/coverage | |||
# production | |||
/build | |||
# misc | |||
.DS_Store | |||
.env.local | |||
.env.development.local | |||
.env.test.local | |||
.env.production.local | |||
.vscode | |||
.idea | |||
npm-debug.log* | |||
yarn-debug.log* | |||
yarn-error.log* | |||
# Optional eslint cache | |||
.eslintcache |
@ -0,0 +1,10 @@ | |||
import { CapacitorConfig } from '@capacitor/cli'; | |||
const config: CapacitorConfig = { | |||
appId: 'io.ionic.starter', | |||
appName: 'empty-ionic-react', | |||
webDir: 'build', | |||
bundledWebRuntime: false | |||
}; | |||
export default config; |
@ -0,0 +1,7 @@ | |||
{ | |||
"name": "empty-ionic-react", | |||
"integrations": { | |||
"capacitor": {} | |||
}, | |||
"type": "react" | |||
} |
@ -0,0 +1,73 @@ | |||
{ | |||
"name": "empty-ionic-react", | |||
"version": "0.0.1", | |||
"private": true, | |||
"dependencies": { | |||
"@capacitor/app": "4.0.1", | |||
"@capacitor/core": "4.1.0", | |||
"@capacitor/haptics": "4.0.1", | |||
"@capacitor/keyboard": "4.0.1", | |||
"@capacitor/status-bar": "4.0.1", | |||
"@ionic/react": "^6.0.0", | |||
"@ionic/react-router": "^6.0.0", | |||
"@reduxjs/toolkit": "^1.8.5", | |||
"@testing-library/jest-dom": "^5.11.9", | |||
"@testing-library/react": "^13.3.0", | |||
"@testing-library/user-event": "^12.6.3", | |||
"@types/jest": "^26.0.20", | |||
"@types/node": "^12.19.15", | |||
"@types/react": "^18.0.17", | |||
"@types/react-dom": "^18.0.6", | |||
"@types/react-router": "^5.1.11", | |||
"@types/react-router-dom": "^5.1.7", | |||
"ionicons": "^6.0.3", | |||
"react": "^18.2.0", | |||
"react-dom": "^18.2.0", | |||
"react-redux": "^8.0.2", | |||
"react-router": "^5.2.0", | |||
"react-router-dom": "^5.2.0", | |||
"react-scripts": "^5.0.0", | |||
"typescript": "^4.1.3", | |||
"web-vitals": "^0.2.4", | |||
"workbox-background-sync": "^5.1.4", | |||
"workbox-broadcast-update": "^5.1.4", | |||
"workbox-cacheable-response": "^5.1.4", | |||
"workbox-core": "^5.1.4", | |||
"workbox-expiration": "^5.1.4", | |||
"workbox-google-analytics": "^5.1.4", | |||
"workbox-navigation-preload": "^5.1.4", | |||
"workbox-precaching": "^5.1.4", | |||
"workbox-range-requests": "^5.1.4", | |||
"workbox-routing": "^5.1.4", | |||
"workbox-strategies": "^5.1.4", | |||
"workbox-streams": "^5.1.4" | |||
}, | |||
"scripts": { | |||
"start": "react-scripts start", | |||
"build": "react-scripts build", | |||
"test": "react-scripts test --transformIgnorePatterns 'node_modules/(?!(@ionic/react|@ionic/react-router|@ionic/core|@stencil/core|ionicons)/)'", | |||
"eject": "react-scripts eject" | |||
}, | |||
"eslintConfig": { | |||
"extends": [ | |||
"react-app", | |||
"react-app/jest" | |||
] | |||
}, | |||
"browserslist": { | |||
"production": [ | |||
">0.2%", | |||
"not dead", | |||
"not op_mini all" | |||
], | |||
"development": [ | |||
"last 1 chrome version", | |||
"last 1 firefox version", | |||
"last 1 safari version" | |||
] | |||
}, | |||
"devDependencies": { | |||
"@capacitor/cli": "4.1.0" | |||
}, | |||
"description": "An Ionic project" | |||
} |
@ -0,0 +1 @@ | |||
<svg width="350" height="140" xmlns="http://www.w3.org/2000/svg" style="background:#f6f7f9"><g fill="none" fill-rule="evenodd"><path fill="#F04141" style="mix-blend-mode:multiply" d="M61.905-34.23l96.194 54.51-66.982 54.512L22 34.887z"/><circle fill="#10DC60" style="mix-blend-mode:multiply" cx="155.5" cy="135.5" r="57.5"/><path fill="#3880FF" style="mix-blend-mode:multiply" d="M208.538 9.513l84.417 15.392L223.93 93.93z"/><path fill="#FFCE00" style="mix-blend-mode:multiply" d="M268.625 106.557l46.332-26.75 46.332 26.75v53.5l-46.332 26.75-46.332-26.75z"/><circle fill="#7044FF" style="mix-blend-mode:multiply" cx="299.5" cy="9.5" r="38.5"/><rect fill="#11D3EA" style="mix-blend-mode:multiply" transform="rotate(-60 148.47 37.886)" x="143.372" y="-7.056" width="10.196" height="89.884" rx="5.098"/><path d="M-25.389 74.253l84.86 8.107c5.498.525 9.53 5.407 9.004 10.905a10 10 0 0 1-.057.477l-12.36 85.671a10.002 10.002 0 0 1-11.634 8.42l-86.351-15.226c-5.44-.959-9.07-6.145-8.112-11.584l13.851-78.551a10 10 0 0 1 10.799-8.219z" fill="#7044FF" style="mix-blend-mode:multiply"/><circle fill="#0CD1E8" style="mix-blend-mode:multiply" cx="273.5" cy="106.5" r="20.5"/></g></svg> |
@ -0,0 +1,31 @@ | |||
<!DOCTYPE html> | |||
<html lang="en"> | |||
<head> | |||
<meta charset="utf-8" /> | |||
<title>Ionic App</title> | |||
<base href="/" /> | |||
<meta name="color-scheme" content="light dark" /> | |||
<meta | |||
name="viewport" | |||
content="viewport-fit=cover, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" | |||
/> | |||
<meta name="format-detection" content="telephone=no" /> | |||
<meta name="msapplication-tap-highlight" content="no" /> | |||
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> | |||
<link rel="shortcut icon" type="image/png" href="%PUBLIC_URL%/assets/icon/favicon.png" /> | |||
<!-- add to homescreen for ios --> | |||
<meta name="apple-mobile-web-app-capable" content="yes" /> | |||
<meta name="apple-mobile-web-app-title" content="Ionic App" /> | |||
<meta name="apple-mobile-web-app-status-bar-style" content="black" /> | |||
</head> | |||
<body> | |||
<div id="root"></div> | |||
</body> | |||
</html> |
@ -0,0 +1,21 @@ | |||
{ | |||
"short_name": "Ionic App", | |||
"name": "My Ionic App", | |||
"icons": [ | |||
{ | |||
"src": "assets/icon/favicon.png", | |||
"sizes": "64x64 32x32 24x24 16x16", | |||
"type": "image/x-icon" | |||
}, | |||
{ | |||
"src": "assets/icon/icon.png", | |||
"type": "image/png", | |||
"sizes": "512x512", | |||
"purpose": "maskable" | |||
} | |||
], | |||
"start_url": ".", | |||
"display": "standalone", | |||
"theme_color": "#ffffff", | |||
"background_color": "#ffffff" | |||
} |
@ -0,0 +1,35 @@ | |||
import { IonApp, setupIonicReact } from '@ionic/react'; | |||
/* Core CSS required for Ionic components to work properly */ | |||
import '@ionic/react/css/core.css'; | |||
/* Basic CSS for apps built with Ionic */ | |||
import '@ionic/react/css/normalize.css'; | |||
import '@ionic/react/css/structure.css'; | |||
import '@ionic/react/css/typography.css'; | |||
/* Optional CSS utils that can be commented out */ | |||
import '@ionic/react/css/padding.css'; | |||
import '@ionic/react/css/float-elements.css'; | |||
import '@ionic/react/css/text-alignment.css'; | |||
import '@ionic/react/css/text-transformation.css'; | |||
import '@ionic/react/css/flex-utils.css'; | |||
import '@ionic/react/css/display.css'; | |||
/* Theme variables */ | |||
import './theme/variables.css'; | |||
import { Provider } from 'react-redux'; | |||
import store from './store/store'; | |||
import Test from './components/Test'; | |||
setupIonicReact(); | |||
const App: React.FC = () => ( | |||
<IonApp> | |||
<Provider store={store}> | |||
<Test/> | |||
</Provider> | |||
</IonApp> | |||
); | |||
export default App; |
@ -0,0 +1,26 @@ | |||
import react from 'react'; | |||
import { actions } from '../store/store'; | |||
import { useDispatch, useSelector } from 'react-redux'; | |||
import { IonButton } from '@ionic/react'; | |||
const Test: react.FC<{}> = () => { | |||
console.log('Rendering <Test />'); | |||
const dispatch = useDispatch(); | |||
const state = useSelector((state: { test: any }) => state.test.part1); | |||
return ( | |||
<div> | |||
<p>{state.title}</p> | |||
<IonButton color='danger' onClick={() => dispatch(actions.increment1())}> | |||
Increment 1 (and re-render) | |||
</IonButton> | |||
<IonButton color='primary' onClick={() => dispatch(actions.increment2())}> | |||
Increment 2 (no re-rendering) | |||
</IonButton> | |||
</div> | |||
); | |||
}; | |||
export default Test; |
@ -0,0 +1,13 @@ | |||
import React from 'react'; | |||
import { createRoot } from 'react-dom/client'; | |||
import App from './App'; | |||
const container = document.getElementById('root'); | |||
const root = createRoot(container!); | |||
root.render( | |||
<React.StrictMode> | |||
<App /> | |||
</React.StrictMode> | |||
); | |||
@ -0,0 +1 @@ | |||
/// <reference types="react-scripts" /> |
@ -0,0 +1,80 @@ | |||
/// <reference lib="webworker" /> | |||
/* eslint-disable no-restricted-globals */ | |||
// This service worker can be customized! | |||
// See https://developers.google.com/web/tools/workbox/modules | |||
// for the list of available Workbox modules, or add any other | |||
// code you'd like. | |||
// You can also remove this file if you'd prefer not to use a | |||
// service worker, and the Workbox build step will be skipped. | |||
import { clientsClaim } from 'workbox-core'; | |||
import { ExpirationPlugin } from 'workbox-expiration'; | |||
import { precacheAndRoute, createHandlerBoundToURL } from 'workbox-precaching'; | |||
import { registerRoute } from 'workbox-routing'; | |||
import { StaleWhileRevalidate } from 'workbox-strategies'; | |||
declare const self: ServiceWorkerGlobalScope; | |||
clientsClaim(); | |||
// Precache all of the assets generated by your build process. | |||
// Their URLs are injected into the manifest variable below. | |||
// This variable must be present somewhere in your service worker file, | |||
// even if you decide not to use precaching. See https://cra.link/PWA | |||
precacheAndRoute(self.__WB_MANIFEST); | |||
// Set up App Shell-style routing, so that all navigation requests | |||
// are fulfilled with your index.html shell. Learn more at | |||
// https://developers.google.com/web/fundamentals/architecture/app-shell | |||
const fileExtensionRegexp = new RegExp('/[^/?]+\\.[^/]+$'); | |||
registerRoute( | |||
// Return false to exempt requests from being fulfilled by index.html. | |||
({ request, url }: { request: Request; url: URL }) => { | |||
// If this isn't a navigation, skip. | |||
if (request.mode !== 'navigate') { | |||
return false; | |||
} | |||
// If this is a URL that starts with /_, skip. | |||
if (url.pathname.startsWith('/_')) { | |||
return false; | |||
} | |||
// If this looks like a URL for a resource, because it contains | |||
// a file extension, skip. | |||
if (url.pathname.match(fileExtensionRegexp)) { | |||
return false; | |||
} | |||
// Return true to signal that we want to use the handler. | |||
return true; | |||
}, | |||
createHandlerBoundToURL(process.env.PUBLIC_URL + '/index.html') | |||
); | |||
// An example runtime caching route for requests that aren't handled by the | |||
// precache, in this case same-origin .png requests like those from in public/ | |||
registerRoute( | |||
// Add in any other file extensions or routing criteria as needed. | |||
({ url }) => url.origin === self.location.origin && url.pathname.endsWith('.png'), | |||
// Customize this strategy as needed, e.g., by changing to CacheFirst. | |||
new StaleWhileRevalidate({ | |||
cacheName: 'images', | |||
plugins: [ | |||
// Ensure that once this runtime cache reaches a maximum size the | |||
// least-recently used images are removed. | |||
new ExpirationPlugin({ maxEntries: 50 }), | |||
], | |||
}) | |||
); | |||
// This allows the web app to trigger skipWaiting via | |||
// registration.waiting.postMessage({type: 'SKIP_WAITING'}) | |||
self.addEventListener('message', (event) => { | |||
if (event.data && event.data.type === 'SKIP_WAITING') { | |||
self.skipWaiting(); | |||
} | |||
}); | |||
// Any other custom service worker logic can go here. |
@ -0,0 +1,142 @@ | |||
// This optional code is used to register a service worker. | |||
// register() is not called by default. | |||
// This lets the app load faster on subsequent visits in production, and gives | |||
// it offline capabilities. However, it also means that developers (and users) | |||
// will only see deployed updates on subsequent visits to a page, after all the | |||
// existing tabs open on the page have been closed, since previously cached | |||
// resources are updated in the background. | |||
// To learn more about the benefits of this model and instructions on how to | |||
// opt-in, read https://cra.link/PWA | |||
const isLocalhost = Boolean( | |||
window.location.hostname === 'localhost' || | |||
// [::1] is the IPv6 localhost address. | |||
window.location.hostname === '[::1]' || | |||
// 127.0.0.0/8 are considered localhost for IPv4. | |||
window.location.hostname.match(/^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/) | |||
); | |||
type Config = { | |||
onSuccess?: (registration: ServiceWorkerRegistration) => void; | |||
onUpdate?: (registration: ServiceWorkerRegistration) => void; | |||
}; | |||
export function register(config?: Config) { | |||
if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) { | |||
// The URL constructor is available in all browsers that support SW. | |||
const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); | |||
if (publicUrl.origin !== window.location.origin) { | |||
// Our service worker won't work if PUBLIC_URL is on a different origin | |||
// from what our page is served on. This might happen if a CDN is used to | |||
// serve assets; see https://github.com/facebook/create-react-app/issues/2374 | |||
return; | |||
} | |||
window.addEventListener('load', () => { | |||
const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; | |||
if (isLocalhost) { | |||
// This is running on localhost. Let's check if a service worker still exists or not. | |||
checkValidServiceWorker(swUrl, config); | |||
// Add some additional logging to localhost, pointing developers to the | |||
// service worker/PWA documentation. | |||
navigator.serviceWorker.ready.then(() => { | |||
console.log( | |||
'This web app is being served cache-first by a service ' + | |||
'worker. To learn more, visit https://cra.link/PWA' | |||
); | |||
}); | |||
} else { | |||
// Is not localhost. Just register service worker | |||
registerValidSW(swUrl, config); | |||
} | |||
}); | |||
} | |||
} | |||
function registerValidSW(swUrl: string, config?: Config) { | |||
navigator.serviceWorker | |||
.register(swUrl) | |||
.then((registration) => { | |||
registration.onupdatefound = () => { | |||
const installingWorker = registration.installing; | |||
if (installingWorker == null) { | |||
return; | |||
} | |||
installingWorker.onstatechange = () => { | |||
if (installingWorker.state === 'installed') { | |||
if (navigator.serviceWorker.controller) { | |||
// At this point, the updated precached content has been fetched, | |||
// but the previous service worker will still serve the older | |||
// content until all client tabs are closed. | |||
console.log( | |||
'New content is available and will be used when all ' + | |||
'tabs for this page are closed. See https://cra.link/PWA.' | |||
); | |||
// Execute callback | |||
if (config && config.onUpdate) { | |||
config.onUpdate(registration); | |||
} | |||
} else { | |||
// At this point, everything has been precached. | |||
// It's the perfect time to display a | |||
// "Content is cached for offline use." message. | |||
console.log('Content is cached for offline use.'); | |||
// Execute callback | |||
if (config && config.onSuccess) { | |||
config.onSuccess(registration); | |||
} | |||
} | |||
} | |||
}; | |||
}; | |||
}) | |||
.catch((error) => { | |||
console.error('Error during service worker registration:', error); | |||
}); | |||
} | |||
function checkValidServiceWorker(swUrl: string, config?: Config) { | |||
// Check if the service worker can be found. If it can't reload the page. | |||
fetch(swUrl, { | |||
headers: { 'Service-Worker': 'script' }, | |||
}) | |||
.then((response) => { | |||
// Ensure service worker exists, and that we really are getting a JS file. | |||
const contentType = response.headers.get('content-type'); | |||
if ( | |||
response.status === 404 || | |||
(contentType != null && contentType.indexOf('javascript') === -1) | |||
) { | |||
// No service worker found. Probably a different app. Reload the page. | |||
navigator.serviceWorker.ready.then((registration) => { | |||
registration.unregister().then(() => { | |||
window.location.reload(); | |||
}); | |||
}); | |||
} else { | |||
// Service worker found. Proceed as normal. | |||
registerValidSW(swUrl, config); | |||
} | |||
}) | |||
.catch(() => { | |||
console.log('No internet connection found. App is running in offline mode.'); | |||
}); | |||
} | |||
export function unregister() { | |||
if ('serviceWorker' in navigator) { | |||
navigator.serviceWorker.ready | |||
.then((registration) => { | |||
registration.unregister(); | |||
}) | |||
.catch((error) => { | |||
console.error(error.message); | |||
}); | |||
} | |||
} |
@ -0,0 +1,31 @@ | |||
import { configureStore, createSlice } from '@reduxjs/toolkit'; | |||
const slice = createSlice({ | |||
name: 'test', | |||
initialState: { | |||
part1: { | |||
title: 'Hello World!', | |||
x: 1, | |||
}, | |||
part2: { | |||
title: 'Hello OtherWorld!', | |||
x: 2, | |||
}, | |||
}, | |||
reducers: { | |||
increment1: (state) => { | |||
state.part1.x++; | |||
}, | |||
increment2: (state) => { | |||
state.part2.x++; | |||
}, | |||
}, | |||
}); | |||
export const actions = slice.actions; | |||
const store = configureStore({ | |||
reducer: { test: slice.reducer }, | |||
}); | |||
export default store; |
@ -0,0 +1,236 @@ | |||
/* Ionic Variables and Theming. For more info, please see: | |||
http://ionicframework.com/docs/theming/ */ | |||
/** Ionic CSS Variables **/ | |||
:root { | |||
/** primary **/ | |||
--ion-color-primary: #3880ff; | |||
--ion-color-primary-rgb: 56, 128, 255; | |||
--ion-color-primary-contrast: #ffffff; | |||
--ion-color-primary-contrast-rgb: 255, 255, 255; | |||
--ion-color-primary-shade: #3171e0; | |||
--ion-color-primary-tint: #4c8dff; | |||
/** secondary **/ | |||
--ion-color-secondary: #3dc2ff; | |||
--ion-color-secondary-rgb: 61, 194, 255; | |||
--ion-color-secondary-contrast: #ffffff; | |||
--ion-color-secondary-contrast-rgb: 255, 255, 255; | |||
--ion-color-secondary-shade: #36abe0; | |||
--ion-color-secondary-tint: #50c8ff; | |||
/** tertiary **/ | |||
--ion-color-tertiary: #5260ff; | |||
--ion-color-tertiary-rgb: 82, 96, 255; | |||
--ion-color-tertiary-contrast: #ffffff; | |||
--ion-color-tertiary-contrast-rgb: 255, 255, 255; | |||
--ion-color-tertiary-shade: #4854e0; | |||
--ion-color-tertiary-tint: #6370ff; | |||
/** success **/ | |||
--ion-color-success: #2dd36f; | |||
--ion-color-success-rgb: 45, 211, 111; | |||
--ion-color-success-contrast: #ffffff; | |||
--ion-color-success-contrast-rgb: 255, 255, 255; | |||
--ion-color-success-shade: #28ba62; | |||
--ion-color-success-tint: #42d77d; | |||
/** warning **/ | |||
--ion-color-warning: #ffc409; | |||
--ion-color-warning-rgb: 255, 196, 9; | |||
--ion-color-warning-contrast: #000000; | |||
--ion-color-warning-contrast-rgb: 0, 0, 0; | |||
--ion-color-warning-shade: #e0ac08; | |||
--ion-color-warning-tint: #ffca22; | |||
/** danger **/ | |||
--ion-color-danger: #eb445a; | |||
--ion-color-danger-rgb: 235, 68, 90; | |||
--ion-color-danger-contrast: #ffffff; | |||
--ion-color-danger-contrast-rgb: 255, 255, 255; | |||
--ion-color-danger-shade: #cf3c4f; | |||
--ion-color-danger-tint: #ed576b; | |||
/** dark **/ | |||
--ion-color-dark: #222428; | |||
--ion-color-dark-rgb: 34, 36, 40; | |||
--ion-color-dark-contrast: #ffffff; | |||
--ion-color-dark-contrast-rgb: 255, 255, 255; | |||
--ion-color-dark-shade: #1e2023; | |||
--ion-color-dark-tint: #383a3e; | |||
/** medium **/ | |||
--ion-color-medium: #92949c; | |||
--ion-color-medium-rgb: 146, 148, 156; | |||
--ion-color-medium-contrast: #ffffff; | |||
--ion-color-medium-contrast-rgb: 255, 255, 255; | |||
--ion-color-medium-shade: #808289; | |||
--ion-color-medium-tint: #9d9fa6; | |||
/** light **/ | |||
--ion-color-light: #f4f5f8; | |||
--ion-color-light-rgb: 244, 245, 248; | |||
--ion-color-light-contrast: #000000; | |||
--ion-color-light-contrast-rgb: 0, 0, 0; | |||
--ion-color-light-shade: #d7d8da; | |||
--ion-color-light-tint: #f5f6f9; | |||
} | |||
@media (prefers-color-scheme: dark) { | |||
/* | |||
* Dark Colors | |||
* ------------------------------------------- | |||
*/ | |||
body { | |||
--ion-color-primary: #428cff; | |||
--ion-color-primary-rgb: 66,140,255; | |||
--ion-color-primary-contrast: #ffffff; | |||
--ion-color-primary-contrast-rgb: 255,255,255; | |||
--ion-color-primary-shade: #3a7be0; | |||
--ion-color-primary-tint: #5598ff; | |||
--ion-color-secondary: #50c8ff; | |||
--ion-color-secondary-rgb: 80,200,255; | |||
--ion-color-secondary-contrast: #ffffff; | |||
--ion-color-secondary-contrast-rgb: 255,255,255; | |||
--ion-color-secondary-shade: #46b0e0; | |||
--ion-color-secondary-tint: #62ceff; | |||
--ion-color-tertiary: #6a64ff; | |||
--ion-color-tertiary-rgb: 106,100,255; | |||
--ion-color-tertiary-contrast: #ffffff; | |||
--ion-color-tertiary-contrast-rgb: 255,255,255; | |||
--ion-color-tertiary-shade: #5d58e0; | |||
--ion-color-tertiary-tint: #7974ff; | |||
--ion-color-success: #2fdf75; | |||
--ion-color-success-rgb: 47,223,117; | |||
--ion-color-success-contrast: #000000; | |||
--ion-color-success-contrast-rgb: 0,0,0; | |||
--ion-color-success-shade: #29c467; | |||
--ion-color-success-tint: #44e283; | |||
--ion-color-warning: #ffd534; | |||
--ion-color-warning-rgb: 255,213,52; | |||
--ion-color-warning-contrast: #000000; | |||
--ion-color-warning-contrast-rgb: 0,0,0; | |||
--ion-color-warning-shade: #e0bb2e; | |||
--ion-color-warning-tint: #ffd948; | |||
--ion-color-danger: #ff4961; | |||
--ion-color-danger-rgb: 255,73,97; | |||
--ion-color-danger-contrast: #ffffff; | |||
--ion-color-danger-contrast-rgb: 255,255,255; | |||
--ion-color-danger-shade: #e04055; | |||
--ion-color-danger-tint: #ff5b71; | |||
--ion-color-dark: #f4f5f8; | |||
--ion-color-dark-rgb: 244,245,248; | |||
--ion-color-dark-contrast: #000000; | |||
--ion-color-dark-contrast-rgb: 0,0,0; | |||
--ion-color-dark-shade: #d7d8da; | |||
--ion-color-dark-tint: #f5f6f9; | |||
--ion-color-medium: #989aa2; | |||
--ion-color-medium-rgb: 152,154,162; | |||
--ion-color-medium-contrast: #000000; | |||
--ion-color-medium-contrast-rgb: 0,0,0; | |||
--ion-color-medium-shade: #86888f; | |||
--ion-color-medium-tint: #a2a4ab; | |||
--ion-color-light: #222428; | |||
--ion-color-light-rgb: 34,36,40; | |||
--ion-color-light-contrast: #ffffff; | |||
--ion-color-light-contrast-rgb: 255,255,255; | |||
--ion-color-light-shade: #1e2023; | |||
--ion-color-light-tint: #383a3e; | |||
} | |||
/* | |||
* iOS Dark Theme | |||
* ------------------------------------------- | |||
*/ | |||
.ios body { | |||
--ion-background-color: #000000; | |||
--ion-background-color-rgb: 0,0,0; | |||
--ion-text-color: #ffffff; | |||
--ion-text-color-rgb: 255,255,255; | |||
--ion-color-step-50: #0d0d0d; | |||
--ion-color-step-100: #1a1a1a; | |||
--ion-color-step-150: #262626; | |||
--ion-color-step-200: #333333; | |||
--ion-color-step-250: #404040; | |||
--ion-color-step-300: #4d4d4d; | |||
--ion-color-step-350: #595959; | |||
--ion-color-step-400: #666666; | |||
--ion-color-step-450: #737373; | |||
--ion-color-step-500: #808080; | |||
--ion-color-step-550: #8c8c8c; | |||
--ion-color-step-600: #999999; | |||
--ion-color-step-650: #a6a6a6; | |||
--ion-color-step-700: #b3b3b3; | |||
--ion-color-step-750: #bfbfbf; | |||
--ion-color-step-800: #cccccc; | |||
--ion-color-step-850: #d9d9d9; | |||
--ion-color-step-900: #e6e6e6; | |||
--ion-color-step-950: #f2f2f2; | |||
--ion-item-background: #000000; | |||
--ion-card-background: #1c1c1d; | |||
} | |||
.ios ion-modal { | |||
--ion-background-color: var(--ion-color-step-100); | |||
--ion-toolbar-background: var(--ion-color-step-150); | |||
--ion-toolbar-border-color: var(--ion-color-step-250); | |||
} | |||
/* | |||
* Material Design Dark Theme | |||
* ------------------------------------------- | |||
*/ | |||
.md body { | |||
--ion-background-color: #121212; | |||
--ion-background-color-rgb: 18,18,18; | |||
--ion-text-color: #ffffff; | |||
--ion-text-color-rgb: 255,255,255; | |||
--ion-border-color: #222222; | |||
--ion-color-step-50: #1e1e1e; | |||
--ion-color-step-100: #2a2a2a; | |||
--ion-color-step-150: #363636; | |||
--ion-color-step-200: #414141; | |||
--ion-color-step-250: #4d4d4d; | |||
--ion-color-step-300: #595959; | |||
--ion-color-step-350: #656565; | |||
--ion-color-step-400: #717171; | |||
--ion-color-step-450: #7d7d7d; | |||
--ion-color-step-500: #898989; | |||
--ion-color-step-550: #949494; | |||
--ion-color-step-600: #a0a0a0; | |||
--ion-color-step-650: #acacac; | |||
--ion-color-step-700: #b8b8b8; | |||
--ion-color-step-750: #c4c4c4; | |||
--ion-color-step-800: #d0d0d0; | |||
--ion-color-step-850: #dbdbdb; | |||
--ion-color-step-900: #e7e7e7; | |||
--ion-color-step-950: #f3f3f3; | |||
--ion-item-background: #1e1e1e; | |||
--ion-toolbar-background: #1f1f1f; | |||
--ion-tab-bar-background: #1f1f1f; | |||
--ion-card-background: #1e1e1e; | |||
} | |||
} |
@ -0,0 +1,26 @@ | |||
{ | |||
"compilerOptions": { | |||
"target": "es5", | |||
"lib": [ | |||
"dom", | |||
"dom.iterable", | |||
"esnext" | |||
], | |||
"allowJs": true, | |||
"skipLibCheck": true, | |||
"esModuleInterop": true, | |||
"allowSyntheticDefaultImports": true, | |||
"strict": true, | |||
"forceConsistentCasingInFileNames": true, | |||
"noFallthroughCasesInSwitch": true, | |||
"module": "esnext", | |||
"moduleResolution": "node", | |||
"resolveJsonModule": true, | |||
"isolatedModules": true, | |||
"noEmit": true, | |||
"jsx": "react-jsx" | |||
}, | |||
"include": [ | |||
"src" | |||
] | |||
} |