UNPKG

purgetss

Version:

A package that simplifies mobile app creation for Titanium developers.

661 lines (599 loc) 21.5 kB
import _ from 'lodash' import { processProperties, processComments, removeFractions, parseValue } from './utils.js' /** * PurgeTSS Media Module * * Funciones relacionadas con multimedia, imágenes, videos, * gradientes, cacheo y contenido web. * * @since 6.0.0 */ // Importar utilidades compartidas /** * Permite vista previa de enlaces * @returns {object} Configuración CSS */ export function allowsLinkPreview() { return processProperties({ prop: 'allowsLinkPreview - iOS Only', modules: 'Ti.UI.WebView' }, { default: '{ allowsLinkPreview: {value} }' }, { ios: { 'allows-link-preview': true, 'dont-allow-link-preview': false } }) } /** * Auto-rotación para ImageView * @returns {object} Configuración CSS */ export function autorotate() { return processProperties({ prop: 'autorotate', modules: 'Ti.UI.ImageView' }, { default: '{ autorotate: {value} }' }, { default: { autorotate: true, 'dont-autorotate': false } }) } /** * Modo de mezcla de fondo para imágenes * @returns {object} Configuración CSS */ export function backgroundBlendMode() { return '' } /** * Gradiente lineal de fondo * @returns {string} CSS generado */ export function backgroundLinearGradient() { let convertedStyles = processComments({ prop: 'backgroundGradient - Linear', modules: 'Ti.UI.MaskedImage' }) convertedStyles += '\'.bg-linear\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'50%\', y: \'100%\' }, endPoint: { x: \'50%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-linear-to-t\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'0%\', y: \'0%\' }, endPoint: { x: \'0%\', y: \'100%\' } } }\n' convertedStyles += '\'.bg-linear-to-tr\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'100%\', y: \'0%\' }, endPoint: { x: \'0%\', y: \'100%\' } } }\n' convertedStyles += '\'.bg-linear-to-r\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'100%\', y: \'0%\' }, endPoint: { x: \'0%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-linear-to-br\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'100%\', y: \'100%\' }, endPoint: { x: \'0%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-linear-to-b\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'100%\', y: \'100%\' }, endPoint: { x: \'100%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-linear-to-bl\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'0%\', y: \'100%\' }, endPoint: { x: \'100%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-linear-to-l\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'0%\', y: \'0%\' }, endPoint: { x: \'100%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-linear-to-tl\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'0%\', y: \'0%\' }, endPoint: { x: \'100%\', y: \'100%\' } } }\n' convertedStyles += processComments({ prop: 'backgroundGradient - Gradient', modules: 'Ti.UI.MaskedImage' }) convertedStyles += '\'.bg-gradient\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'50%\', y: \'100%\' }, endPoint: { x: \'50%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-gradient-to-t\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'0%\', y: \'0%\' }, endPoint: { x: \'0%\', y: \'100%\' } } }\n' convertedStyles += '\'.bg-gradient-to-tr\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'100%\', y: \'0%\' }, endPoint: { x: \'0%\', y: \'100%\' } } }\n' convertedStyles += '\'.bg-gradient-to-r\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'100%\', y: \'0%\' }, endPoint: { x: \'0%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-gradient-to-br\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'100%\', y: \'100%\' }, endPoint: { x: \'0%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-gradient-to-b\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'100%\', y: \'100%\' }, endPoint: { x: \'100%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-gradient-to-bl\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'0%\', y: \'100%\' }, endPoint: { x: \'100%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-gradient-to-l\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'0%\', y: \'0%\' }, endPoint: { x: \'100%\', y: \'0%\' } } }\n' convertedStyles += '\'.bg-gradient-to-tl\': { backgroundGradient: { type: \'linear\', backfillStart: true, startPoint: { x: \'0%\', y: \'0%\' }, endPoint: { x: \'100%\', y: \'100%\' } } }\n' return convertedStyles } /** * Gradiente radial de fondo (iOS) * @returns {string} CSS generado */ export function backgroundRadialGradient() { let convertedStyles = processComments({ prop: 'backgroundGradient: type, startRadius, endRadius, backfillStart, backfillEnd - iOS Only', modules: 'Ti.UI.ListItem, Ti.UI.View' }) convertedStyles += `'.bg-radial': { backgroundGradient: { type: 'radial', backfillStart: true, backfillEnd: true, startRadius: '125%', endRadius: '0%' } }\n` convertedStyles += `'.bg-radial-to-b': { backgroundGradient: { type: 'radial', backfillStart: true, backfillEnd: true, startRadius: '150%', endRadius: '0%', startPoint: { x: '50%', y: '0%' }, endPoint: { x: '50%', y: '0%' } } }\n` convertedStyles += `'.bg-radial-to-bl': { backgroundGradient: { type: 'radial', backfillStart: true, backfillEnd: true, startRadius: '150%', endRadius: '0%', startPoint: { x: '100%', y: '0%' }, endPoint: { x: '100%', y: '0%' } } }\n` convertedStyles += `'.bg-radial-to-l': { backgroundGradient: { type: 'radial', backfillStart: true, backfillEnd: true, startRadius: '150%', endRadius: '0%', startPoint: { x: '100%', y: '50%' }, endPoint: { x: '100%', y: '50%' } } }\n` convertedStyles += `'.bg-radial-to-tl': { backgroundGradient: { type: 'radial', backfillStart: true, backfillEnd: true, startRadius: '150%', endRadius: '0%', startPoint: { x: '100%', y: '100%' }, endPoint: { x: '100%', y: '100%' } } }\n` convertedStyles += `'.bg-radial-to-t': { backgroundGradient: { type: 'radial', backfillStart: true, backfillEnd: true, startRadius: '150%', endRadius: '0%', startPoint: { x: '50%', y: '100%' }, endPoint: { x: '50%', y: '100%' } } }\n` convertedStyles += `'.bg-radial-to-tr': { backgroundGradient: { type: 'radial', backfillStart: true, backfillEnd: true, startRadius: '150%', endRadius: '0%', startPoint: { x: '0%', y: '100%' }, endPoint: { x: '0%', y: '100%' } } }\n` convertedStyles += `'.bg-radial-to-r': { backgroundGradient: { type: 'radial', backfillStart: true, backfillEnd: true, startRadius: '150%', endRadius: '0%', startPoint: { x: '0%', y: '50%' }, endPoint: { x: '0%', y: '50%' } } }\n` convertedStyles += `'.bg-radial-to-br': { backgroundGradient: { type: 'radial', backfillStart: true, backfillEnd: true, startRadius: '150%', endRadius: '0%', startPoint: { x: '0%', y: '0%' }, endPoint: { x: '0%', y: '0%' } } }\n` return convertedStyles } /** * Repetición de fondo * @returns {object} Configuración CSS */ export function backgroundRepeat() { return processProperties({ prop: 'backgroundRepeat', modules: 'Ti.UI.View' }, { default: '{ backgroundRepeat: {value} }' }, { default: { 'bg-repeat': true, 'bg-dont-repeat': false, 'background-repeat': true, 'background-dont-repeat': false } }) } /** * Modo de caché para imágenes * @returns {object} Configuración CSS */ export function cacheMode() { return processProperties({ prop: 'cacheMode - iOS Only', modules: 'Ti.UI.ImageView' }, { 'cache-mode': '{ cacheMode: {value} }' }, { ios: { default: 'Ti.UI.iOS.CACHE_POLICY_DEFAULT', 'reload-ignoring-local-cache': 'Ti.UI.iOS.CACHE_POLICY_RELOAD_IGNORING_LOCAL_CACHE_DATA', 'return-cache-data-else-load': 'Ti.UI.iOS.CACHE_POLICY_RETURN_CACHE_DATA_ELSE_LOAD', 'return-cache-data-dont-load': 'Ti.UI.iOS.CACHE_POLICY_RETURN_CACHE_DATA_DONT_LOAD' } }) } /** * Política de caché para WebView * @returns {object} Configuración CSS */ export function cachePolicy() { return processProperties({ prop: 'cachePolicy - iOS Only', modules: 'Ti.UI.WebView' }, { 'cache-policy': '{ cachePolicy: {value} }' }, { ios: { 'use-protocol-cache-policy': 'Ti.UI.iOS.CACHE_POLICY_USE_PROTOCOL_CACHE_POLICY', 'reload-ignoring-local-cache-data': 'Ti.UI.iOS.CACHE_POLICY_RELOAD_IGNORING_LOCAL_CACHE_DATA', 'return-cache-data-else-load': 'Ti.UI.iOS.CACHE_POLICY_RETURN_CACHE_DATA_ELSE_LOAD', 'return-cache-data-dont-load': 'Ti.UI.iOS.CACHE_POLICY_RETURN_CACHE_DATA_DONT_LOAD' } }) } /** * Imágenes de alta resolución (iOS) * @returns {object} Configuración CSS */ export function hires() { return processProperties({ prop: 'hires - iOS Only', modules: 'Ti.UI.ImageView. Ti.UI.WebView' }, { default: '{ hires: {value} }' }, { ios: { hires: true, lowres: false } }) } /** * Ignora errores SSL en WebView * @returns {object} Configuración CSS */ export function ignoreSslError() { return processProperties({ prop: 'ignoreSslError', modules: 'Ti.UI.WebView' }, { default: '{ ignoreSslError: {value} }' }, { default: { 'ignore-ssl-error': true, 'dont-ignore-ssl-error': false } }) } /** * Feedback táctil en imágenes (Android) * @returns {object} Configuración CSS */ export function imageTouchFeedback() { return processProperties({ prop: 'imageTouchFeedback - Android Only', modules: 'Ti.UI.ImageView' }, { default: '{ imageTouchFeedback: {value} }' }, { android: { 'image-touch-feedback': true, 'no-image-touch-feedback': false } }) } /** * Modo de contenido mixto en WebView (Android) * @returns {object} Configuración CSS */ export function mixedContentMode() { return processProperties({ prop: 'mixedContentMode - Android Only', modules: 'Ti.UI.WebView' }, { 'mixed-content-mode': '{ mixedContentMode: {value} }' }, { android: { 'never-allow': 'Ti.UI.Android.MIXED_CONTENT_NEVER_ALLOW', 'always-allow': 'Ti.UI.Android.MIXED_CONTENT_ALWAYS_ALLOW', 'compatibility-mode': 'Ti.UI.Android.MIXED_CONTENT_COMPATIBILITY_MODE' } }) } /** * Previene imagen por defecto * @returns {object} Configuración CSS */ export function preventDefaultImage() { return processProperties({ prop: 'preventDefaultImage', modules: 'Ti.UI.ImageView' }, { default: '{ preventDefaultImage: {value} }' }, { default: { 'prevent-default-image': true, 'allow-default-image': false } }) } /** * Reproduce en reversa * @returns {object} Configuración CSS */ export function reverse() { return processProperties({ prop: 'reverse', modules: 'Ti.UI.ImageView' }, { default: '{ reverse: {value} }' }, { default: { reverse: true, 'no-reverse': false } }) } /** * Escala página para ajustar en WebView * @returns {object} Configuración CSS */ export function scalesPageToFit() { return processProperties({ prop: 'scalesPageToFit', modules: 'Ti.UI.WebView' }, { default: '{ scalesPageToFit: {value} }' }, { default: { 'scales-page-to-fit': true, 'dont-scale-page-to-fit': false } }) } /** * Funciones multimedia de Titanium * @param {boolean} legacy - Usar modo legacy * @returns {string} CSS generado */ export function contentHeight(modifiersAndValues) { return processProperties({ prop: 'contentHeight', modules: 'Ti.UI.ScrollView' }, { 'content-h': '{ contentHeight: {value} }' }, { default: modifiersAndValues }) } // Exported as function export function contentWidth(modifiersAndValues) { return processProperties({ prop: 'contentWidth', modules: 'Ti.UI.ScrollView' }, { 'content-w': '{ contentWidth: {value} }' }, { default: modifiersAndValues }) } export function countDownDuration(modifiersAndValues) { return processProperties({ prop: 'countDownDuration - Android Only', modules: 'Ti.UI.Picker' }, { default: '{ countDownDuration: {value} }' }, { android: { 'count-down-duration': modifiersAndValues } }) } export function keyboardToolbarHeight(modifiersAndValues) { modifiersAndValues = removeFractions(modifiersAndValues, ['full', 'auto', 'screen']) return processProperties({ prop: 'keyboardToolbarHeight - iOS Only', modules: 'Ti.UI.TextArea, Ti.UI.TextField' }, { 'keyboard-toolbar-h': '{ keyboardToolbarHeight: {value} }' }, { ios: modifiersAndValues }) } export function leftButtonPadding(modifiersAndValues) { modifiersAndValues = removeFractions(modifiersAndValues, ['full', 'auto', 'screen']) return processProperties({ prop: 'leftButtonPadding - iOS Only', modules: 'Ti.UI.Label' }, { 'left-button-padding': '{ leftButtonPadding: {value} }' }, { ios: modifiersAndValues }) } export function maxElevation(modifiersAndValues) { modifiersAndValues = removeFractions(modifiersAndValues, ['0', 'auto', 'full', 'screen']) _.each(modifiersAndValues, (value, key) => { if (key.includes('/')) { delete modifiersAndValues[key] } else if (['sm', 'md', 'lg', 'xl', '2xl', '3xl', 'px', 'DEFAULT'].includes(key)) { // } else { modifiersAndValues[key] = parseValue(value) } }) return processProperties({ prop: 'maxElevation - Android Only', modules: 'Ti.UI.Android.CardView' }, { 'max-elevation': '{ maxElevation: {value} }' }, { android: modifiersAndValues }) } export function maxZoomScale(modifiersAndValues) { if (modifiersAndValues) { modifiersAndValues[1] = '.01' } return processProperties({ prop: 'maxZoomScale', modules: 'Ti.UI.ScrollView' }, { 'max-zoom-scale': '{ maxZoomScale: \'{value}\' }' }, { ios: modifiersAndValues }) } export function minZoomScale(modifiersAndValues) { if (modifiersAndValues) { modifiersAndValues[1] = '.01' } return processProperties({ prop: 'minZoomScale', modules: 'Ti.UI.ScrollView' }, { 'min-zoom-scale': '{ minZoomScale: \'{value}\' }' }, { ios: modifiersAndValues }) } export function pagingControlAlpha(modifiersAndValues) { return processProperties({ prop: 'pagingControlAlpha - iOS Only', modules: 'Ti.UI.ScrollableView' }, { 'paging-control-alpha': '{ pagingControlAlpha: {value} }' }, { ios: modifiersAndValues }) } export function pagingControlHeight(modifiersAndValues) { modifiersAndValues = removeFractions(modifiersAndValues, ['full', 'auto', 'screen']) return processProperties({ prop: 'pagingControlHeight - iOS Only', modules: 'Ti.UI.ScrollableView' }, { 'paging-control-h': '{ pagingControlHeight: {value} }' }, { ios: modifiersAndValues }) } export function pagingControlTimeout(modifiersAndValues) { return processProperties({ prop: 'pagingControlTimeout - Android Only', modules: 'Ti.UI.ScrollableView' }, { 'paging-control-timeout': '{ pagingControlTimeout: {value} }' }, { android: modifiersAndValues }) } export function rightButtonPadding(modifiersAndValues) { modifiersAndValues = removeFractions(modifiersAndValues, ['full', 'auto', 'screen']) return processProperties({ prop: 'rightButtonPadding - iOS Only', modules: 'Ti.UI.Label' }, { 'right-button-padding': '{ rightButtonPadding: {value} }' }, { ios: modifiersAndValues }) } export function shadowRadius(modifiersAndValues) { modifiersAndValues = removeFractions(modifiersAndValues, ['0', 'auto', 'full', 'screen']) _.each(modifiersAndValues, (value, key) => { if (key.includes('/')) { delete modifiersAndValues[key] } else if (['sm', 'md', 'lg', 'xl', '2xl', '3xl', 'px', 'DEFAULT'].includes(key)) { modifiersAndValues[key] = value } else { modifiersAndValues[key] = 8 * parseFloat(value) } }) return processProperties({ prop: 'shadowRadius ( with Extra Styles ) - Android Only', modules: 'Ti.UI.Button, Ti.UI.Label' }, { 'shadow-radius': '{ shadowRadius: {value} }' }, { android: modifiersAndValues }) } export function timeout(modifiersAndValues) { return processProperties({ prop: 'timeout - iOS Only', modules: 'Ti.UI.WebView' }, { timeout: '{ timeout: {value} }' }, { ios: modifiersAndValues }) } export function zoomScale(modifiersAndValues) { if (modifiersAndValues) { modifiersAndValues[1] = '.01' } return processProperties({ prop: 'zoomScale', modules: 'Ti.UI.ScrollView' }, { 'zoom-scale': '{ zoomScale: \'{value}\' }' }, { ios: modifiersAndValues }) } export function tiMedia(legacy = true) { let convertedStyles = '\n// Ti.Media' if (legacy) { convertedStyles += processProperties({ prop: 'audioSessionCategory - iOS Only', modules: 'Ti.Media' }, { 'audio-session-category': '{ audioSessionCategory: {value} }' }, { ios: { record: 'Ti.Media.AUDIO_SESSION_CATEGORY_RECORD', ambient: 'Ti.Media.AUDIO_SESSION_CATEGORY_AMBIENT', playback: 'Ti.Media.AUDIO_SESSION_CATEGORY_PLAYBACK', 'solo-ambient': 'Ti.Media.AUDIO_SESSION_CATEGORY_SOLO_AMBIENT', 'play-record': 'Ti.Media.AUDIO_SESSION_CATEGORY_PLAY_AND_RECORD' } }) convertedStyles += processProperties({ prop: 'audioType - Android Only', modules: 'Ti.Media.AudioPlayer, Ti.Media.Sound' }, { 'audio-type': '{ audioType: {value} }' }, { android: { ring: 'Ti.Media.Sound.AUDIO_TYPE_RING', alarm: 'Ti.Media.Sound.AUDIO_TYPE_ALARM', media: 'Ti.Media.Sound.AUDIO_TYPE_MEDIA', voice: 'Ti.Media.Sound.AUDIO_TYPE_VOICE', signalling: 'Ti.Media.Sound.AUDIO_TYPE_SIGNALLING', notification: 'Ti.Media.Sound.AUDIO_TYPE_NOTIFICATION' } }) convertedStyles += processProperties({ prop: 'repeatMode - iOS Only', modules: 'Ti.Media.MusicPlayer' }, { 'music-repeat-mode': '{ repeatMode: {value} }' }, { ios: { all: 'Ti.Media.MUSIC_PLAYER_REPEAT_ALL', default: 'Ti.Media.MUSIC_PLAYER_REPEAT_DEFAULT', none: 'Ti.Media.MUSIC_PLAYER_REPEAT_NONE', one: 'Ti.Media.MUSIC_PLAYER_REPEAT_ONE' } }) convertedStyles += processProperties({ prop: 'shuffleMode - iOS Only', modules: 'Ti.Media.MusicPlayer' }, { 'music-shuffle': '{ shuffleMode: {value} }' }, { ios: { albums: 'Ti.Media.MUSIC_PLAYER_SHUFFLE_ALBUMS', default: 'Ti.Media.MUSIC_PLAYER_SHUFFLE_DEFAULT', none: 'Ti.Media.MUSIC_PLAYER_SHUFFLE_NONE', songs: 'Ti.Media.MUSIC_PLAYER_SHUFFLE_SONGS' } }) convertedStyles += processProperties({ prop: 'scalingMode', modules: 'Ti.UI.ImageView', description: 'Image Scaling Mode' }, { 'image-scaling': '{ scalingMode: {value} }' }, { default: { auto: 'Ti.Media.IMAGE_SCALING_AUTO', none: 'Ti.Media.IMAGE_SCALING_NONE', fill: 'Ti.Media.IMAGE_SCALING_FILL', cover: 'Ti.Media.IMAGE_SCALING_ASPECT_FILL', contain: 'Ti.Media.IMAGE_SCALING_ASPECT_FIT' } }) // Video Scaling Mode convertedStyles += processProperties({ prop: 'scalingMode', modules: 'Ti.Media.VideoPlayer', description: 'Video Scaling Mode' }, { 'video-scaling': '{ scalingMode: {value} }' }, { default: { resize: 'Ti.Media.VIDEO_SCALING_RESIZE', contain: 'Ti.Media.VIDEO_SCALING_RESIZE_ASPECT', cover: 'Ti.Media.VIDEO_SCALING_RESIZE_ASPECT_FILL' } }) convertedStyles += processProperties({ prop: 'repeatMode', modules: 'Ti.Media.VideoPlayer', description: 'Determines how the movie player repeats when reaching the end of playback.' }, { 'video-repeat-mode': '{ repeatMode: {value} }' }, { default: { one: 'Ti.Media.VIDEO_REPEAT_MODE_ONE', none: 'Ti.Media.VIDEO_REPEAT_MODE_NONE' } }) } convertedStyles += processProperties({ prop: 'scalingMode - ( Alternative )', modules: 'Ti.UI.ImageView', description: 'Background Size for compatibility' }, { bg: '{ scalingMode: {value} }' }, { default: { auto: 'Ti.Media.IMAGE_SCALING_AUTO', fill: 'Ti.Media.IMAGE_SCALING_FILL', none: 'Ti.Media.IMAGE_SCALING_NONE', cover: 'Ti.Media.IMAGE_SCALING_ASPECT_FILL', contain: 'Ti.Media.IMAGE_SCALING_ASPECT_FIT' } }) convertedStyles += processProperties({ prop: 'scalingMode - ( Alternative )', modules: 'Ti.UI.ImageView', description: 'Object Fit for compatibility' }, { object: '{ scalingMode: {value} }' }, { default: { auto: 'Ti.Media.IMAGE_SCALING_AUTO', fill: 'Ti.Media.IMAGE_SCALING_FILL', none: 'Ti.Media.IMAGE_SCALING_NONE', cover: 'Ti.Media.IMAGE_SCALING_ASPECT_FILL', contain: 'Ti.Media.IMAGE_SCALING_ASPECT_FIT' } }) return convertedStyles }