@steveencues/starter-react-ui 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +42 -42
- package/dist/index.js.map +1 -1
- package/dist/libs/aplicacion/utils/theme.utils.d.ts +1 -1
- package/dist/libs/components/Button/Button.d.ts +23 -1
- package/dist/libs/components/Button/index.d.ts +1 -1
- package/dist/libs/components/index.d.ts +1 -1
- package/dist/libs/domain/constants/index.d.ts +1 -0
- package/dist/libs/domain/constants/theme-font-weight.const.d.ts +16 -0
- package/dist/libs/domain/interface/index.d.ts +3 -1
- package/dist/libs/domain/interface/manifest/index.d.ts +1 -0
- package/dist/libs/domain/interface/manifest/theme-manifest.interface.d.ts +23 -0
- package/dist/libs/domain/interface/theme/accessibility/index.d.ts +1 -0
- package/dist/libs/domain/interface/theme/accessibility/theme-accessibility.interface.d.ts +15 -0
- package/dist/libs/domain/interface/theme/colors/index.d.ts +8 -0
- package/dist/libs/domain/interface/theme/colors/theme-border-colors.interface.d.ts +17 -0
- package/dist/libs/domain/interface/theme/colors/theme-brand-colors.interface.d.ts +24 -0
- package/dist/libs/domain/interface/theme/colors/theme-color-palette.interface.d.ts +30 -0
- package/dist/libs/domain/interface/theme/colors/theme-data-colors.interface.d.ts +15 -0
- package/dist/libs/domain/interface/theme/colors/theme-overlay-colors.interface.d.ts +13 -0
- package/dist/libs/domain/interface/theme/colors/theme-state-colors.interface.d.ts +23 -0
- package/dist/libs/domain/interface/theme/colors/theme-surface-colors.interface.d.ts +19 -0
- package/dist/libs/domain/interface/theme/colors/theme-text-colors.interface.d.ts +19 -0
- package/dist/libs/domain/interface/theme/core/app-theme.interface.d.ts +11 -0
- package/dist/libs/domain/interface/theme/core/index.d.ts +2 -0
- package/dist/libs/domain/interface/theme/core/theme.interface.d.ts +20 -0
- package/dist/libs/domain/interface/theme/effects/index.d.ts +5 -0
- package/dist/libs/domain/interface/theme/effects/theme-animation.interface.d.ts +17 -0
- package/dist/libs/domain/interface/theme/effects/theme-effects.interface.d.ts +22 -0
- package/dist/libs/domain/interface/theme/effects/theme-gradient-stop.interface.d.ts +11 -0
- package/dist/libs/domain/interface/theme/effects/theme-gradient.interface.d.ts +16 -0
- package/dist/libs/domain/interface/theme/effects/theme-gradients.interface.d.ts +17 -0
- package/dist/libs/domain/interface/theme/index.d.ts +6 -0
- package/dist/libs/domain/interface/theme/preferences/index.d.ts +5 -0
- package/dist/libs/domain/interface/theme/preferences/theme-context.interface.d.ts +11 -0
- package/dist/libs/domain/interface/theme/preferences/theme-preference-configuration.interface.d.ts +11 -0
- package/dist/libs/domain/interface/theme/preferences/theme-preference-result.interface.d.ts +11 -0
- package/dist/libs/domain/interface/theme/preferences/theme-preference-state.interface.d.ts +10 -0
- package/dist/libs/domain/interface/theme/preferences/theme-provider.interface.d.ts +13 -0
- package/dist/libs/domain/interface/theme/typography/index.d.ts +5 -0
- package/dist/libs/domain/interface/theme/typography/theme-font-family.interface.d.ts +13 -0
- package/dist/libs/domain/interface/theme/typography/theme-font-sizes.interface.d.ts +20 -0
- package/dist/libs/domain/interface/theme/typography/theme-font-weights.interface.d.ts +17 -0
- package/dist/libs/domain/interface/theme/typography/theme-text-style.interface.d.ts +18 -0
- package/dist/libs/domain/interface/theme/typography/theme-typography.interface.d.ts +37 -0
- package/dist/libs/domain/types/index.d.ts +1 -2
- package/dist/libs/domain/types/theme/index.d.ts +20 -0
- package/dist/libs/domain/types/theme/theme-animation.type.d.ts +18 -0
- package/dist/libs/domain/types/theme/theme-border.type.d.ts +7 -0
- package/dist/libs/domain/types/theme/theme-brand.type.d.ts +7 -0
- package/dist/libs/domain/types/theme/theme-category.type.d.ts +12 -0
- package/dist/libs/domain/types/theme/theme-color-scale.type.d.ts +6 -0
- package/dist/libs/domain/types/theme/theme-css.type.d.ts +15 -0
- package/dist/libs/domain/types/theme/theme-effect.type.d.ts +7 -0
- package/dist/libs/domain/types/theme/theme-font-weights.type.d.ts +7 -0
- package/dist/libs/domain/types/theme/theme-font.type.d.ts +19 -0
- package/dist/libs/domain/types/theme/theme-gradient.type.d.ts +12 -0
- package/dist/libs/domain/types/theme/theme-layout.type.d.ts +24 -0
- package/dist/libs/domain/types/theme/theme-name.types.d.ts +6 -0
- package/dist/libs/domain/types/theme/theme-preference.type.d.ts +8 -0
- package/dist/libs/domain/types/theme/theme-shadow.type.d.ts +7 -0
- package/dist/libs/domain/types/theme/theme-state.type.d.ts +7 -0
- package/dist/libs/domain/types/theme/theme-surface.type.d.ts +7 -0
- package/dist/libs/domain/types/theme/theme-text-style.type.d.ts +12 -0
- package/dist/libs/domain/types/theme/theme-text.type.d.ts +7 -0
- package/dist/libs/domain/types/theme/theme-typography.type.d.ts +7 -0
- package/dist/libs/domain/types/theme/theme-value.type.d.ts +12 -0
- package/package.json +2 -2
- package/dist/libs/components/Button/button.types.d.ts +0 -1
- package/dist/libs/domain/interface/theme.interface.d.ts +0 -204
- package/dist/libs/domain/types/theme-name.types.d.ts +0 -6
- package/dist/libs/domain/types/theme.types.d.ts +0 -64
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("react"),t=require("react/jsx-runtime");var n=(0,e.createContext)(null),r=(0,e.createContext)(null);function i(){let t=(0,e.useContext)(n);if(t===null)throw Error(`useLanguage must be used inside TranslateProvider.`);return t}function a(){let t=(0,e.useContext)(r);if(t===null)throw Error(`useTheme must be used inside ThemeProvider.`);return t}async function o(e,t,n){if(t.length!==0&&n.length!==0)try{let r=G();if(r===void 0)return;let i=await Q(t,n);if(i===void 0)return;r.setItem(e,i)}catch{}}async function s(e,t){if(t.length!==0)try{let n=G();if(n===void 0)return;let r=n.getItem(e);return r===null?void 0:await $(r,t)}catch{return}}var c=`starter-react-ui:language-preference:v1`;function l(e,t){return o(c,e,t)}async function u(e,t){let n=await s(c,t);if(n!==void 0&&e.includes(n))return n}var d=`starter-react-ui:theme-preference:v1`;function f(e,t){return o(d,e,t)}async function p(e,t){let n=await s(d,t);if(n!==void 0)return e.find(e=>e.name===n)?.name}function m(e,t,n){return{...e,themeName:t,isLoaded:n}}function h(e,t){return e.themes===t.themes&&e.initialTheme===t.initialTheme&&e.themeEncryptionKey===t.themeEncryptionKey}async function g(e){try{return await p(e.themes,e.themeEncryptionKey)}catch{return}}function _(t,n){(0,e.useEffect)(()=>{let e=!0;return(async()=>{let r=await g(t);if(!e)return;let i=B(t.themes,t.initialTheme);n(e=>h(e,t)&&e.isLoaded?e:m(t,r??i.name,!0))})(),()=>{e=!1}},[t,n])}function ee(t,n){return(0,e.useCallback)(e=>{H(t.themes,e),n(m(t,e,!0))},[t,n])}function v(t){let{themes:n,initialTheme:r,themeEncryptionKey:i}=t,a=(0,e.useMemo)(()=>({themes:n,initialTheme:r,themeEncryptionKey:i}),[n,r,i]),[o,s]=(0,e.useState)(()=>m(a,B(n,r).name,!1));_(a,s);let c=h(o,a);return{themeName:c?o.themeName:B(n,r).name,isPreferenceLoaded:c&&o.isLoaded,setThemeName:ee(a,s)}}function y(e,t,n){return{...e,selectedLanguage:t,isLoaded:n}}function b(e,t){return e.translations===t.translations&&e.initialLanguage===t.initialLanguage&&e.fallbackLanguage===t.fallbackLanguage&&e.languageEncryptionKey===t.languageEncryptionKey&&e.languages===t.languages}async function x(e){try{return await u(e.languages,e.languageEncryptionKey)}catch{return}}function te(t,n){(0,e.useEffect)(()=>{let e=!0;return(async()=>{let r=await x(t);if(!e)return;let i=j(t.translations,t.initialLanguage,t.fallbackLanguage);n(e=>b(e,t)&&e.isLoaded?e:y(t,r??i,!0))})(),()=>{e=!1}},[t,n])}function ne(t,n,r){(0,e.useEffect)(()=>{r&&l(n,t.languageEncryptionKey)},[t.languageEncryptionKey,n,r])}function re(t,n){return(0,e.useCallback)(e=>{N(t.translations,e),n(y(t,e,!0))},[t,n])}function ie(t){let[n,r]=(0,e.useState)(()=>y(t,t.initialLanguage,!1));te(t,r);let i=b(n,t),a=i?n.selectedLanguage:t.initialLanguage,o=i&&n.isLoaded,s=re(t,r);return{language:M(t.translations,a,t.initialLanguage,t.fallbackLanguage),isLoaded:o,setLanguage:s}}function ae({translations:r,initialLanguage:i,fallbackLanguage:a=`en`,languageEncryptionKey:o,children:s}){let c=(0,e.useMemo)(()=>Object.keys(r),[r]),l=(0,e.useMemo)(()=>({translations:r,initialLanguage:i,fallbackLanguage:a,languageEncryptionKey:o,languages:c}),[r,i,a,o,c]),u=ie(l);ne(l,u.language,u.isLoaded);let d=S(l,u);return(0,t.jsx)(n.Provider,{value:d,children:s})}function S(t,n){let r=t.translations[n.language],i=t.translations[t.fallbackLanguage],a=(0,e.useCallback)((e,t)=>L(r,i,e,t),[r,i]);return(0,e.useMemo)(()=>({language:n.language,languages:t.languages,setLanguage:n.setLanguage,t:a}),[n.language,n.setLanguage,t.languages,a])}function oe({themes:n,initialTheme:i,themeEncryptionKey:a,children:o}){let{themeName:s,isPreferenceLoaded:c,setThemeName:l}=v({themes:n,initialTheme:i,themeEncryptionKey:a}),u=V(n,s,i);(0,e.useEffect)(()=>{c&&f(u.name,a)},[c,u.name,a]);let d=(0,e.useCallback)(e=>l(e),[l]),p=(0,e.useMemo)(()=>U(u),[u]),m=(0,e.useMemo)(()=>({theme:u,themeName:u.name,themes:n,setTheme:d}),[u,n,d]);return(0,t.jsx)(r.Provider,{value:m,children:(0,t.jsx)(`div`,{"data-rui-theme":u.name,style:{...p,display:`contents`},children:o})})}var C=Object.freeze({INTERPOLATION_PLACEHOLDER:String.raw`\{\{([a-zA-Z0-9_]+)\}\}`}),se=`g`,w=`AES-GCM`,T=12,E=`SHA-256`,ce=`raw`,le=`.`,D=[`encrypt`,`decrypt`],O=2,k={SURFACE_BACKGROUND:`--rui-surface-background`,SURFACE_SURFACE:`--rui-surface-surface`,SURFACE_SURFACE_ELEVATED:`--rui-surface-surface-elevated`,SURFACE_SURFACE_HOVER:`--rui-surface-surface-hover`,SURFACE_SURFACE_ACTIVE:`--rui-surface-surface-active`,SURFACE_SURFACE_DISABLED:`--rui-surface-surface-disabled`,TEXT_PRIMARY:`--rui-text-primary`,TEXT_SECONDARY:`--rui-text-secondary`,TEXT_MUTED:`--rui-text-muted`,TEXT_DISABLED:`--rui-text-disabled`,TEXT_INVERSE:`--rui-text-inverse`,TEXT_LINK:`--rui-text-link`,TEXT_LINK_HOVER:`--rui-text-link-hover`,BRAND_PRIMARY:`--rui-brand-primary`,BRAND_PRIMARY_HOVER:`--rui-brand-primary-hover`,BRAND_PRIMARY_ACTIVE:`--rui-brand-primary-active`,BRAND_PRIMARY_CONTRAST:`--rui-brand-primary-contrast`,BRAND_SECONDARY:`--rui-brand-secondary`,BRAND_SECONDARY_HOVER:`--rui-brand-secondary-hover`,BRAND_SECONDARY_ACTIVE:`--rui-brand-secondary-active`,BRAND_SECONDARY_CONTRAST:`--rui-brand-secondary-contrast`,BRAND_ACCENT:`--rui-brand-accent`,BRAND_ACCENT_HOVER:`--rui-brand-accent-hover`,BRAND_ACCENT_CONTRAST:`--rui-brand-accent-contrast`,STATE_SUCCESS:`--rui-state-success`,STATE_SUCCESS_BACKGROUND:`--rui-state-success-background`,STATE_WARNING:`--rui-state-warning`,STATE_WARNING_BACKGROUND:`--rui-state-warning-background`,STATE_ERROR:`--rui-state-error`,STATE_ERROR_BACKGROUND:`--rui-state-error-background`,STATE_INFO:`--rui-state-info`,STATE_INFO_BACKGROUND:`--rui-state-info-background`,BORDER_DEFAULT:`--rui-border-default`,BORDER_SUBTLE:`--rui-border-subtle`,BORDER_STRONG:`--rui-border-strong`,BORDER_FOCUS:`--rui-border-focus`,BORDER_HOVER:`--rui-border-hover`,BORDER_ACTIVE:`--rui-border-active`,BORDER_DISABLED:`--rui-border-disabled`,SHADOW_COLOR:`--rui-shadow-color`,SHADOW_SUBTLE:`--rui-shadow-subtle`,SHADOW_SMALL:`--rui-shadow-small`,SHADOW_MEDIUM:`--rui-shadow-medium`,SHADOW_LARGE:`--rui-shadow-large`,SHADOW_GLOW:`--rui-shadow-glow`,EFFECTS_OVERLAY:`--rui-effects-overlay`,EFFECTS_BACKDROP:`--rui-effects-backdrop`,EFFECTS_BLUR:`--rui-effects-blur`,EFFECTS_BLUR_STRONG:`--rui-effects-blur-strong`,EFFECTS_GLASS_BACKGROUND:`--rui-effects-glass-background`,EFFECTS_GLASS_BORDER:`--rui-effects-glass-border`,TYPOGRAPHY_HEADING_PRIMARY:`--rui-typography-heading-primary`,TYPOGRAPHY_HEADING_SECONDARY:`--rui-typography-heading-secondary`,TYPOGRAPHY_HEADING_MUTED:`--rui-typography-heading-muted`,TYPOGRAPHY_BODY_PRIMARY:`--rui-typography-body-primary`,TYPOGRAPHY_BODY_SECONDARY:`--rui-typography-body-secondary`,TYPOGRAPHY_BODY_MUTED:`--rui-typography-body-muted`,TYPOGRAPHY_LABEL_PRIMARY:`--rui-typography-label-primary`,TYPOGRAPHY_LABEL_SECONDARY:`--rui-typography-label-secondary`,TYPOGRAPHY_LABEL_MUTED:`--rui-typography-label-muted`,TYPOGRAPHY_BUTTON_PRIMARY:`--rui-typography-button-primary`,TYPOGRAPHY_BUTTON_SECONDARY:`--rui-typography-button-secondary`};function A(e,t){return Object.hasOwn(e,t)}function ue(e){let[t]=Object.keys(e);return t}function j(e,t,n){if(A(e,t))return t;if(A(e,n))return n;let r=ue(e);if(r===void 0)throw Error(`TranslateProvider requires at least one translation catalog.`);return r}function M(e,t,n,r){return A(e,t)?t:j(e,n,r)}function N(e,t){if(!A(e,t))throw Error(`Language "${t}" is not available in the translation catalog.`)}function de(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n==`string`||!Object.hasOwn(n,e))return;n=n[e]}return n}function P(e,t){if(e===void 0||t===``)return;let n=de(e,t);return typeof n==`string`?n:void 0}function fe(e,t,n){let r=n?.[t];return r===void 0?e:String(r)}function F(e,t){let n=new RegExp(C.INTERPOLATION_PLACEHOLDER,`g`);return e.replace(n,(e,n)=>fe(e,n,t))}function I(e,t,n){let r=P(e,n);return r===void 0?P(t,n)??n:r}function L(e,t,n,r){return F(I(e,t,n),r)}function R(e,t){return e.find(e=>e.name===t)}function z(e){if(e.length===0)throw Error(`ThemeProvider requires at least one registered theme.`);return e[0]}function B(e,t){return R(e,t)??z(e)}function V(e,t,n){return R(e,t)??B(e,n)}function H(e,t){if(R(e,t)===void 0)throw Error(`Theme "${t}" is not registered in ThemeProvider.`)}function pe(e){return{[k.SURFACE_BACKGROUND]:e.surface.background,[k.SURFACE_SURFACE]:e.surface.surface,[k.SURFACE_SURFACE_ELEVATED]:e.surface.surfaceElevated,[k.SURFACE_SURFACE_HOVER]:e.surface.surfaceHover,[k.SURFACE_SURFACE_ACTIVE]:e.surface.surfaceActive,[k.SURFACE_SURFACE_DISABLED]:e.surface.surfaceDisabled}}function me(e){return{[k.TEXT_PRIMARY]:e.text.primary,[k.TEXT_SECONDARY]:e.text.secondary,[k.TEXT_MUTED]:e.text.muted,[k.TEXT_DISABLED]:e.text.disabled,[k.TEXT_INVERSE]:e.text.inverse,[k.TEXT_LINK]:e.text.link,[k.TEXT_LINK_HOVER]:e.text.linkHover}}function he(e){return{[k.BRAND_PRIMARY]:e.brand.primary,[k.BRAND_PRIMARY_HOVER]:e.brand.primaryHover,[k.BRAND_PRIMARY_ACTIVE]:e.brand.primaryActive,[k.BRAND_PRIMARY_CONTRAST]:e.brand.primaryContrast,[k.BRAND_SECONDARY]:e.brand.secondary,[k.BRAND_SECONDARY_HOVER]:e.brand.secondaryHover,[k.BRAND_SECONDARY_ACTIVE]:e.brand.secondaryActive,[k.BRAND_SECONDARY_CONTRAST]:e.brand.secondaryContrast,[k.BRAND_ACCENT]:e.brand.accent,[k.BRAND_ACCENT_HOVER]:e.brand.accentHover,[k.BRAND_ACCENT_CONTRAST]:e.brand.accentContrast}}function ge(e){return{[k.STATE_SUCCESS]:e.state.success,[k.STATE_SUCCESS_BACKGROUND]:e.state.successBackground,[k.STATE_WARNING]:e.state.warning,[k.STATE_WARNING_BACKGROUND]:e.state.warningBackground,[k.STATE_ERROR]:e.state.error,[k.STATE_ERROR_BACKGROUND]:e.state.errorBackground,[k.STATE_INFO]:e.state.info,[k.STATE_INFO_BACKGROUND]:e.state.infoBackground}}function _e(e){return{[k.BORDER_DEFAULT]:e.border.default,[k.BORDER_SUBTLE]:e.border.subtle,[k.BORDER_STRONG]:e.border.strong,[k.BORDER_FOCUS]:e.border.focus,[k.BORDER_HOVER]:e.border.hover,[k.BORDER_ACTIVE]:e.border.active,[k.BORDER_DISABLED]:e.border.disabled}}function ve(e){return{[k.SHADOW_COLOR]:e.shadow.color,[k.SHADOW_SUBTLE]:e.shadow.subtle,[k.SHADOW_SMALL]:e.shadow.small,[k.SHADOW_MEDIUM]:e.shadow.medium,[k.SHADOW_LARGE]:e.shadow.large,[k.SHADOW_GLOW]:e.shadow.glow}}function ye(e){return{[k.EFFECTS_OVERLAY]:e.effects.overlay,[k.EFFECTS_BACKDROP]:e.effects.backdrop,[k.EFFECTS_BLUR]:e.effects.blur,[k.EFFECTS_BLUR_STRONG]:e.effects.blurStrong,[k.EFFECTS_GLASS_BACKGROUND]:e.effects.glassBackground,[k.EFFECTS_GLASS_BORDER]:e.effects.glassBorder}}function be(e){return{[k.TYPOGRAPHY_HEADING_PRIMARY]:e.typography.heading.primary,[k.TYPOGRAPHY_HEADING_SECONDARY]:e.typography.heading.secondary,[k.TYPOGRAPHY_HEADING_MUTED]:e.typography.heading.muted,[k.TYPOGRAPHY_BODY_PRIMARY]:e.typography.body.primary,[k.TYPOGRAPHY_BODY_SECONDARY]:e.typography.body.secondary,[k.TYPOGRAPHY_BODY_MUTED]:e.typography.body.muted,[k.TYPOGRAPHY_LABEL_PRIMARY]:e.typography.label.primary,[k.TYPOGRAPHY_LABEL_SECONDARY]:e.typography.label.secondary,[k.TYPOGRAPHY_LABEL_MUTED]:e.typography.label.muted,[k.TYPOGRAPHY_BUTTON_PRIMARY]:e.typography.button.primary,[k.TYPOGRAPHY_BUTTON_SECONDARY]:e.typography.button.secondary}}function U(e){let{colors:t}=e;return{...pe(t),...me(t),...he(t),...ge(t),..._e(t),...ve(t),...ye(t),...be(t)}}function W(){try{return globalThis.crypto}catch{return}}function G(){try{return globalThis.localStorage}catch{return}}function K(e){return new TextEncoder().encode(e)}function q(e){return new TextDecoder().decode(e)}function J(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function Y(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e+=1)n[e]=t.charCodeAt(e);return n}async function X(e){let t=W();if(t===void 0||e.length===0)return;let n=await t.subtle.digest(E,K(e));return t.subtle.importKey(`raw`,n,{name:w},!1,D)}function xe(){let e=W();if(e===void 0)throw Error(`Cryptographic API is unavailable.`);return e.getRandomValues(new Uint8Array(12))}function Se(e){try{let t=Y(e);return t.length===12?t:void 0}catch{return}}function Ce(e){return e.length===2}function we(e){if(Ce(e))return[e[0],e[1]]}function Te(e){let t=we(e.split(`.`));if(t===void 0)return;let[n,r]=t,i=Se(n);if(i!==void 0)try{return{iv:i,ciphertext:Y(r)}}catch{return}}async function Ee(e,t,n){return Z().subtle.encrypt({name:w,iv:n},t,e)}async function De(e,t){return Z().subtle.decrypt({name:w,iv:e.iv},t,e.ciphertext)}function Z(){let e=W();if(e===void 0)throw Error(`Cryptographic API is unavailable.`);return e}async function Q(e,t){try{let n=await X(t);if(n===void 0)return;let r=xe(),i=await Ee(K(e),n,r);return[J(r),J(new Uint8Array(i))].join(`.`)}catch{return}}async function $(e,t){try{let n=Te(e);if(n===void 0)return;let r=await X(t);return r===void 0?void 0:q(await De(n,r))}catch{return}}exports.AES_GCM_ALGORITHM=w,exports.AES_GCM_IV_LENGTH=T,exports.ENCRYPTED_VALUE_PART_COUNT=O,exports.GLOBAL_REGEX_FLAG=se,exports.KEY_USAGES=D,exports.RAW_KEY_FORMAT=ce,exports.SHA_256_ALGORITHM=E,exports.STORAGE_VALUE_SEPARATOR=le,exports.ThemeContext=r,exports.ThemeCssVariable=k,exports.ThemeProvider=oe,exports.TranslateContext=n,exports.TranslateProvider=ae,exports.TranslationRegex=C,exports.assertLanguageExists=N,exports.assertThemeExists=H,exports.createThemeVariables=U,exports.decodeBase64=Y,exports.decodeText=q,exports.decryptText=$,exports.encodeBase64=J,exports.encodeText=K,exports.encryptText=Q,exports.findTranslation=P,exports.getCryptoApi=W,exports.getLocalStorage=G,exports.interpolateTranslation=F,exports.loadEncryptedPreference=s,exports.loadLanguagePreference=u,exports.loadThemePreference=p,exports.resolveActiveLanguage=M,exports.resolveActiveTheme=V,exports.resolveInitialLanguage=j,exports.resolveInitialTheme=B,exports.saveEncryptedPreference=o,exports.saveLanguagePreference=l,exports.saveThemePreference=f,exports.translateMessage=L,exports.useLanguage=i,exports.useTheme=a,exports.useThemePreference=v;
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("react"),t=require("react/jsx-runtime");var n=(0,e.createContext)(null),r=(0,e.createContext)(null);function i(){let t=(0,e.useContext)(n);if(t===null)throw Error(`useLanguage must be used inside TranslateProvider.`);return t}function a(){let t=(0,e.useContext)(r);if(t===null)throw Error(`useTheme must be used inside ThemeProvider.`);return t}async function o(e,t,n){if(t.length!==0&&n.length!==0)try{let r=G();if(r===void 0)return;let i=await Q(t,n);if(i===void 0)return;r.setItem(e,i)}catch{}}async function s(e,t){if(t.length!==0)try{let n=G();if(n===void 0)return;let r=n.getItem(e);return r===null?void 0:await $(r,t)}catch{return}}var c=`starter-react-ui:language-preference:v1`;function l(e,t){return o(c,e,t)}async function u(e,t){let n=await s(c,t);if(n!==void 0&&e.includes(n))return n}var d=`starter-react-ui:theme-preference:v1`;function f(e,t){return o(d,e,t)}async function p(e,t){let n=await s(d,t);if(n!==void 0)return e.find(e=>e.name===n)?.name}function m(e,t,n){return{...e,themeName:t,isLoaded:n}}function h(e,t){return e.themes===t.themes&&e.initialTheme===t.initialTheme&&e.themeEncryptionKey===t.themeEncryptionKey}async function g(e){try{return await p(e.themes,e.themeEncryptionKey)}catch{return}}function ee(t,n){(0,e.useEffect)(()=>{let e=!0;return(async()=>{let r=await g(t);if(!e)return;let i=B(t.themes,t.initialTheme);n(e=>h(e,t)&&e.isLoaded?e:m(t,r??i.name,!0))})(),()=>{e=!1}},[t,n])}function te(t,n){return(0,e.useCallback)(e=>{H(t.themes,e),n(m(t,e,!0))},[t,n])}function _(t){let{themes:n,initialTheme:r,themeEncryptionKey:i}=t,a=(0,e.useMemo)(()=>({themes:n,initialTheme:r,themeEncryptionKey:i}),[n,r,i]),[o,s]=(0,e.useState)(()=>m(a,B(n,r).name,!1));ee(a,s);let c=h(o,a);return{themeName:c?o.themeName:B(n,r).name,isPreferenceLoaded:c&&o.isLoaded,setThemeName:te(a,s)}}function v(e,t,n){return{...e,selectedLanguage:t,isLoaded:n}}function y(e,t){return e.translations===t.translations&&e.initialLanguage===t.initialLanguage&&e.fallbackLanguage===t.fallbackLanguage&&e.languageEncryptionKey===t.languageEncryptionKey&&e.languages===t.languages}async function b(e){try{return await u(e.languages,e.languageEncryptionKey)}catch{return}}function ne(t,n){(0,e.useEffect)(()=>{let e=!0;return(async()=>{let r=await b(t);if(!e)return;let i=A(t.translations,t.initialLanguage,t.fallbackLanguage);n(e=>y(e,t)&&e.isLoaded?e:v(t,r??i,!0))})(),()=>{e=!1}},[t,n])}function re(t,n,r){(0,e.useEffect)(()=>{r&&l(n,t.languageEncryptionKey)},[t.languageEncryptionKey,n,r])}function ie(t,n){return(0,e.useCallback)(e=>{M(t.translations,e),n(v(t,e,!0))},[t,n])}function ae(t){let[n,r]=(0,e.useState)(()=>v(t,t.initialLanguage,!1));ne(t,r);let i=y(n,t),a=i?n.selectedLanguage:t.initialLanguage,o=i&&n.isLoaded,s=ie(t,r);return{language:j(t.translations,a,t.initialLanguage,t.fallbackLanguage),isLoaded:o,setLanguage:s}}function x({translations:r,initialLanguage:i,fallbackLanguage:a=`en`,languageEncryptionKey:o,children:s}){let c=(0,e.useMemo)(()=>Object.keys(r),[r]),l=(0,e.useMemo)(()=>({translations:r,initialLanguage:i,fallbackLanguage:a,languageEncryptionKey:o,languages:c}),[r,i,a,o,c]),u=ae(l);re(l,u.language,u.isLoaded);let d=oe(l,u);return(0,t.jsx)(n.Provider,{value:d,children:s})}function oe(t,n){let r=t.translations[n.language],i=t.translations[t.fallbackLanguage],a=(0,e.useCallback)((e,t)=>L(r,i,e,t),[r,i]);return(0,e.useMemo)(()=>({language:n.language,languages:t.languages,setLanguage:n.setLanguage,t:a}),[n.language,n.setLanguage,t.languages,a])}function se({themes:n,initialTheme:i,themeEncryptionKey:a,children:o}){let{themeName:s,isPreferenceLoaded:c,setThemeName:l}=_({themes:n,initialTheme:i,themeEncryptionKey:a}),u=V(n,s,i);(0,e.useEffect)(()=>{c&&f(u.name,a)},[c,u.name,a]);let d=(0,e.useCallback)(e=>l(e),[l]),p=(0,e.useMemo)(()=>U(u),[u]),m=(0,e.useMemo)(()=>({theme:u,themeName:u.name,themes:n,setTheme:d}),[u,n,d]);return(0,t.jsx)(r.Provider,{value:m,children:(0,t.jsx)(`div`,{"data-rui-theme":u.name,style:{...p,display:`contents`},children:o})})}var S=Object.freeze({INTERPOLATION_PLACEHOLDER:String.raw`\{\{([a-zA-Z0-9_]+)\}\}`}),ce=`g`,C=`AES-GCM`,w=12,T=`SHA-256`,le=`raw`,ue=`.`,E=[`encrypt`,`decrypt`],D=2,O={SURFACE_BACKGROUND:`--rui-surface-background`,SURFACE_SURFACE:`--rui-surface-surface`,SURFACE_SURFACE_ELEVATED:`--rui-surface-surface-elevated`,SURFACE_SURFACE_HOVER:`--rui-surface-surface-hover`,SURFACE_SURFACE_ACTIVE:`--rui-surface-surface-active`,SURFACE_SURFACE_DISABLED:`--rui-surface-surface-disabled`,TEXT_PRIMARY:`--rui-text-primary`,TEXT_SECONDARY:`--rui-text-secondary`,TEXT_MUTED:`--rui-text-muted`,TEXT_DISABLED:`--rui-text-disabled`,TEXT_INVERSE:`--rui-text-inverse`,TEXT_LINK:`--rui-text-link`,TEXT_LINK_HOVER:`--rui-text-link-hover`,BRAND_PRIMARY:`--rui-brand-primary`,BRAND_PRIMARY_HOVER:`--rui-brand-primary-hover`,BRAND_PRIMARY_ACTIVE:`--rui-brand-primary-active`,BRAND_PRIMARY_CONTRAST:`--rui-brand-primary-contrast`,BRAND_SECONDARY:`--rui-brand-secondary`,BRAND_SECONDARY_HOVER:`--rui-brand-secondary-hover`,BRAND_SECONDARY_ACTIVE:`--rui-brand-secondary-active`,BRAND_SECONDARY_CONTRAST:`--rui-brand-secondary-contrast`,BRAND_ACCENT:`--rui-brand-accent`,BRAND_ACCENT_HOVER:`--rui-brand-accent-hover`,BRAND_ACCENT_CONTRAST:`--rui-brand-accent-contrast`,STATE_SUCCESS:`--rui-state-success`,STATE_SUCCESS_BACKGROUND:`--rui-state-success-background`,STATE_WARNING:`--rui-state-warning`,STATE_WARNING_BACKGROUND:`--rui-state-warning-background`,STATE_ERROR:`--rui-state-error`,STATE_ERROR_BACKGROUND:`--rui-state-error-background`,STATE_INFO:`--rui-state-info`,STATE_INFO_BACKGROUND:`--rui-state-info-background`,BORDER_DEFAULT:`--rui-border-default`,BORDER_SUBTLE:`--rui-border-subtle`,BORDER_STRONG:`--rui-border-strong`,BORDER_FOCUS:`--rui-border-focus`,BORDER_HOVER:`--rui-border-hover`,BORDER_ACTIVE:`--rui-border-active`,BORDER_DISABLED:`--rui-border-disabled`,SHADOW_COLOR:`--rui-shadow-color`,SHADOW_SUBTLE:`--rui-shadow-subtle`,SHADOW_SMALL:`--rui-shadow-small`,SHADOW_MEDIUM:`--rui-shadow-medium`,SHADOW_LARGE:`--rui-shadow-large`,SHADOW_GLOW:`--rui-shadow-glow`,EFFECTS_OVERLAY:`--rui-effects-overlay`,EFFECTS_BACKDROP:`--rui-effects-backdrop`,EFFECTS_BLUR:`--rui-effects-blur`,EFFECTS_BLUR_STRONG:`--rui-effects-blur-strong`,EFFECTS_GLASS_BACKGROUND:`--rui-effects-glass-background`,EFFECTS_GLASS_BORDER:`--rui-effects-glass-border`,TYPOGRAPHY_HEADING_PRIMARY:`--rui-typography-heading-primary`,TYPOGRAPHY_HEADING_SECONDARY:`--rui-typography-heading-secondary`,TYPOGRAPHY_HEADING_MUTED:`--rui-typography-heading-muted`,TYPOGRAPHY_BODY_PRIMARY:`--rui-typography-body-primary`,TYPOGRAPHY_BODY_SECONDARY:`--rui-typography-body-secondary`,TYPOGRAPHY_BODY_MUTED:`--rui-typography-body-muted`,TYPOGRAPHY_LABEL_PRIMARY:`--rui-typography-label-primary`,TYPOGRAPHY_LABEL_SECONDARY:`--rui-typography-label-secondary`,TYPOGRAPHY_LABEL_MUTED:`--rui-typography-label-muted`,TYPOGRAPHY_BUTTON_PRIMARY:`--rui-typography-button-primary`,TYPOGRAPHY_BUTTON_SECONDARY:`--rui-typography-button-secondary`},de={THIN:100,EXTRA_LIGHT:200,LIGHT:300,REGULAR:400,MEDIUM:500,SEMI_BOLD:600,BOLD:700,EXTRA_BOLD:800,BLACK:900};function k(e,t){return Object.hasOwn(e,t)}function fe(e){let[t]=Object.keys(e);return t}function A(e,t,n){if(k(e,t))return t;if(k(e,n))return n;let r=fe(e);if(r===void 0)throw Error(`TranslateProvider requires at least one translation catalog.`);return r}function j(e,t,n,r){return k(e,t)?t:A(e,n,r)}function M(e,t){if(!k(e,t))throw Error(`Language "${t}" is not available in the translation catalog.`)}function pe(e,t){let n=e;for(let e of t.split(`.`)){if(typeof n==`string`||!Object.hasOwn(n,e))return;n=n[e]}return n}function N(e,t){if(e===void 0||t===``)return;let n=pe(e,t);return typeof n==`string`?n:void 0}function P(e,t,n){let r=n?.[t];return r===void 0?e:String(r)}function F(e,t){let n=new RegExp(S.INTERPOLATION_PLACEHOLDER,`g`);return e.replace(n,(e,n)=>P(e,n,t))}function I(e,t,n){let r=N(e,n);return r===void 0?N(t,n)??n:r}function L(e,t,n,r){return F(I(e,t,n),r)}function R(e,t){return e.find(e=>e.name===t)}function z(e){let t=e.at(0);if(t===void 0)throw Error(`ThemeProvider requires at least one registered theme.`);return t}function B(e,t){return R(e,t)??z(e)}function V(e,t,n){return R(e,t)??B(e,n)}function H(e,t){if(R(e,t)===void 0)throw Error(`Theme "${t}" is not registered in ThemeProvider.`)}function me(e){return{[O.SURFACE_BACKGROUND]:e.surface.background,[O.SURFACE_SURFACE]:e.surface.surface,[O.SURFACE_SURFACE_ELEVATED]:e.surface.surfaceElevated,[O.SURFACE_SURFACE_HOVER]:e.surface.surfaceHover,[O.SURFACE_SURFACE_ACTIVE]:e.surface.surfaceActive,[O.SURFACE_SURFACE_DISABLED]:e.surface.surfaceDisabled}}function he(e){return{[O.TEXT_PRIMARY]:e.text.primary,[O.TEXT_SECONDARY]:e.text.secondary,[O.TEXT_MUTED]:e.text.muted,[O.TEXT_DISABLED]:e.text.disabled,[O.TEXT_INVERSE]:e.text.inverse,[O.TEXT_LINK]:e.text.link,[O.TEXT_LINK_HOVER]:e.text.linkHover}}function ge(e){return{[O.BRAND_PRIMARY]:e.brand.primary,[O.BRAND_PRIMARY_HOVER]:e.brand.primaryHover,[O.BRAND_PRIMARY_ACTIVE]:e.brand.primaryActive,[O.BRAND_PRIMARY_CONTRAST]:e.brand.primaryContrast,[O.BRAND_SECONDARY]:e.brand.secondary,[O.BRAND_SECONDARY_HOVER]:e.brand.secondaryHover,[O.BRAND_SECONDARY_ACTIVE]:e.brand.secondaryActive,[O.BRAND_SECONDARY_CONTRAST]:e.brand.secondaryContrast,[O.BRAND_ACCENT]:e.brand.accent,[O.BRAND_ACCENT_HOVER]:e.brand.accentHover,[O.BRAND_ACCENT_CONTRAST]:e.brand.accentContrast}}function _e(e){return{[O.STATE_SUCCESS]:e.state.success,[O.STATE_SUCCESS_BACKGROUND]:e.state.successBackground,[O.STATE_WARNING]:e.state.warning,[O.STATE_WARNING_BACKGROUND]:e.state.warningBackground,[O.STATE_ERROR]:e.state.error,[O.STATE_ERROR_BACKGROUND]:e.state.errorBackground,[O.STATE_INFO]:e.state.info,[O.STATE_INFO_BACKGROUND]:e.state.infoBackground}}function ve(e){return{[O.BORDER_DEFAULT]:e.border.default,[O.BORDER_SUBTLE]:e.border.subtle,[O.BORDER_STRONG]:e.border.strong,[O.BORDER_FOCUS]:e.border.focus,[O.BORDER_HOVER]:e.border.hover,[O.BORDER_ACTIVE]:e.border.active,[O.BORDER_DISABLED]:e.border.disabled}}function ye(e){return{[O.EFFECTS_OVERLAY]:e.effects.overlay,[O.EFFECTS_BACKDROP]:e.effects.backdrop,[O.EFFECTS_BLUR]:e.effects.blur,[O.EFFECTS_BLUR_STRONG]:e.effects.blurStrong,[O.EFFECTS_GLASS_BACKGROUND]:e.effects.glassBackground,[O.EFFECTS_GLASS_BORDER]:e.effects.glassBorder}}function be(e){return{[O.TYPOGRAPHY_HEADING_PRIMARY]:e.typography.heading.h1.color,[O.TYPOGRAPHY_HEADING_SECONDARY]:e.typography.heading.h2.color,[O.TYPOGRAPHY_HEADING_MUTED]:e.typography.body.muted.color,[O.TYPOGRAPHY_BODY_PRIMARY]:e.typography.body.primary.color,[O.TYPOGRAPHY_BODY_SECONDARY]:e.typography.body.secondary.color,[O.TYPOGRAPHY_BODY_MUTED]:e.typography.body.muted.color,[O.TYPOGRAPHY_LABEL_PRIMARY]:e.typography.label.primary.color,[O.TYPOGRAPHY_LABEL_SECONDARY]:e.typography.label.secondary.color,[O.TYPOGRAPHY_LABEL_MUTED]:e.typography.label.muted.color,[O.TYPOGRAPHY_BUTTON_PRIMARY]:e.typography.button.primary.color,[O.TYPOGRAPHY_BUTTON_SECONDARY]:e.typography.button.secondary.color}}function U(e){let{themes:t}=e;return{...me(t),...he(t),...ge(t),..._e(t),...ve(t),...ye(t),...be(t)}}function W(){try{return globalThis.crypto}catch{return}}function G(){try{return globalThis.localStorage}catch{return}}function K(e){return new TextEncoder().encode(e)}function q(e){return new TextDecoder().decode(e)}function J(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t)}function Y(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e+=1)n[e]=t.charCodeAt(e);return n}async function X(e){let t=W();if(t===void 0||e.length===0)return;let n=await t.subtle.digest(T,K(e));return t.subtle.importKey(`raw`,n,{name:C},!1,E)}function xe(){let e=W();if(e===void 0)throw Error(`Cryptographic API is unavailable.`);return e.getRandomValues(new Uint8Array(12))}function Se(e){try{let t=Y(e);return t.length===12?t:void 0}catch{return}}function Ce(e){return e.length===2}function we(e){if(Ce(e))return[e[0],e[1]]}function Te(e){let t=we(e.split(`.`));if(t===void 0)return;let[n,r]=t,i=Se(n);if(i!==void 0)try{return{iv:i,ciphertext:Y(r)}}catch{return}}async function Ee(e,t,n){return Z().subtle.encrypt({name:C,iv:n},t,e)}async function De(e,t){return Z().subtle.decrypt({name:C,iv:e.iv},t,e.ciphertext)}function Z(){let e=W();if(e===void 0)throw Error(`Cryptographic API is unavailable.`);return e}async function Q(e,t){try{let n=await X(t);if(n===void 0)return;let r=xe(),i=await Ee(K(e),n,r);return[J(r),J(new Uint8Array(i))].join(`.`)}catch{return}}async function $(e,t){try{let n=Te(e);if(n===void 0)return;let r=await X(t);return r===void 0?void 0:q(await De(n,r))}catch{return}}exports.AES_GCM_ALGORITHM=C,exports.AES_GCM_IV_LENGTH=w,exports.ENCRYPTED_VALUE_PART_COUNT=D,exports.GLOBAL_REGEX_FLAG=ce,exports.KEY_USAGES=E,exports.RAW_KEY_FORMAT=le,exports.SHA_256_ALGORITHM=T,exports.STORAGE_VALUE_SEPARATOR=ue,exports.THEME_FONT_WEIGHT=de,exports.ThemeContext=r,exports.ThemeCssVariable=O,exports.ThemeProvider=se,exports.TranslateContext=n,exports.TranslateProvider=x,exports.TranslationRegex=S,exports.assertLanguageExists=M,exports.assertThemeExists=H,exports.createThemeVariables=U,exports.decodeBase64=Y,exports.decodeText=q,exports.decryptText=$,exports.encodeBase64=J,exports.encodeText=K,exports.encryptText=Q,exports.findTranslation=N,exports.getCryptoApi=W,exports.getLocalStorage=G,exports.interpolateTranslation=F,exports.loadEncryptedPreference=s,exports.loadLanguagePreference=u,exports.loadThemePreference=p,exports.resolveActiveLanguage=j,exports.resolveActiveTheme=V,exports.resolveInitialLanguage=A,exports.resolveInitialTheme=B,exports.saveEncryptedPreference=o,exports.saveLanguagePreference=l,exports.saveThemePreference=f,exports.translateMessage=L,exports.useLanguage=i,exports.useTheme=a,exports.useThemePreference=_;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["createContext","createContext","useContext","useContext","useCallback","useMemo","useState","useCallback","useState","useMemo","useCallback","useMemo","react","react_jsx_runtime","TranslateContext","ThemeContext","useLanguage","context","useTheme","saveEncryptedPreference","value","encryptionKey","storage","getLocalStorage","encryptedValue","encryptText","storageKey","loadEncryptedPreference","decryptText","LANGUAGE_PREFERENCE_STORAGE_KEY","saveLanguagePreference","language","loadLanguagePreference","savedLanguage","availableLanguages","THEME_PREFERENCE_STORAGE_KEY","saveThemePreference","themeName","loadThemePreference","savedTheme","themes","theme","createPreferenceState","configuration","matchesConfiguration","state","restoreSavedTheme","useRestoreThemePreference","isActive","defaultTheme","resolveInitialTheme","setPreferenceState","currentState","useSetThemePreference","assertThemeExists","nextTheme","useThemePreference","inputConfiguration","initialTheme","themeEncryptionKey","preferenceState","isCurrentConfiguration","createLanguagePreferenceState","matchesLanguageConfiguration","restoreSavedLanguage","useRestoreLanguagePreference","defaultLanguage","resolveInitialLanguage","usePersistLanguagePreference","isLoaded","useSetLanguagePreference","assertLanguageExists","nextLanguage","useLanguagePreference","selectedLanguage","setLanguage","resolveActiveLanguage","TranslateProvider","languages","translations","initialLanguage","fallbackLanguage","languageEncryptionKey","preference","contextValue","useTranslationContext","currentDictionary","fallbackDictionary","t","translateMessage","key","params","ThemeProvider","resolveActiveTheme","isPreferenceLoaded","setTheme","setThemeName","themeVariables","createThemeVariables","TranslationRegex","GLOBAL_REGEX_FLAG","AES_GCM_ALGORITHM","AES_GCM_IV_LENGTH","SHA_256_ALGORITHM","RAW_KEY_FORMAT","STORAGE_VALUE_SEPARATOR","KEY_USAGES","ENCRYPTED_VALUE_PART_COUNT","ThemeCssVariable","isLanguageAvailable","findFirstLanguage","firstLanguage","findTranslationValue","current","dictionary","segment","findTranslation","resolveInterpolationValue","placeholder","interpolateTranslation","placeholderRegex","message","resolveTranslationMessage","currentTranslation","findTheme","getFirstTheme","selectedTheme","createSurfaceVariables","colors","createTextVariables","createBrandVariables","createStateVariables","createBorderVariables","createShadowVariables","createEffectVariables","createTypographyVariables","getCryptoApi","encodeText","decodeText","encodeBase64","binary","byte","bytes","decodeBase64","index","deriveAesKey","cryptoApi","secret","digest","createInitializationVector","decodeInitializationVector","iv","hasExpectedEncryptedParts","parts","validateEncryptedParts","parseEncryptedPayload","encodedIv","encodedCiphertext","encryptPayload","requireCryptoApi","plaintext","decryptPayload","payload","ciphertext"],"sources":["../src/libs/aplicacion/contexts/translate.context.ts","../src/libs/aplicacion/contexts/theme.context.ts","../src/libs/aplicacion/hooks/use-language.ts","../src/libs/aplicacion/hooks/use-theme.ts","../src/libs/infraestructura/storage/encrypted-preference.storage.ts","../src/libs/infraestructura/storage/language-preference.storage.ts","../src/libs/infraestructura/storage/theme-preference.storage.ts","../src/libs/aplicacion/hooks/use-theme-preference.hook.ts","../src/libs/aplicacion/providers/translate.provider.tsx","../src/libs/aplicacion/providers/theme-provider.tsx","../src/libs/domain/enums/translation-regex.enum.ts","../src/libs/domain/constants/translation.constants.ts","../src/libs/domain/constants/encrypted-preference.constanst.ts","../src/libs/domain/constants/theme-css-variable.const.ts","../src/libs/aplicacion/utils/translation.utils.ts","../src/libs/aplicacion/utils/theme.utils.ts","../src/libs/aplicacion/utils/crypto-api.util.ts","../src/libs/aplicacion/utils/storage-api.util.ts","../src/libs/aplicacion/utils/text-encoding.util.ts","../src/libs/aplicacion/utils/base64.util.ts","../src/libs/aplicacion/services/encryption.service.ts"],"sourcesContent":["import type { ILanguageContextValue } from \"@domain\";\nimport { createContext } from \"react\";\n\n/**\n * @description Contexto interno de traducciones de la libreria.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport const TranslateContext = createContext<ILanguageContextValue | null>(\n null,\n);\n","import type { IThemeContextValue } from \"@domain\";\nimport { createContext } from \"react\";\n\n/**\n * @description Contexto interno del sistema de temas.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport const ThemeContext = createContext<IThemeContextValue | null>(null);\n","import { TranslateContext } from \"@aplicacion\";\nimport type { ILanguageContextValue } from \"@domain\";\nimport { useContext } from \"react\";\n\n/**\n * @description Obtiene el idioma actual y la funcion de traduccion.\n * Requiere que el componente este dentro de TranslateProvider.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function useLanguage(): ILanguageContextValue {\n const context = useContext(TranslateContext);\n\n if (context === null) {\n throw new Error(\"useLanguage must be used inside TranslateProvider.\");\n }\n\n return context;\n}\n","import { ThemeContext } from \"@aplicacion\";\nimport type { IThemeContextValue } from \"@domain\";\nimport { useContext } from \"react\";\n\n/**\n * @description Obtiene el tema activo, los temas disponibles y\n * la funcion para cambiar de tema.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function useTheme(): IThemeContextValue {\n const context = useContext(ThemeContext);\n\n if (context === null) {\n throw new Error(\"useTheme must be used inside ThemeProvider.\");\n }\n\n return context;\n}\n","import { decryptText, encryptText, getLocalStorage } from \"@aplicacion\";\n\n/**\n * @description Encrypts and saves a preference in localStorage.\n * @param storageKey Storage key.\n * @param value Value to store.\n * @param encryptionKey Encryption secret.\n * @returns Promise resolved after the save attempt.\n * @author Steveen Cues\n * @version 3.0.0\n */\nexport async function saveEncryptedPreference(\n storageKey: string,\n value: string,\n encryptionKey: string,\n): Promise<void> {\n if (value.length === 0 || encryptionKey.length === 0) {\n return;\n }\n\n try {\n const storage = getLocalStorage();\n\n if (storage === undefined) {\n return;\n }\n\n const encryptedValue = await encryptText(value, encryptionKey);\n\n if (encryptedValue === undefined) {\n return;\n }\n\n storage.setItem(storageKey, encryptedValue);\n } catch {\n // Preference persistence must not interrupt application usage.\n }\n}\n\n/**\n * @description Loads and decrypts a preference from localStorage.\n * @param storageKey Storage key.\n * @param encryptionKey Encryption secret.\n * @returns Decrypted preference or undefined when unavailable.\n * @author Steveen Cues\n * @version 3.0.0\n */\nexport async function loadEncryptedPreference(\n storageKey: string,\n encryptionKey: string,\n): Promise<string | undefined> {\n if (encryptionKey.length === 0) {\n return undefined;\n }\n\n try {\n const storage = getLocalStorage();\n\n if (storage === undefined) {\n return undefined;\n }\n\n const encryptedValue = storage.getItem(storageKey);\n\n if (encryptedValue === null) {\n return undefined;\n }\n\n return await decryptText(encryptedValue, encryptionKey);\n } catch {\n return undefined;\n }\n}\n","import {\n loadEncryptedPreference,\n saveEncryptedPreference,\n} from \"./encrypted-preference.storage\";\n\nconst LANGUAGE_PREFERENCE_STORAGE_KEY =\n \"starter-react-ui:language-preference:v1\";\n\n/**\n * @description Guarda el idioma activo de forma cifrada.\n * @param language Codigo del idioma activo.\n * @param encryptionKey Clave de cifrado proporcionada por el consumidor.\n * @returns Promesa completada al finalizar el intento de guardado.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function saveLanguagePreference(\n language: string,\n encryptionKey: string,\n): Promise<void> {\n return saveEncryptedPreference(\n LANGUAGE_PREFERENCE_STORAGE_KEY,\n language,\n encryptionKey,\n );\n}\n\n/**\n * @description Recupera el idioma guardado y verifica que siga disponible.\n * @param availableLanguages Idiomas admitidos por el proyecto.\n * @param encryptionKey Clave de cifrado proporcionada por el consumidor.\n * @returns Idioma recuperado o undefined si no existe o no es valido.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport async function loadLanguagePreference(\n availableLanguages: readonly string[],\n encryptionKey: string,\n): Promise<string | undefined> {\n const savedLanguage = await loadEncryptedPreference(\n LANGUAGE_PREFERENCE_STORAGE_KEY,\n encryptionKey,\n );\n\n if (\n savedLanguage === undefined ||\n !availableLanguages.includes(savedLanguage)\n ) {\n return undefined;\n }\n\n return savedLanguage;\n}\n","import type { AppTheme, ThemeName } from \"@domain\";\n\nimport {\n loadEncryptedPreference,\n saveEncryptedPreference,\n} from \"./encrypted-preference.storage\";\n\nconst THEME_PREFERENCE_STORAGE_KEY = \"starter-react-ui:theme-preference:v1\";\n\n/**\n * @description Guarda el nombre del tema activo de forma cifrada.\n * @param themeName Nombre del tema.\n * @param encryptionKey Clave de cifrado proporcionada por el consumidor.\n * @returns Promesa completada al finalizar el intento de guardado.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function saveThemePreference(\n themeName: ThemeName,\n encryptionKey: string,\n): Promise<void> {\n return saveEncryptedPreference(\n THEME_PREFERENCE_STORAGE_KEY,\n themeName,\n encryptionKey,\n );\n}\n\n/**\n * @description Recupera el tema guardado si existe entre los temas admitidos.\n * @param themes Temas definidos por el proyecto consumidor.\n * @param encryptionKey Clave de cifrado proporcionada por el consumidor.\n * @returns Nombre del tema recuperado o undefined.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport async function loadThemePreference(\n themes: readonly AppTheme[],\n encryptionKey: string,\n): Promise<ThemeName | undefined> {\n const savedTheme = await loadEncryptedPreference(\n THEME_PREFERENCE_STORAGE_KEY,\n encryptionKey,\n );\n\n if (savedTheme === undefined) {\n return undefined;\n }\n\n const availableTheme = themes.find(\n (theme: AppTheme): boolean => theme.name === savedTheme,\n );\n\n return availableTheme?.name;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport type {\n SetThemePreferenceState,\n ThemeName,\n ThemePreferenceConfiguration,\n ThemePreferenceResult,\n ThemePreferenceState,\n} from \"@domain\";\n\nimport { loadThemePreference } from \"@infraestructura\";\n\nimport { assertThemeExists, resolveInitialTheme } from \"@aplicacion\";\n\n/**\n * @description Creates a preference state for the given configuration.\n * @author Steveen Cues\n * @version 3.0.0\n */\nfunction createPreferenceState(\n configuration: ThemePreferenceConfiguration,\n themeName: ThemeName,\n isLoaded: boolean,\n): ThemePreferenceState {\n return {\n ...configuration,\n themeName,\n isLoaded,\n };\n}\n\n/**\n * @description Checks whether a state belongs to the active configuration.\n * @author Steveen Cues\n * @version 3.0.0\n */\nfunction matchesConfiguration(\n state: ThemePreferenceState,\n configuration: ThemePreferenceConfiguration,\n): boolean {\n return (\n state.themes === configuration.themes &&\n state.initialTheme === configuration.initialTheme &&\n state.themeEncryptionKey === configuration.themeEncryptionKey\n );\n}\n\n/**\n * @description Loads the stored theme and safely handles restoration failures.\n * @author Steveen Cues\n * @version 3.0.0\n */\nasync function restoreSavedTheme(\n configuration: ThemePreferenceConfiguration,\n): Promise<ThemeName | undefined> {\n try {\n return await loadThemePreference(\n configuration.themes,\n configuration.themeEncryptionKey,\n );\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Restores the saved preference without overriding a user selection.\n * @author Steveen Cues\n * @version 3.0.0\n */\nfunction useRestoreThemePreference(\n configuration: ThemePreferenceConfiguration,\n setPreferenceState: SetThemePreferenceState,\n): void {\n useEffect((): (() => void) => {\n let isActive = true;\n\n const restorePreference = async (): Promise<void> => {\n const savedTheme = await restoreSavedTheme(configuration);\n\n if (!isActive) {\n return;\n }\n\n const defaultTheme = resolveInitialTheme(\n configuration.themes,\n configuration.initialTheme,\n );\n\n setPreferenceState(\n (currentState: ThemePreferenceState): ThemePreferenceState => {\n if (\n matchesConfiguration(currentState, configuration) &&\n currentState.isLoaded\n ) {\n return currentState;\n }\n\n return createPreferenceState(\n configuration,\n savedTheme ?? defaultTheme.name,\n true,\n );\n },\n );\n };\n\n void restorePreference();\n\n return (): void => {\n isActive = false;\n };\n }, [configuration, setPreferenceState]);\n}\n\n/**\n * @description Creates a validated theme selection handler.\n * @author Steveen Cues\n * @version 3.0.0\n */\nfunction useSetThemePreference(\n configuration: ThemePreferenceConfiguration,\n setPreferenceState: SetThemePreferenceState,\n): (nextTheme: ThemeName) => void {\n return useCallback(\n (nextTheme: ThemeName): void => {\n assertThemeExists(configuration.themes, nextTheme);\n\n setPreferenceState(createPreferenceState(configuration, nextTheme, true));\n },\n [configuration, setPreferenceState],\n );\n}\n\n/**\n * @description Manages the selected theme and its encrypted persistence lifecycle.\n * @author Steveen Cues\n * @version 3.0.0\n */\nexport function useThemePreference(\n inputConfiguration: ThemePreferenceConfiguration,\n): ThemePreferenceResult {\n const { themes, initialTheme, themeEncryptionKey } = inputConfiguration;\n\n const configuration = useMemo(\n (): ThemePreferenceConfiguration => ({\n themes,\n initialTheme,\n themeEncryptionKey,\n }),\n [themes, initialTheme, themeEncryptionKey],\n );\n\n const [preferenceState, setPreferenceState] = useState<ThemePreferenceState>(\n (): ThemePreferenceState =>\n createPreferenceState(\n configuration,\n resolveInitialTheme(themes, initialTheme).name,\n false,\n ),\n );\n\n useRestoreThemePreference(configuration, setPreferenceState);\n\n const isCurrentConfiguration = matchesConfiguration(\n preferenceState,\n configuration,\n );\n\n const themeName = isCurrentConfiguration\n ? preferenceState.themeName\n : resolveInitialTheme(themes, initialTheme).name;\n\n const isPreferenceLoaded = isCurrentConfiguration && preferenceState.isLoaded;\n\n const setThemeName = useSetThemePreference(configuration, setPreferenceState);\n\n return {\n themeName,\n isPreferenceLoaded,\n setThemeName,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport type { JSX } from \"react\";\n\nimport type {\n ILanguageContextValue,\n ITranslateProviderProps,\n TranslationParams,\n TranslationDictionary,\n} from \"@domain\";\n\nimport { TranslateContext } from \"@aplicacion\";\n\nimport {\n loadLanguagePreference,\n saveLanguagePreference,\n} from \"@infraestructura\";\n\nimport {\n assertLanguageExists,\n resolveActiveLanguage,\n resolveInitialLanguage,\n translateMessage,\n} from \"@aplicacion\";\n\ninterface LanguagePreferenceConfiguration {\n readonly translations: ITranslateProviderProps[\"translations\"];\n readonly initialLanguage: ITranslateProviderProps[\"initialLanguage\"];\n readonly fallbackLanguage: string;\n readonly languageEncryptionKey: ITranslateProviderProps[\"languageEncryptionKey\"];\n readonly languages: readonly string[];\n}\n\ninterface LanguagePreferenceState extends LanguagePreferenceConfiguration {\n readonly selectedLanguage: string;\n readonly isLoaded: boolean;\n}\n\ninterface LanguagePreferenceResult {\n readonly language: string;\n readonly isLoaded: boolean;\n readonly setLanguage: (language: string) => void;\n}\n\ntype SetLanguagePreferenceState = React.Dispatch<\n React.SetStateAction<LanguagePreferenceState>\n>;\n\n/**\n * @description Creates the initial language preference state.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction createLanguagePreferenceState(\n configuration: LanguagePreferenceConfiguration,\n selectedLanguage: string,\n isLoaded: boolean,\n): LanguagePreferenceState {\n return {\n ...configuration,\n selectedLanguage,\n isLoaded,\n };\n}\n\n/**\n * @description Checks whether a state matches the active configuration.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction matchesLanguageConfiguration(\n state: LanguagePreferenceState,\n configuration: LanguagePreferenceConfiguration,\n): boolean {\n return (\n state.translations === configuration.translations &&\n state.initialLanguage === configuration.initialLanguage &&\n state.fallbackLanguage === configuration.fallbackLanguage &&\n state.languageEncryptionKey === configuration.languageEncryptionKey &&\n state.languages === configuration.languages\n );\n}\n\n/**\n * @description Restores the saved language and falls back when loading fails.\n * @author Steveen Cues\n * @version 4.0.0\n */\nasync function restoreSavedLanguage(\n configuration: LanguagePreferenceConfiguration,\n): Promise<string | undefined> {\n try {\n return await loadLanguagePreference(\n configuration.languages,\n configuration.languageEncryptionKey,\n );\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Restores the saved language for the active configuration.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction useRestoreLanguagePreference(\n configuration: LanguagePreferenceConfiguration,\n setPreferenceState: SetLanguagePreferenceState,\n): void {\n useEffect((): (() => void) => {\n let isActive = true;\n\n const restorePreference = async (): Promise<void> => {\n const savedLanguage = await restoreSavedLanguage(configuration);\n\n if (!isActive) {\n return;\n }\n\n const defaultLanguage = resolveInitialLanguage(\n configuration.translations,\n configuration.initialLanguage,\n configuration.fallbackLanguage,\n );\n\n setPreferenceState(\n (currentState: LanguagePreferenceState): LanguagePreferenceState => {\n if (\n matchesLanguageConfiguration(currentState, configuration) &&\n currentState.isLoaded\n ) {\n return currentState;\n }\n\n return createLanguagePreferenceState(\n configuration,\n savedLanguage ?? defaultLanguage,\n true,\n );\n },\n );\n };\n\n void restorePreference();\n\n return (): void => {\n isActive = false;\n };\n }, [configuration, setPreferenceState]);\n}\n\n/**\n * @description Persists the active language after preference restoration.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction usePersistLanguagePreference(\n configuration: LanguagePreferenceConfiguration,\n language: string,\n isLoaded: boolean,\n): void {\n useEffect((): void => {\n if (!isLoaded) {\n return;\n }\n\n void saveLanguagePreference(language, configuration.languageEncryptionKey);\n }, [configuration.languageEncryptionKey, language, isLoaded]);\n}\n\n/**\n * @description Creates a validated language selection handler.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction useSetLanguagePreference(\n configuration: LanguagePreferenceConfiguration,\n setPreferenceState: SetLanguagePreferenceState,\n): (language: string) => void {\n return useCallback(\n (nextLanguage: string): void => {\n assertLanguageExists(configuration.translations, nextLanguage);\n\n setPreferenceState(\n createLanguagePreferenceState(configuration, nextLanguage, true),\n );\n },\n [configuration, setPreferenceState],\n );\n}\n\n/**\n * @description Manages language selection, restoration, and persistence.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction useLanguagePreference(\n configuration: LanguagePreferenceConfiguration,\n): LanguagePreferenceResult {\n const [preferenceState, setPreferenceState] =\n useState<LanguagePreferenceState>((): LanguagePreferenceState =>\n createLanguagePreferenceState(\n configuration,\n configuration.initialLanguage,\n false,\n ),\n );\n\n useRestoreLanguagePreference(configuration, setPreferenceState);\n\n const isCurrentConfiguration = matchesLanguageConfiguration(\n preferenceState,\n configuration,\n );\n\n const selectedLanguage = isCurrentConfiguration\n ? preferenceState.selectedLanguage\n : configuration.initialLanguage;\n\n const isLoaded = isCurrentConfiguration && preferenceState.isLoaded;\n\n const setLanguage = useSetLanguagePreference(\n configuration,\n setPreferenceState,\n );\n\n return {\n language: resolveActiveLanguage(\n configuration.translations,\n selectedLanguage,\n configuration.initialLanguage,\n configuration.fallbackLanguage,\n ),\n isLoaded,\n setLanguage,\n };\n}\n\n/**\n * @description Provides the active language and translation functions.\n * @author Steveen Cues\n * @version 4.0.0\n */\nexport function TranslateProvider({\n translations,\n initialLanguage,\n fallbackLanguage = \"en\",\n languageEncryptionKey,\n children,\n}: ITranslateProviderProps): JSX.Element {\n const languages = useMemo(\n (): readonly string[] => Object.keys(translations),\n [translations],\n );\n\n const configuration = useMemo(\n (): LanguagePreferenceConfiguration => ({\n translations,\n initialLanguage,\n fallbackLanguage,\n languageEncryptionKey,\n languages,\n }),\n [\n translations,\n initialLanguage,\n fallbackLanguage,\n languageEncryptionKey,\n languages,\n ],\n );\n\n const preference = useLanguagePreference(configuration);\n\n usePersistLanguagePreference(\n configuration,\n preference.language,\n preference.isLoaded,\n );\n\n const contextValue = useTranslationContext(configuration, preference);\n\n return (\n <TranslateContext.Provider value={contextValue}>\n {children}\n </TranslateContext.Provider>\n );\n}\n\n/**\n * @description Creates the translation context value.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction useTranslationContext(\n configuration: LanguagePreferenceConfiguration,\n preference: LanguagePreferenceResult,\n): ILanguageContextValue {\n const currentDictionary: TranslationDictionary =\n configuration.translations[preference.language];\n\n const fallbackDictionary: TranslationDictionary =\n configuration.translations[configuration.fallbackLanguage];\n\n const t = useCallback(\n (key: string, params?: TranslationParams): string =>\n translateMessage(currentDictionary, fallbackDictionary, key, params),\n [currentDictionary, fallbackDictionary],\n );\n\n return useMemo(\n (): ILanguageContextValue => ({\n language: preference.language,\n languages: configuration.languages,\n setLanguage: preference.setLanguage,\n t,\n }),\n [preference.language, preference.setLanguage, configuration.languages, t],\n );\n}\n","import { useCallback, useEffect, useMemo } from \"react\";\n\nimport type {\n IThemeContextValue,\n IThemeProviderProps,\n ThemeName,\n} from \"@domain\";\nimport type { JSX } from \"react\";\n\nimport { saveThemePreference } from \"@infraestructura\";\n\nimport {\n ThemeContext,\n createThemeVariables,\n resolveActiveTheme,\n useThemePreference,\n} from \"@aplicacion\";\n\n/**\n * @description Provides the active theme and allows theme changes.\n * Restores and persists the encrypted theme preference.\n * @author Steveen Cues\n * @version 4.0.0\n */\nexport function ThemeProvider({\n themes,\n initialTheme,\n themeEncryptionKey,\n children,\n}: IThemeProviderProps): JSX.Element {\n const { themeName, isPreferenceLoaded, setThemeName } = useThemePreference({\n themes,\n initialTheme,\n themeEncryptionKey,\n });\n\n const theme = resolveActiveTheme(themes, themeName, initialTheme);\n\n useEffect((): void => {\n if (!isPreferenceLoaded) {\n return;\n }\n\n void saveThemePreference(theme.name, themeEncryptionKey);\n }, [isPreferenceLoaded, theme.name, themeEncryptionKey]);\n\n const setTheme = useCallback(\n (nextTheme: ThemeName): void => setThemeName(nextTheme),\n [setThemeName],\n );\n\n const themeVariables = useMemo(() => createThemeVariables(theme), [theme]);\n\n const contextValue = useMemo<IThemeContextValue>(\n () => ({\n theme,\n themeName: theme.name,\n themes,\n setTheme,\n }),\n [theme, themes, setTheme],\n );\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <div\n data-rui-theme={theme.name}\n style={{\n ...themeVariables,\n display: \"contents\",\n }}\n >\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n","/**\n * @description Expresiones regulares reutilizables para traducciones.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport const TranslationRegex = Object.freeze({\n INTERPOLATION_PLACEHOLDER: String.raw`\\{\\{([a-zA-Z0-9_]+)\\}\\}`,\n});\n","export const GLOBAL_REGEX_FLAG = \"g\";\n","export const AES_GCM_ALGORITHM = \"AES-GCM\";\nexport const AES_GCM_IV_LENGTH = 12;\nexport const SHA_256_ALGORITHM = \"SHA-256\";\nexport const RAW_KEY_FORMAT = \"raw\";\nexport const STORAGE_VALUE_SEPARATOR = \".\";\nexport const KEY_USAGES: KeyUsage[] = [\"encrypt\", \"decrypt\"];\nexport const ENCRYPTED_VALUE_PART_COUNT = 2;\n","/**\n * @description Define los nombres de las variables CSS de la libreria.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport const ThemeCssVariable = {\n SURFACE_BACKGROUND: \"--rui-surface-background\",\n SURFACE_SURFACE: \"--rui-surface-surface\",\n SURFACE_SURFACE_ELEVATED: \"--rui-surface-surface-elevated\",\n SURFACE_SURFACE_HOVER: \"--rui-surface-surface-hover\",\n SURFACE_SURFACE_ACTIVE: \"--rui-surface-surface-active\",\n SURFACE_SURFACE_DISABLED: \"--rui-surface-surface-disabled\",\n\n TEXT_PRIMARY: \"--rui-text-primary\",\n TEXT_SECONDARY: \"--rui-text-secondary\",\n TEXT_MUTED: \"--rui-text-muted\",\n TEXT_DISABLED: \"--rui-text-disabled\",\n TEXT_INVERSE: \"--rui-text-inverse\",\n TEXT_LINK: \"--rui-text-link\",\n TEXT_LINK_HOVER: \"--rui-text-link-hover\",\n\n BRAND_PRIMARY: \"--rui-brand-primary\",\n BRAND_PRIMARY_HOVER: \"--rui-brand-primary-hover\",\n BRAND_PRIMARY_ACTIVE: \"--rui-brand-primary-active\",\n BRAND_PRIMARY_CONTRAST: \"--rui-brand-primary-contrast\",\n BRAND_SECONDARY: \"--rui-brand-secondary\",\n BRAND_SECONDARY_HOVER: \"--rui-brand-secondary-hover\",\n BRAND_SECONDARY_ACTIVE: \"--rui-brand-secondary-active\",\n BRAND_SECONDARY_CONTRAST: \"--rui-brand-secondary-contrast\",\n BRAND_ACCENT: \"--rui-brand-accent\",\n BRAND_ACCENT_HOVER: \"--rui-brand-accent-hover\",\n BRAND_ACCENT_CONTRAST: \"--rui-brand-accent-contrast\",\n\n STATE_SUCCESS: \"--rui-state-success\",\n STATE_SUCCESS_BACKGROUND: \"--rui-state-success-background\",\n STATE_WARNING: \"--rui-state-warning\",\n STATE_WARNING_BACKGROUND: \"--rui-state-warning-background\",\n STATE_ERROR: \"--rui-state-error\",\n STATE_ERROR_BACKGROUND: \"--rui-state-error-background\",\n STATE_INFO: \"--rui-state-info\",\n STATE_INFO_BACKGROUND: \"--rui-state-info-background\",\n\n BORDER_DEFAULT: \"--rui-border-default\",\n BORDER_SUBTLE: \"--rui-border-subtle\",\n BORDER_STRONG: \"--rui-border-strong\",\n BORDER_FOCUS: \"--rui-border-focus\",\n BORDER_HOVER: \"--rui-border-hover\",\n BORDER_ACTIVE: \"--rui-border-active\",\n BORDER_DISABLED: \"--rui-border-disabled\",\n\n SHADOW_COLOR: \"--rui-shadow-color\",\n SHADOW_SUBTLE: \"--rui-shadow-subtle\",\n SHADOW_SMALL: \"--rui-shadow-small\",\n SHADOW_MEDIUM: \"--rui-shadow-medium\",\n SHADOW_LARGE: \"--rui-shadow-large\",\n SHADOW_GLOW: \"--rui-shadow-glow\",\n\n EFFECTS_OVERLAY: \"--rui-effects-overlay\",\n EFFECTS_BACKDROP: \"--rui-effects-backdrop\",\n EFFECTS_BLUR: \"--rui-effects-blur\",\n EFFECTS_BLUR_STRONG: \"--rui-effects-blur-strong\",\n EFFECTS_GLASS_BACKGROUND: \"--rui-effects-glass-background\",\n EFFECTS_GLASS_BORDER: \"--rui-effects-glass-border\",\n\n TYPOGRAPHY_HEADING_PRIMARY: \"--rui-typography-heading-primary\",\n TYPOGRAPHY_HEADING_SECONDARY: \"--rui-typography-heading-secondary\",\n TYPOGRAPHY_HEADING_MUTED: \"--rui-typography-heading-muted\",\n TYPOGRAPHY_BODY_PRIMARY: \"--rui-typography-body-primary\",\n TYPOGRAPHY_BODY_SECONDARY: \"--rui-typography-body-secondary\",\n TYPOGRAPHY_BODY_MUTED: \"--rui-typography-body-muted\",\n TYPOGRAPHY_LABEL_PRIMARY: \"--rui-typography-label-primary\",\n TYPOGRAPHY_LABEL_SECONDARY: \"--rui-typography-label-secondary\",\n TYPOGRAPHY_LABEL_MUTED: \"--rui-typography-label-muted\",\n TYPOGRAPHY_BUTTON_PRIMARY: \"--rui-typography-button-primary\",\n TYPOGRAPHY_BUTTON_SECONDARY: \"--rui-typography-button-secondary\",\n} as const;\n","import {\n type TranslationCatalog,\n type TranslationDictionary,\n type TranslationParams,\n type TranslationValue,\n GLOBAL_REGEX_FLAG,\n TranslationRegex,\n} from \"@domain\";\n\n/**\n * @description Comprueba si un idioma existe en el catalogo.\n * @param translations Catalogo disponible.\n * @param language Codigo del idioma.\n * @returns Indica si el idioma esta registrado.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction isLanguageAvailable(\n translations: TranslationCatalog,\n language: string,\n): boolean {\n return Object.hasOwn(translations, language);\n}\n\n/**\n * @description Obtiene el primer idioma registrado en el catalogo.\n * @param translations Catalogo de traducciones.\n * @returns Codigo del primer idioma o undefined si esta vacio.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction findFirstLanguage(\n translations: TranslationCatalog,\n): string | undefined {\n const [firstLanguage] = Object.keys(translations);\n\n return firstLanguage;\n}\n\n/**\n * @description Obtiene el idioma inicial disponible, priorizando el\n * idioma solicitado, el idioma de respaldo y el primer idioma registrado.\n * @param translations Catalogo de traducciones.\n * @param initialLanguage Idioma solicitado inicialmente.\n * @param fallbackLanguage Idioma de respaldo.\n * @returns Codigo del idioma inicial disponible.\n * @throws Error cuando el catalogo esta vacio.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function resolveInitialLanguage(\n translations: TranslationCatalog,\n initialLanguage: string,\n fallbackLanguage: string,\n): string {\n if (isLanguageAvailable(translations, initialLanguage)) {\n return initialLanguage;\n }\n\n if (isLanguageAvailable(translations, fallbackLanguage)) {\n return fallbackLanguage;\n }\n\n const firstLanguage = findFirstLanguage(translations);\n\n if (firstLanguage === undefined) {\n throw new Error(\n \"TranslateProvider requires at least one translation catalog.\",\n );\n }\n\n return firstLanguage;\n}\n\n/**\n * @description Resuelve el idioma seleccionado y utiliza el idioma\n * inicial, el respaldo o el primer idioma disponible si es necesario.\n * @param translations Catalogo de traducciones.\n * @param selectedLanguage Idioma seleccionado actualmente.\n * @param initialLanguage Idioma inicial configurado.\n * @param fallbackLanguage Idioma de respaldo.\n * @returns Codigo del idioma activo.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function resolveActiveLanguage(\n translations: TranslationCatalog,\n selectedLanguage: string,\n initialLanguage: string,\n fallbackLanguage: string,\n): string {\n if (isLanguageAvailable(translations, selectedLanguage)) {\n return selectedLanguage;\n }\n\n return resolveInitialLanguage(\n translations,\n initialLanguage,\n fallbackLanguage,\n );\n}\n\n/**\n * @description Valida que un idioma este registrado en el catalogo.\n * @param translations Catalogo de traducciones.\n * @param language Codigo del idioma que se desea validar.\n * @returns No devuelve ningun valor.\n * @throws Error cuando el idioma no esta disponible.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function assertLanguageExists(\n translations: TranslationCatalog,\n language: string,\n): void {\n if (isLanguageAvailable(translations, language)) {\n return;\n }\n\n throw new Error(\n `Language \"${language}\" is not available in the translation catalog.`,\n );\n}\n\n/**\n * @description Obtiene el valor anidado de una clave usando notacion\n * de puntos, por ejemplo \"navigation.contact\".\n * @param dictionary Diccionario donde se realiza la busqueda.\n * @param key Clave de traduccion.\n * @returns Valor encontrado o undefined si no existe.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction findTranslationValue(\n dictionary: TranslationDictionary,\n key: string,\n): TranslationValue | undefined {\n let current: TranslationValue = dictionary;\n\n for (const segment of key.split(\".\")) {\n if (typeof current === \"string\") {\n return undefined;\n }\n\n if (!Object.hasOwn(current, segment)) {\n return undefined;\n }\n\n current = current[segment];\n }\n\n return current;\n}\n\n/**\n * @description Busca una traduccion dentro de un diccionario.\n * @param dictionary Diccionario del idioma.\n * @param key Clave con notacion de puntos.\n * @returns Traduccion encontrada o undefined.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function findTranslation(\n dictionary: TranslationDictionary | undefined,\n key: string,\n): string | undefined {\n if (dictionary === undefined || key === \"\") {\n return undefined;\n }\n\n const value = findTranslationValue(dictionary, key);\n\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * @description Resuelve el texto correspondiente a un marcador de\n * interpolacion sin eliminarlo cuando falta su parametro.\n * @param placeholder Marcador original, por ejemplo {{name}}.\n * @param key Nombre del parametro.\n * @param params Parametros disponibles.\n * @returns Valor interpolado o marcador original.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction resolveInterpolationValue(\n placeholder: string,\n key: string,\n params: TranslationParams | undefined,\n): string {\n const value = params?.[key];\n\n return value === undefined ? placeholder : String(value);\n}\n\n/**\n * @description Sustituye los marcadores {{name}} usando los parametros.\n * @param message Mensaje que se desea interpolar.\n * @param params Valores disponibles para la interpolacion.\n * @returns Mensaje con los parametros sustituidos.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function interpolateTranslation(\n message: string,\n params?: TranslationParams,\n): string {\n const placeholderRegex = new RegExp(\n TranslationRegex.INTERPOLATION_PLACEHOLDER,\n GLOBAL_REGEX_FLAG,\n );\n\n return message.replace(\n placeholderRegex,\n (placeholder: string, key: string): string =>\n resolveInterpolationValue(placeholder, key, params),\n );\n}\n\n/**\n * @description Busca una traduccion en el idioma activo y utiliza el\n * idioma de respaldo cuando la clave no esta disponible.\n * @param currentDictionary Diccionario del idioma activo.\n * @param fallbackDictionary Diccionario del idioma de respaldo.\n * @param key Clave de traduccion.\n * @returns Traduccion encontrada o clave original.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction resolveTranslationMessage(\n currentDictionary: TranslationDictionary | undefined,\n fallbackDictionary: TranslationDictionary | undefined,\n key: string,\n): string {\n const currentTranslation = findTranslation(currentDictionary, key);\n\n if (currentTranslation !== undefined) {\n return currentTranslation;\n }\n\n const fallbackTranslation = findTranslation(fallbackDictionary, key);\n\n return fallbackTranslation ?? key;\n}\n\n/**\n * @description Traduce un mensaje aplicando respaldo e interpolacion.\n * @param currentDictionary Diccionario del idioma activo.\n * @param fallbackDictionary Diccionario del idioma de respaldo.\n * @param key Clave de traduccion.\n * @param params Parametros de interpolacion.\n * @returns Mensaje final traducido e interpolado.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function translateMessage(\n currentDictionary: TranslationDictionary | undefined,\n fallbackDictionary: TranslationDictionary | undefined,\n key: string,\n params?: TranslationParams,\n): string {\n const message = resolveTranslationMessage(\n currentDictionary,\n fallbackDictionary,\n key,\n );\n\n return interpolateTranslation(message, params);\n}\n","import {\n ThemeCssVariable,\n type AppTheme,\n type BorderVariables,\n type BrandVariables,\n type EffectVariables,\n type ShadowVariables,\n type StateVariables,\n type SurfaceVariables,\n type TextVariables,\n type ThemeCssVariables,\n type ThemeName,\n type TypographyVariables,\n} from \"@domain\";\n\n/**\n * @description Busca un tema por su nombre.\n * @author Steveen Cues\n * @version 1.0.0\n */\nfunction findTheme(\n themes: readonly AppTheme[],\n themeName: ThemeName,\n): AppTheme | undefined {\n return themes.find((theme) => theme.name === themeName);\n}\n\n/**\n * @description Obtiene el primer tema registrado.\n * @throws {Error} Cuando no hay temas registrados.\n * @author Steveen Cues\n * @version 1.0.0\n */\nfunction getFirstTheme(themes: readonly AppTheme[]): AppTheme {\n if (themes.length === 0) {\n throw new Error(\"ThemeProvider requires at least one registered theme.\");\n }\n\n return themes[0];\n}\n\n/**\n * @description Resuelve el tema inicial solicitado o utiliza el primero registrado.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function resolveInitialTheme(\n themes: readonly AppTheme[],\n initialTheme: ThemeName,\n): AppTheme {\n return findTheme(themes, initialTheme) ?? getFirstTheme(themes);\n}\n\n/**\n * @description Resuelve el tema activo o recupera uno disponible.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function resolveActiveTheme(\n themes: readonly AppTheme[],\n selectedTheme: ThemeName,\n initialTheme: ThemeName,\n): AppTheme {\n return (\n findTheme(themes, selectedTheme) ??\n resolveInitialTheme(themes, initialTheme)\n );\n}\n\n/**\n * @description Valida que el tema solicitado este registrado.\n * @throws {Error} Cuando el tema no esta registrado.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function assertThemeExists(\n themes: readonly AppTheme[],\n themeName: ThemeName,\n): void {\n if (findTheme(themes, themeName) === undefined) {\n throw new Error(`Theme \"${themeName}\" is not registered in ThemeProvider.`);\n }\n}\n\n/**\n * @description Crea variables CSS para los colores de superficie.\n * @author Steveen Cues\n * @version 1.3.0\n */\nfunction createSurfaceVariables(colors: AppTheme[\"colors\"]): SurfaceVariables {\n return {\n [ThemeCssVariable.SURFACE_BACKGROUND]: colors.surface.background,\n [ThemeCssVariable.SURFACE_SURFACE]: colors.surface.surface,\n [ThemeCssVariable.SURFACE_SURFACE_ELEVATED]: colors.surface.surfaceElevated,\n [ThemeCssVariable.SURFACE_SURFACE_HOVER]: colors.surface.surfaceHover,\n [ThemeCssVariable.SURFACE_SURFACE_ACTIVE]: colors.surface.surfaceActive,\n [ThemeCssVariable.SURFACE_SURFACE_DISABLED]: colors.surface.surfaceDisabled,\n };\n}\n\n/**\n * @description Crea variables CSS para los colores de texto.\n * @author Steveen Cues\n * @version 1.3.0\n */\nfunction createTextVariables(colors: AppTheme[\"colors\"]): TextVariables {\n return {\n [ThemeCssVariable.TEXT_PRIMARY]: colors.text.primary,\n [ThemeCssVariable.TEXT_SECONDARY]: colors.text.secondary,\n [ThemeCssVariable.TEXT_MUTED]: colors.text.muted,\n [ThemeCssVariable.TEXT_DISABLED]: colors.text.disabled,\n [ThemeCssVariable.TEXT_INVERSE]: colors.text.inverse,\n [ThemeCssVariable.TEXT_LINK]: colors.text.link,\n [ThemeCssVariable.TEXT_LINK_HOVER]: colors.text.linkHover,\n };\n}\n\n/**\n * @description Crea variables CSS para los colores de marca.\n * @author Steveen Cues\n * @version 1.3.0\n */\nfunction createBrandVariables(colors: AppTheme[\"colors\"]): BrandVariables {\n return {\n [ThemeCssVariable.BRAND_PRIMARY]: colors.brand.primary,\n [ThemeCssVariable.BRAND_PRIMARY_HOVER]: colors.brand.primaryHover,\n [ThemeCssVariable.BRAND_PRIMARY_ACTIVE]: colors.brand.primaryActive,\n [ThemeCssVariable.BRAND_PRIMARY_CONTRAST]: colors.brand.primaryContrast,\n [ThemeCssVariable.BRAND_SECONDARY]: colors.brand.secondary,\n [ThemeCssVariable.BRAND_SECONDARY_HOVER]: colors.brand.secondaryHover,\n [ThemeCssVariable.BRAND_SECONDARY_ACTIVE]: colors.brand.secondaryActive,\n [ThemeCssVariable.BRAND_SECONDARY_CONTRAST]: colors.brand.secondaryContrast,\n [ThemeCssVariable.BRAND_ACCENT]: colors.brand.accent,\n [ThemeCssVariable.BRAND_ACCENT_HOVER]: colors.brand.accentHover,\n [ThemeCssVariable.BRAND_ACCENT_CONTRAST]: colors.brand.accentContrast,\n };\n}\n\n/**\n * @description Crea variables CSS para los estados.\n * @author Steveen Cues\n * @version 1.3.0\n */\nfunction createStateVariables(colors: AppTheme[\"colors\"]): StateVariables {\n return {\n [ThemeCssVariable.STATE_SUCCESS]: colors.state.success,\n [ThemeCssVariable.STATE_SUCCESS_BACKGROUND]: colors.state.successBackground,\n [ThemeCssVariable.STATE_WARNING]: colors.state.warning,\n [ThemeCssVariable.STATE_WARNING_BACKGROUND]: colors.state.warningBackground,\n [ThemeCssVariable.STATE_ERROR]: colors.state.error,\n [ThemeCssVariable.STATE_ERROR_BACKGROUND]: colors.state.errorBackground,\n [ThemeCssVariable.STATE_INFO]: colors.state.info,\n [ThemeCssVariable.STATE_INFO_BACKGROUND]: colors.state.infoBackground,\n };\n}\n\n/**\n * @description Crea variables CSS para los bordes.\n * @author Steveen Cues\n * @version 1.3.0\n */\nfunction createBorderVariables(colors: AppTheme[\"colors\"]): BorderVariables {\n return {\n [ThemeCssVariable.BORDER_DEFAULT]: colors.border.default,\n [ThemeCssVariable.BORDER_SUBTLE]: colors.border.subtle,\n [ThemeCssVariable.BORDER_STRONG]: colors.border.strong,\n [ThemeCssVariable.BORDER_FOCUS]: colors.border.focus,\n [ThemeCssVariable.BORDER_HOVER]: colors.border.hover,\n [ThemeCssVariable.BORDER_ACTIVE]: colors.border.active,\n [ThemeCssVariable.BORDER_DISABLED]: colors.border.disabled,\n };\n}\n\n/**\n * @description Crea variables CSS para las sombras.\n * @author Steveen Cues\n * @version 1.3.0\n */\nfunction createShadowVariables(colors: AppTheme[\"colors\"]): ShadowVariables {\n return {\n [ThemeCssVariable.SHADOW_COLOR]: colors.shadow.color,\n [ThemeCssVariable.SHADOW_SUBTLE]: colors.shadow.subtle,\n [ThemeCssVariable.SHADOW_SMALL]: colors.shadow.small,\n [ThemeCssVariable.SHADOW_MEDIUM]: colors.shadow.medium,\n [ThemeCssVariable.SHADOW_LARGE]: colors.shadow.large,\n [ThemeCssVariable.SHADOW_GLOW]: colors.shadow.glow,\n };\n}\n\n/**\n * @description Crea variables CSS para los efectos visuales.\n * @author Steveen Cues\n * @version 1.3.0\n */\nfunction createEffectVariables(colors: AppTheme[\"colors\"]): EffectVariables {\n return {\n [ThemeCssVariable.EFFECTS_OVERLAY]: colors.effects.overlay,\n [ThemeCssVariable.EFFECTS_BACKDROP]: colors.effects.backdrop,\n [ThemeCssVariable.EFFECTS_BLUR]: colors.effects.blur,\n [ThemeCssVariable.EFFECTS_BLUR_STRONG]: colors.effects.blurStrong,\n [ThemeCssVariable.EFFECTS_GLASS_BACKGROUND]: colors.effects.glassBackground,\n [ThemeCssVariable.EFFECTS_GLASS_BORDER]: colors.effects.glassBorder,\n };\n}\n\n/**\n * @description Crea variables CSS para la tipografia.\n * @author Steveen Cues\n * @version 1.3.0\n */\nfunction createTypographyVariables(\n colors: AppTheme[\"colors\"],\n): TypographyVariables {\n return {\n [ThemeCssVariable.TYPOGRAPHY_HEADING_PRIMARY]:\n colors.typography.heading.primary,\n [ThemeCssVariable.TYPOGRAPHY_HEADING_SECONDARY]:\n colors.typography.heading.secondary,\n [ThemeCssVariable.TYPOGRAPHY_HEADING_MUTED]:\n colors.typography.heading.muted,\n [ThemeCssVariable.TYPOGRAPHY_BODY_PRIMARY]: colors.typography.body.primary,\n [ThemeCssVariable.TYPOGRAPHY_BODY_SECONDARY]:\n colors.typography.body.secondary,\n [ThemeCssVariable.TYPOGRAPHY_BODY_MUTED]: colors.typography.body.muted,\n [ThemeCssVariable.TYPOGRAPHY_LABEL_PRIMARY]:\n colors.typography.label.primary,\n [ThemeCssVariable.TYPOGRAPHY_LABEL_SECONDARY]:\n colors.typography.label.secondary,\n [ThemeCssVariable.TYPOGRAPHY_LABEL_MUTED]: colors.typography.label.muted,\n [ThemeCssVariable.TYPOGRAPHY_BUTTON_PRIMARY]:\n colors.typography.button.primary,\n [ThemeCssVariable.TYPOGRAPHY_BUTTON_SECONDARY]:\n colors.typography.button.secondary,\n };\n}\n\n/**\n * @description Genera todas las variables CSS a partir de los tokens del tema.\n * @author Steveen Cues\n * @version 1.3.0\n */\nexport function createThemeVariables(theme: AppTheme): ThemeCssVariables {\n const { colors } = theme;\n\n return {\n ...createSurfaceVariables(colors),\n ...createTextVariables(colors),\n ...createBrandVariables(colors),\n ...createStateVariables(colors),\n ...createBorderVariables(colors),\n ...createShadowVariables(colors),\n ...createEffectVariables(colors),\n ...createTypographyVariables(colors),\n };\n}\n","/**\n * @description Obtains the cryptographic API when available.\n * @returns Cryptographic API or undefined if unavailable.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function getCryptoApi(): Crypto | undefined {\n try {\n return globalThis.crypto;\n } catch {\n return undefined;\n }\n}\n","/**\n * @description Obtains localStorage when available.\n * @returns Browser storage or undefined if unavailable.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function getLocalStorage(): Storage | undefined {\n try {\n return globalThis.localStorage;\n } catch {\n return undefined;\n }\n}\n","/**\n * @description Encodes text into UTF-8 bytes.\n * @param value Text to encode.\n * @returns Encoded bytes.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function encodeText(value: string): Uint8Array<ArrayBuffer> {\n return new TextEncoder().encode(value);\n}\n\n/**\n * @description Decodes UTF-8 bytes into text.\n * @param value Encoded bytes.\n * @returns Decoded text.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function decodeText(value: ArrayBuffer): string {\n return new TextDecoder().decode(value);\n}\n","/**\n * @description Encodes bytes into Base64.\n * @param bytes Bytes to encode.\n * @returns Base64 string.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function encodeBase64(bytes: Uint8Array): string {\n let binary = \"\";\n\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n return btoa(binary);\n}\n\n/**\n * @description Decodes Base64 into bytes.\n * @param value Base64 string.\n * @returns Decoded bytes.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function decodeBase64(value: string): Uint8Array<ArrayBuffer> {\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n\n return bytes;\n}\n","import {\n AES_GCM_ALGORITHM,\n AES_GCM_IV_LENGTH,\n ENCRYPTED_VALUE_PART_COUNT,\n KEY_USAGES,\n RAW_KEY_FORMAT,\n SHA_256_ALGORITHM,\n STORAGE_VALUE_SEPARATOR,\n} from \"@domain\";\n\nimport {\n decodeBase64,\n encodeBase64,\n getCryptoApi,\n decodeText,\n encodeText,\n} from \"@aplicacion\";\n\n/**\n * @description Represents validated encrypted data.\n * @author Steveen Cues\n * @version 2.0.0\n */\ninterface EncryptedPayload {\n iv: Uint8Array<ArrayBuffer>;\n ciphertext: Uint8Array<ArrayBuffer>;\n}\n\n/**\n * @description Derives an AES-GCM key from a configured secret.\n * @param secret Encryption secret.\n * @returns Crypto key or undefined when unavailable.\n * @author Steveen Cues\n * @version 2.0.0\n */\nasync function deriveAesKey(secret: string): Promise<CryptoKey | undefined> {\n const cryptoApi = getCryptoApi();\n\n if (cryptoApi === undefined || secret.length === 0) {\n return undefined;\n }\n\n const digest = await cryptoApi.subtle.digest(\n SHA_256_ALGORITHM,\n encodeText(secret),\n );\n\n return cryptoApi.subtle.importKey(\n RAW_KEY_FORMAT,\n digest,\n { name: AES_GCM_ALGORITHM },\n false,\n KEY_USAGES,\n );\n}\n\n/**\n * @description Creates a cryptographically random initialization vector.\n * @returns Initialization vector.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createInitializationVector(): Uint8Array<ArrayBuffer> {\n const cryptoApi = getCryptoApi();\n\n if (cryptoApi === undefined) {\n throw new Error(\"Cryptographic API is unavailable.\");\n }\n\n return cryptoApi.getRandomValues(new Uint8Array(AES_GCM_IV_LENGTH));\n}\n\n/**\n * @description Validates and decodes an initialization vector.\n * @param value Base64-encoded initialization vector.\n * @returns Valid vector or undefined.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction decodeInitializationVector(\n value: string,\n): Uint8Array<ArrayBuffer> | undefined {\n try {\n const iv = decodeBase64(value);\n\n return iv.length === AES_GCM_IV_LENGTH ? iv : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Checks whether the encrypted value has the expected segments.\n * @param parts Encrypted value segments.\n * @returns Whether the segments contain an IV and ciphertext.\n * @author Steveen Cues\n * @version 2.2.0\n */\nfunction hasExpectedEncryptedParts(parts: string[]): parts is [string, string] {\n return parts.length === ENCRYPTED_VALUE_PART_COUNT;\n}\n\n/**\n * @description Validates the encrypted value segments.\n * @param parts Encrypted value segments.\n * @returns Validated segments or undefined.\n * @author Steveen Cues\n * @version 2.2.0\n */\nfunction validateEncryptedParts(parts: string[]): [string, string] | undefined {\n if (!hasExpectedEncryptedParts(parts)) {\n return undefined;\n }\n\n return [parts[0], parts[1]];\n}\n\n/**\n * @description Splits and validates an encrypted value.\n * @param value Encoded initialization vector and ciphertext.\n * @returns Validated payload or undefined.\n * @author Steveen Cues\n * @version 2.1.0\n */\nfunction parseEncryptedPayload(value: string): EncryptedPayload | undefined {\n const parts = validateEncryptedParts(value.split(STORAGE_VALUE_SEPARATOR));\n\n if (parts === undefined) {\n return undefined;\n }\n\n const [encodedIv, encodedCiphertext] = parts;\n const iv = decodeInitializationVector(encodedIv);\n\n if (iv === undefined) {\n return undefined;\n }\n\n try {\n return {\n iv,\n ciphertext: decodeBase64(encodedCiphertext),\n };\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Encrypts bytes using AES-GCM.\n * @param plaintext Plaintext bytes.\n * @param key Encryption key.\n * @param iv Initialization vector.\n * @returns Encrypted bytes.\n * @author Steveen Cues\n * @version 2.1.0\n */\nasync function encryptPayload(\n plaintext: Uint8Array<ArrayBuffer>,\n key: CryptoKey,\n iv: Uint8Array<ArrayBuffer>,\n): Promise<ArrayBuffer> {\n const cryptoApi = requireCryptoApi();\n\n return cryptoApi.subtle.encrypt(\n { name: AES_GCM_ALGORITHM, iv },\n key,\n plaintext,\n );\n}\n\n/**\n * @description Decrypts bytes using AES-GCM.\n * @param payload Validated encrypted payload.\n * @param key Decryption key.\n * @returns Decrypted bytes.\n * @author Steveen Cues\n * @version 2.1.0\n */\nasync function decryptPayload(\n payload: EncryptedPayload,\n key: CryptoKey,\n): Promise<ArrayBuffer> {\n const cryptoApi = requireCryptoApi();\n\n return cryptoApi.subtle.decrypt(\n {\n name: AES_GCM_ALGORITHM,\n iv: payload.iv,\n },\n key,\n payload.ciphertext,\n );\n}\n\n/**\n * @description Obtains the cryptographic API or throws when unavailable.\n * @returns Available cryptographic API.\n * @author Steveen Cues\n * @version 2.2.0\n */\nfunction requireCryptoApi(): Crypto {\n const cryptoApi = getCryptoApi();\n\n if (cryptoApi === undefined) {\n throw new Error(\"Cryptographic API is unavailable.\");\n }\n\n return cryptoApi;\n}\n\n/**\n * @description Encrypts text using AES-GCM.\n * @param value Text to encrypt.\n * @param secret Encryption secret.\n * @returns Encoded encrypted value or undefined when unavailable.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport async function encryptText(\n value: string,\n secret: string,\n): Promise<string | undefined> {\n try {\n const key = await deriveAesKey(secret);\n\n if (key === undefined) {\n return undefined;\n }\n\n const iv = createInitializationVector();\n const ciphertext = await encryptPayload(encodeText(value), key, iv);\n\n return [encodeBase64(iv), encodeBase64(new Uint8Array(ciphertext))].join(\n STORAGE_VALUE_SEPARATOR,\n );\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Decrypts an AES-GCM encrypted value.\n * @param value Encoded initialization vector and ciphertext.\n * @param secret Encryption secret.\n * @returns Original text or undefined if decryption fails.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport async function decryptText(\n value: string,\n secret: string,\n): Promise<string | undefined> {\n try {\n const payload = parseEncryptedPayload(value);\n\n if (payload === undefined) {\n return undefined;\n }\n\n const key = await deriveAesKey(secret);\n\n if (key === undefined) {\n return undefined;\n }\n\n const plaintext = await decryptPayload(payload, key);\n\n return decodeText(plaintext);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createContext","createContext","useContext","useContext","useCallback","useMemo","useState","useCallback","useState","useMemo","useCallback","useMemo","react","react_jsx_runtime","TranslateContext","ThemeContext","useLanguage","context","useTheme","saveEncryptedPreference","value","encryptionKey","storage","getLocalStorage","encryptedValue","encryptText","storageKey","loadEncryptedPreference","decryptText","LANGUAGE_PREFERENCE_STORAGE_KEY","saveLanguagePreference","language","loadLanguagePreference","savedLanguage","availableLanguages","THEME_PREFERENCE_STORAGE_KEY","saveThemePreference","themeName","loadThemePreference","savedTheme","themes","theme","createPreferenceState","configuration","matchesConfiguration","state","restoreSavedTheme","useRestoreThemePreference","isActive","defaultTheme","resolveInitialTheme","setPreferenceState","currentState","useSetThemePreference","assertThemeExists","nextTheme","useThemePreference","inputConfiguration","initialTheme","themeEncryptionKey","preferenceState","isCurrentConfiguration","createLanguagePreferenceState","matchesLanguageConfiguration","restoreSavedLanguage","useRestoreLanguagePreference","defaultLanguage","resolveInitialLanguage","usePersistLanguagePreference","isLoaded","useSetLanguagePreference","assertLanguageExists","nextLanguage","useLanguagePreference","selectedLanguage","setLanguage","resolveActiveLanguage","TranslateProvider","languages","translations","initialLanguage","fallbackLanguage","languageEncryptionKey","preference","contextValue","useTranslationContext","currentDictionary","fallbackDictionary","t","translateMessage","key","params","ThemeProvider","resolveActiveTheme","isPreferenceLoaded","setTheme","setThemeName","themeVariables","createThemeVariables","TranslationRegex","GLOBAL_REGEX_FLAG","AES_GCM_ALGORITHM","AES_GCM_IV_LENGTH","SHA_256_ALGORITHM","RAW_KEY_FORMAT","STORAGE_VALUE_SEPARATOR","KEY_USAGES","ENCRYPTED_VALUE_PART_COUNT","ThemeCssVariable","THEME_FONT_WEIGHT","isLanguageAvailable","findFirstLanguage","firstLanguage","findTranslationValue","current","dictionary","segment","findTranslation","resolveInterpolationValue","placeholder","interpolateTranslation","placeholderRegex","message","resolveTranslationMessage","currentTranslation","findTheme","getFirstTheme","firstTheme","selectedTheme","createSurfaceVariables","colors","createTextVariables","createBrandVariables","createStateVariables","createBorderVariables","createEffectVariables","createTypographyVariables","getCryptoApi","encodeText","decodeText","encodeBase64","binary","byte","bytes","decodeBase64","index","deriveAesKey","cryptoApi","secret","digest","createInitializationVector","decodeInitializationVector","iv","hasExpectedEncryptedParts","parts","validateEncryptedParts","parseEncryptedPayload","encodedIv","encodedCiphertext","encryptPayload","requireCryptoApi","plaintext","decryptPayload","payload","ciphertext"],"sources":["../src/libs/aplicacion/contexts/translate.context.ts","../src/libs/aplicacion/contexts/theme.context.ts","../src/libs/aplicacion/hooks/use-language.ts","../src/libs/aplicacion/hooks/use-theme.ts","../src/libs/infraestructura/storage/encrypted-preference.storage.ts","../src/libs/infraestructura/storage/language-preference.storage.ts","../src/libs/infraestructura/storage/theme-preference.storage.ts","../src/libs/aplicacion/hooks/use-theme-preference.hook.ts","../src/libs/aplicacion/providers/translate.provider.tsx","../src/libs/aplicacion/providers/theme-provider.tsx","../src/libs/domain/enums/translation-regex.enum.ts","../src/libs/domain/constants/translation.constants.ts","../src/libs/domain/constants/encrypted-preference.constanst.ts","../src/libs/domain/constants/theme-css-variable.const.ts","../src/libs/domain/constants/theme-font-weight.const.ts","../src/libs/aplicacion/utils/translation.utils.ts","../src/libs/aplicacion/utils/theme.utils.ts","../src/libs/aplicacion/utils/crypto-api.util.ts","../src/libs/aplicacion/utils/storage-api.util.ts","../src/libs/aplicacion/utils/text-encoding.util.ts","../src/libs/aplicacion/utils/base64.util.ts","../src/libs/aplicacion/services/encryption.service.ts"],"sourcesContent":["import type { ILanguageContextValue } from \"@domain\";\nimport { createContext } from \"react\";\n\n/**\n * @description Contexto interno de traducciones de la libreria.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport const TranslateContext = createContext<ILanguageContextValue | null>(\n null,\n);\n","import type { IThemeContextValue } from \"@domain\";\nimport { createContext } from \"react\";\n\n/**\n * @description Contexto interno del sistema de temas.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport const ThemeContext = createContext<IThemeContextValue | null>(null);\n","import { TranslateContext } from \"@aplicacion\";\nimport type { ILanguageContextValue } from \"@domain\";\nimport { useContext } from \"react\";\n\n/**\n * @description Obtiene el idioma actual y la funcion de traduccion.\n * Requiere que el componente este dentro de TranslateProvider.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function useLanguage(): ILanguageContextValue {\n const context = useContext(TranslateContext);\n\n if (context === null) {\n throw new Error(\"useLanguage must be used inside TranslateProvider.\");\n }\n\n return context;\n}\n","import { ThemeContext } from \"@aplicacion\";\nimport type { IThemeContextValue } from \"@domain\";\nimport { useContext } from \"react\";\n\n/**\n * @description Obtiene el tema activo, los temas disponibles y\n * la funcion para cambiar de tema.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function useTheme(): IThemeContextValue {\n const context = useContext(ThemeContext);\n\n if (context === null) {\n throw new Error(\"useTheme must be used inside ThemeProvider.\");\n }\n\n return context;\n}\n","import { decryptText, encryptText, getLocalStorage } from \"@aplicacion\";\n\n/**\n * @description Encrypts and saves a preference in localStorage.\n * @param storageKey Storage key.\n * @param value Value to store.\n * @param encryptionKey Encryption secret.\n * @returns Promise resolved after the save attempt.\n * @author Steveen Cues\n * @version 3.0.0\n */\nexport async function saveEncryptedPreference(\n storageKey: string,\n value: string,\n encryptionKey: string,\n): Promise<void> {\n if (value.length === 0 || encryptionKey.length === 0) {\n return;\n }\n\n try {\n const storage = getLocalStorage();\n\n if (storage === undefined) {\n return;\n }\n\n const encryptedValue = await encryptText(value, encryptionKey);\n\n if (encryptedValue === undefined) {\n return;\n }\n\n storage.setItem(storageKey, encryptedValue);\n } catch {\n // Preference persistence must not interrupt application usage.\n }\n}\n\n/**\n * @description Loads and decrypts a preference from localStorage.\n * @param storageKey Storage key.\n * @param encryptionKey Encryption secret.\n * @returns Decrypted preference or undefined when unavailable.\n * @author Steveen Cues\n * @version 3.0.0\n */\nexport async function loadEncryptedPreference(\n storageKey: string,\n encryptionKey: string,\n): Promise<string | undefined> {\n if (encryptionKey.length === 0) {\n return undefined;\n }\n\n try {\n const storage = getLocalStorage();\n\n if (storage === undefined) {\n return undefined;\n }\n\n const encryptedValue = storage.getItem(storageKey);\n\n if (encryptedValue === null) {\n return undefined;\n }\n\n return await decryptText(encryptedValue, encryptionKey);\n } catch {\n return undefined;\n }\n}\n","import {\n loadEncryptedPreference,\n saveEncryptedPreference,\n} from \"./encrypted-preference.storage\";\n\nconst LANGUAGE_PREFERENCE_STORAGE_KEY =\n \"starter-react-ui:language-preference:v1\";\n\n/**\n * @description Guarda el idioma activo de forma cifrada.\n * @param language Codigo del idioma activo.\n * @param encryptionKey Clave de cifrado proporcionada por el consumidor.\n * @returns Promesa completada al finalizar el intento de guardado.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function saveLanguagePreference(\n language: string,\n encryptionKey: string,\n): Promise<void> {\n return saveEncryptedPreference(\n LANGUAGE_PREFERENCE_STORAGE_KEY,\n language,\n encryptionKey,\n );\n}\n\n/**\n * @description Recupera el idioma guardado y verifica que siga disponible.\n * @param availableLanguages Idiomas admitidos por el proyecto.\n * @param encryptionKey Clave de cifrado proporcionada por el consumidor.\n * @returns Idioma recuperado o undefined si no existe o no es valido.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport async function loadLanguagePreference(\n availableLanguages: readonly string[],\n encryptionKey: string,\n): Promise<string | undefined> {\n const savedLanguage = await loadEncryptedPreference(\n LANGUAGE_PREFERENCE_STORAGE_KEY,\n encryptionKey,\n );\n\n if (\n savedLanguage === undefined ||\n !availableLanguages.includes(savedLanguage)\n ) {\n return undefined;\n }\n\n return savedLanguage;\n}\n","import type { AppTheme, ThemeName } from \"@domain\";\n\nimport {\n loadEncryptedPreference,\n saveEncryptedPreference,\n} from \"./encrypted-preference.storage\";\n\nconst THEME_PREFERENCE_STORAGE_KEY = \"starter-react-ui:theme-preference:v1\";\n\n/**\n * @description Guarda el nombre del tema activo de forma cifrada.\n * @param themeName Nombre del tema.\n * @param encryptionKey Clave de cifrado proporcionada por el consumidor.\n * @returns Promesa completada al finalizar el intento de guardado.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function saveThemePreference(\n themeName: ThemeName,\n encryptionKey: string,\n): Promise<void> {\n return saveEncryptedPreference(\n THEME_PREFERENCE_STORAGE_KEY,\n themeName,\n encryptionKey,\n );\n}\n\n/**\n * @description Recupera el tema guardado si existe entre los temas admitidos.\n * @param themes Temas definidos por el proyecto consumidor.\n * @param encryptionKey Clave de cifrado proporcionada por el consumidor.\n * @returns Nombre del tema recuperado o undefined.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport async function loadThemePreference(\n themes: readonly AppTheme[],\n encryptionKey: string,\n): Promise<ThemeName | undefined> {\n const savedTheme = await loadEncryptedPreference(\n THEME_PREFERENCE_STORAGE_KEY,\n encryptionKey,\n );\n\n if (savedTheme === undefined) {\n return undefined;\n }\n\n const availableTheme = themes.find(\n (theme: AppTheme): boolean => theme.name === savedTheme,\n );\n\n return availableTheme?.name;\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport type {\n SetThemePreferenceState,\n ThemeName,\n ThemePreferenceConfiguration,\n ThemePreferenceResult,\n ThemePreferenceState,\n} from \"@domain\";\n\nimport { loadThemePreference } from \"@infraestructura\";\n\nimport { assertThemeExists, resolveInitialTheme } from \"@aplicacion\";\n\n/**\n * @description Creates a preference state for the given configuration.\n * @author Steveen Cues\n * @version 3.0.0\n */\nfunction createPreferenceState(\n configuration: ThemePreferenceConfiguration,\n themeName: ThemeName,\n isLoaded: boolean,\n): ThemePreferenceState {\n return {\n ...configuration,\n themeName,\n isLoaded,\n };\n}\n\n/**\n * @description Checks whether a state belongs to the active configuration.\n * @author Steveen Cues\n * @version 3.0.0\n */\nfunction matchesConfiguration(\n state: ThemePreferenceState,\n configuration: ThemePreferenceConfiguration,\n): boolean {\n return (\n state.themes === configuration.themes &&\n state.initialTheme === configuration.initialTheme &&\n state.themeEncryptionKey === configuration.themeEncryptionKey\n );\n}\n\n/**\n * @description Loads the stored theme and safely handles restoration failures.\n * @author Steveen Cues\n * @version 3.0.0\n */\nasync function restoreSavedTheme(\n configuration: ThemePreferenceConfiguration,\n): Promise<ThemeName | undefined> {\n try {\n return await loadThemePreference(\n configuration.themes,\n configuration.themeEncryptionKey,\n );\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Restores the saved preference without overriding a user selection.\n * @author Steveen Cues\n * @version 3.0.0\n */\nfunction useRestoreThemePreference(\n configuration: ThemePreferenceConfiguration,\n setPreferenceState: SetThemePreferenceState,\n): void {\n useEffect((): (() => void) => {\n let isActive = true;\n\n const restorePreference = async (): Promise<void> => {\n const savedTheme = await restoreSavedTheme(configuration);\n\n if (!isActive) {\n return;\n }\n\n const defaultTheme = resolveInitialTheme(\n configuration.themes,\n configuration.initialTheme,\n );\n\n setPreferenceState(\n (currentState: ThemePreferenceState): ThemePreferenceState => {\n if (\n matchesConfiguration(currentState, configuration) &&\n currentState.isLoaded\n ) {\n return currentState;\n }\n\n return createPreferenceState(\n configuration,\n savedTheme ?? defaultTheme.name,\n true,\n );\n },\n );\n };\n\n void restorePreference();\n\n return (): void => {\n isActive = false;\n };\n }, [configuration, setPreferenceState]);\n}\n\n/**\n * @description Creates a validated theme selection handler.\n * @author Steveen Cues\n * @version 3.0.0\n */\nfunction useSetThemePreference(\n configuration: ThemePreferenceConfiguration,\n setPreferenceState: SetThemePreferenceState,\n): (nextTheme: ThemeName) => void {\n return useCallback(\n (nextTheme: ThemeName): void => {\n assertThemeExists(configuration.themes, nextTheme);\n\n setPreferenceState(createPreferenceState(configuration, nextTheme, true));\n },\n [configuration, setPreferenceState],\n );\n}\n\n/**\n * @description Manages the selected theme and its encrypted persistence lifecycle.\n * @author Steveen Cues\n * @version 3.0.0\n */\nexport function useThemePreference(\n inputConfiguration: ThemePreferenceConfiguration,\n): ThemePreferenceResult {\n const { themes, initialTheme, themeEncryptionKey } = inputConfiguration;\n\n const configuration = useMemo(\n (): ThemePreferenceConfiguration => ({\n themes,\n initialTheme,\n themeEncryptionKey,\n }),\n [themes, initialTheme, themeEncryptionKey],\n );\n\n const [preferenceState, setPreferenceState] = useState<ThemePreferenceState>(\n (): ThemePreferenceState =>\n createPreferenceState(\n configuration,\n resolveInitialTheme(themes, initialTheme).name,\n false,\n ),\n );\n\n useRestoreThemePreference(configuration, setPreferenceState);\n\n const isCurrentConfiguration = matchesConfiguration(\n preferenceState,\n configuration,\n );\n\n const themeName = isCurrentConfiguration\n ? preferenceState.themeName\n : resolveInitialTheme(themes, initialTheme).name;\n\n const isPreferenceLoaded = isCurrentConfiguration && preferenceState.isLoaded;\n\n const setThemeName = useSetThemePreference(configuration, setPreferenceState);\n\n return {\n themeName,\n isPreferenceLoaded,\n setThemeName,\n };\n}\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport type { JSX } from \"react\";\n\nimport type {\n ILanguageContextValue,\n ITranslateProviderProps,\n TranslationParams,\n TranslationDictionary,\n} from \"@domain\";\n\nimport { TranslateContext } from \"@aplicacion\";\n\nimport {\n loadLanguagePreference,\n saveLanguagePreference,\n} from \"@infraestructura\";\n\nimport {\n assertLanguageExists,\n resolveActiveLanguage,\n resolveInitialLanguage,\n translateMessage,\n} from \"@aplicacion\";\n\ninterface LanguagePreferenceConfiguration {\n readonly translations: ITranslateProviderProps[\"translations\"];\n readonly initialLanguage: ITranslateProviderProps[\"initialLanguage\"];\n readonly fallbackLanguage: string;\n readonly languageEncryptionKey: ITranslateProviderProps[\"languageEncryptionKey\"];\n readonly languages: readonly string[];\n}\n\ninterface LanguagePreferenceState extends LanguagePreferenceConfiguration {\n readonly selectedLanguage: string;\n readonly isLoaded: boolean;\n}\n\ninterface LanguagePreferenceResult {\n readonly language: string;\n readonly isLoaded: boolean;\n readonly setLanguage: (language: string) => void;\n}\n\ntype SetLanguagePreferenceState = React.Dispatch<\n React.SetStateAction<LanguagePreferenceState>\n>;\n\n/**\n * @description Creates the initial language preference state.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction createLanguagePreferenceState(\n configuration: LanguagePreferenceConfiguration,\n selectedLanguage: string,\n isLoaded: boolean,\n): LanguagePreferenceState {\n return {\n ...configuration,\n selectedLanguage,\n isLoaded,\n };\n}\n\n/**\n * @description Checks whether a state matches the active configuration.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction matchesLanguageConfiguration(\n state: LanguagePreferenceState,\n configuration: LanguagePreferenceConfiguration,\n): boolean {\n return (\n state.translations === configuration.translations &&\n state.initialLanguage === configuration.initialLanguage &&\n state.fallbackLanguage === configuration.fallbackLanguage &&\n state.languageEncryptionKey === configuration.languageEncryptionKey &&\n state.languages === configuration.languages\n );\n}\n\n/**\n * @description Restores the saved language and falls back when loading fails.\n * @author Steveen Cues\n * @version 4.0.0\n */\nasync function restoreSavedLanguage(\n configuration: LanguagePreferenceConfiguration,\n): Promise<string | undefined> {\n try {\n return await loadLanguagePreference(\n configuration.languages,\n configuration.languageEncryptionKey,\n );\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Restores the saved language for the active configuration.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction useRestoreLanguagePreference(\n configuration: LanguagePreferenceConfiguration,\n setPreferenceState: SetLanguagePreferenceState,\n): void {\n useEffect((): (() => void) => {\n let isActive = true;\n\n const restorePreference = async (): Promise<void> => {\n const savedLanguage = await restoreSavedLanguage(configuration);\n\n if (!isActive) {\n return;\n }\n\n const defaultLanguage = resolveInitialLanguage(\n configuration.translations,\n configuration.initialLanguage,\n configuration.fallbackLanguage,\n );\n\n setPreferenceState(\n (currentState: LanguagePreferenceState): LanguagePreferenceState => {\n if (\n matchesLanguageConfiguration(currentState, configuration) &&\n currentState.isLoaded\n ) {\n return currentState;\n }\n\n return createLanguagePreferenceState(\n configuration,\n savedLanguage ?? defaultLanguage,\n true,\n );\n },\n );\n };\n\n void restorePreference();\n\n return (): void => {\n isActive = false;\n };\n }, [configuration, setPreferenceState]);\n}\n\n/**\n * @description Persists the active language after preference restoration.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction usePersistLanguagePreference(\n configuration: LanguagePreferenceConfiguration,\n language: string,\n isLoaded: boolean,\n): void {\n useEffect((): void => {\n if (!isLoaded) {\n return;\n }\n\n void saveLanguagePreference(language, configuration.languageEncryptionKey);\n }, [configuration.languageEncryptionKey, language, isLoaded]);\n}\n\n/**\n * @description Creates a validated language selection handler.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction useSetLanguagePreference(\n configuration: LanguagePreferenceConfiguration,\n setPreferenceState: SetLanguagePreferenceState,\n): (language: string) => void {\n return useCallback(\n (nextLanguage: string): void => {\n assertLanguageExists(configuration.translations, nextLanguage);\n\n setPreferenceState(\n createLanguagePreferenceState(configuration, nextLanguage, true),\n );\n },\n [configuration, setPreferenceState],\n );\n}\n\n/**\n * @description Manages language selection, restoration, and persistence.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction useLanguagePreference(\n configuration: LanguagePreferenceConfiguration,\n): LanguagePreferenceResult {\n const [preferenceState, setPreferenceState] =\n useState<LanguagePreferenceState>((): LanguagePreferenceState =>\n createLanguagePreferenceState(\n configuration,\n configuration.initialLanguage,\n false,\n ),\n );\n\n useRestoreLanguagePreference(configuration, setPreferenceState);\n\n const isCurrentConfiguration = matchesLanguageConfiguration(\n preferenceState,\n configuration,\n );\n\n const selectedLanguage = isCurrentConfiguration\n ? preferenceState.selectedLanguage\n : configuration.initialLanguage;\n\n const isLoaded = isCurrentConfiguration && preferenceState.isLoaded;\n\n const setLanguage = useSetLanguagePreference(\n configuration,\n setPreferenceState,\n );\n\n return {\n language: resolveActiveLanguage(\n configuration.translations,\n selectedLanguage,\n configuration.initialLanguage,\n configuration.fallbackLanguage,\n ),\n isLoaded,\n setLanguage,\n };\n}\n\n/**\n * @description Provides the active language and translation functions.\n * @author Steveen Cues\n * @version 4.0.0\n */\nexport function TranslateProvider({\n translations,\n initialLanguage,\n fallbackLanguage = \"en\",\n languageEncryptionKey,\n children,\n}: ITranslateProviderProps): JSX.Element {\n const languages = useMemo(\n (): readonly string[] => Object.keys(translations),\n [translations],\n );\n\n const configuration = useMemo(\n (): LanguagePreferenceConfiguration => ({\n translations,\n initialLanguage,\n fallbackLanguage,\n languageEncryptionKey,\n languages,\n }),\n [\n translations,\n initialLanguage,\n fallbackLanguage,\n languageEncryptionKey,\n languages,\n ],\n );\n\n const preference = useLanguagePreference(configuration);\n\n usePersistLanguagePreference(\n configuration,\n preference.language,\n preference.isLoaded,\n );\n\n const contextValue = useTranslationContext(configuration, preference);\n\n return (\n <TranslateContext.Provider value={contextValue}>\n {children}\n </TranslateContext.Provider>\n );\n}\n\n/**\n * @description Creates the translation context value.\n * @author Steveen Cues\n * @version 4.0.0\n */\nfunction useTranslationContext(\n configuration: LanguagePreferenceConfiguration,\n preference: LanguagePreferenceResult,\n): ILanguageContextValue {\n const currentDictionary: TranslationDictionary =\n configuration.translations[preference.language];\n\n const fallbackDictionary: TranslationDictionary =\n configuration.translations[configuration.fallbackLanguage];\n\n const t = useCallback(\n (key: string, params?: TranslationParams): string =>\n translateMessage(currentDictionary, fallbackDictionary, key, params),\n [currentDictionary, fallbackDictionary],\n );\n\n return useMemo(\n (): ILanguageContextValue => ({\n language: preference.language,\n languages: configuration.languages,\n setLanguage: preference.setLanguage,\n t,\n }),\n [preference.language, preference.setLanguage, configuration.languages, t],\n );\n}\n","import { useCallback, useEffect, useMemo } from \"react\";\n\nimport type {\n IThemeContextValue,\n IThemeProviderProps,\n ThemeName,\n} from \"@domain\";\nimport type { JSX } from \"react\";\n\nimport { saveThemePreference } from \"@infraestructura\";\n\nimport {\n ThemeContext,\n createThemeVariables,\n resolveActiveTheme,\n useThemePreference,\n} from \"@aplicacion\";\n\n/**\n * @description Provides the active theme and allows theme changes.\n * Restores and persists the encrypted theme preference.\n * @author Steveen Cues\n * @version 4.0.0\n */\nexport function ThemeProvider({\n themes,\n initialTheme,\n themeEncryptionKey,\n children,\n}: IThemeProviderProps): JSX.Element {\n const { themeName, isPreferenceLoaded, setThemeName } = useThemePreference({\n themes,\n initialTheme,\n themeEncryptionKey,\n });\n\n const theme = resolveActiveTheme(themes, themeName, initialTheme);\n\n useEffect((): void => {\n if (!isPreferenceLoaded) {\n return;\n }\n\n void saveThemePreference(theme.name, themeEncryptionKey);\n }, [isPreferenceLoaded, theme.name, themeEncryptionKey]);\n\n const setTheme = useCallback(\n (nextTheme: ThemeName): void => setThemeName(nextTheme),\n [setThemeName],\n );\n\n const themeVariables = useMemo(() => createThemeVariables(theme), [theme]);\n\n const contextValue = useMemo<IThemeContextValue>(\n () => ({\n theme,\n themeName: theme.name,\n themes,\n setTheme,\n }),\n [theme, themes, setTheme],\n );\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <div\n data-rui-theme={theme.name}\n style={{\n ...themeVariables,\n display: \"contents\",\n }}\n >\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n","/**\n * @description Expresiones regulares reutilizables para traducciones.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport const TranslationRegex = Object.freeze({\n INTERPOLATION_PLACEHOLDER: String.raw`\\{\\{([a-zA-Z0-9_]+)\\}\\}`,\n});\n","export const GLOBAL_REGEX_FLAG = \"g\";\n","export const AES_GCM_ALGORITHM = \"AES-GCM\";\nexport const AES_GCM_IV_LENGTH = 12;\nexport const SHA_256_ALGORITHM = \"SHA-256\";\nexport const RAW_KEY_FORMAT = \"raw\";\nexport const STORAGE_VALUE_SEPARATOR = \".\";\nexport const KEY_USAGES: KeyUsage[] = [\"encrypt\", \"decrypt\"];\nexport const ENCRYPTED_VALUE_PART_COUNT = 2;\n","/**\n * @description Define los nombres de las variables CSS de la libreria.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport const ThemeCssVariable = {\n SURFACE_BACKGROUND: \"--rui-surface-background\",\n SURFACE_SURFACE: \"--rui-surface-surface\",\n SURFACE_SURFACE_ELEVATED: \"--rui-surface-surface-elevated\",\n SURFACE_SURFACE_HOVER: \"--rui-surface-surface-hover\",\n SURFACE_SURFACE_ACTIVE: \"--rui-surface-surface-active\",\n SURFACE_SURFACE_DISABLED: \"--rui-surface-surface-disabled\",\n\n TEXT_PRIMARY: \"--rui-text-primary\",\n TEXT_SECONDARY: \"--rui-text-secondary\",\n TEXT_MUTED: \"--rui-text-muted\",\n TEXT_DISABLED: \"--rui-text-disabled\",\n TEXT_INVERSE: \"--rui-text-inverse\",\n TEXT_LINK: \"--rui-text-link\",\n TEXT_LINK_HOVER: \"--rui-text-link-hover\",\n\n BRAND_PRIMARY: \"--rui-brand-primary\",\n BRAND_PRIMARY_HOVER: \"--rui-brand-primary-hover\",\n BRAND_PRIMARY_ACTIVE: \"--rui-brand-primary-active\",\n BRAND_PRIMARY_CONTRAST: \"--rui-brand-primary-contrast\",\n BRAND_SECONDARY: \"--rui-brand-secondary\",\n BRAND_SECONDARY_HOVER: \"--rui-brand-secondary-hover\",\n BRAND_SECONDARY_ACTIVE: \"--rui-brand-secondary-active\",\n BRAND_SECONDARY_CONTRAST: \"--rui-brand-secondary-contrast\",\n BRAND_ACCENT: \"--rui-brand-accent\",\n BRAND_ACCENT_HOVER: \"--rui-brand-accent-hover\",\n BRAND_ACCENT_CONTRAST: \"--rui-brand-accent-contrast\",\n\n STATE_SUCCESS: \"--rui-state-success\",\n STATE_SUCCESS_BACKGROUND: \"--rui-state-success-background\",\n STATE_WARNING: \"--rui-state-warning\",\n STATE_WARNING_BACKGROUND: \"--rui-state-warning-background\",\n STATE_ERROR: \"--rui-state-error\",\n STATE_ERROR_BACKGROUND: \"--rui-state-error-background\",\n STATE_INFO: \"--rui-state-info\",\n STATE_INFO_BACKGROUND: \"--rui-state-info-background\",\n\n BORDER_DEFAULT: \"--rui-border-default\",\n BORDER_SUBTLE: \"--rui-border-subtle\",\n BORDER_STRONG: \"--rui-border-strong\",\n BORDER_FOCUS: \"--rui-border-focus\",\n BORDER_HOVER: \"--rui-border-hover\",\n BORDER_ACTIVE: \"--rui-border-active\",\n BORDER_DISABLED: \"--rui-border-disabled\",\n\n SHADOW_COLOR: \"--rui-shadow-color\",\n SHADOW_SUBTLE: \"--rui-shadow-subtle\",\n SHADOW_SMALL: \"--rui-shadow-small\",\n SHADOW_MEDIUM: \"--rui-shadow-medium\",\n SHADOW_LARGE: \"--rui-shadow-large\",\n SHADOW_GLOW: \"--rui-shadow-glow\",\n\n EFFECTS_OVERLAY: \"--rui-effects-overlay\",\n EFFECTS_BACKDROP: \"--rui-effects-backdrop\",\n EFFECTS_BLUR: \"--rui-effects-blur\",\n EFFECTS_BLUR_STRONG: \"--rui-effects-blur-strong\",\n EFFECTS_GLASS_BACKGROUND: \"--rui-effects-glass-background\",\n EFFECTS_GLASS_BORDER: \"--rui-effects-glass-border\",\n\n TYPOGRAPHY_HEADING_PRIMARY: \"--rui-typography-heading-primary\",\n TYPOGRAPHY_HEADING_SECONDARY: \"--rui-typography-heading-secondary\",\n TYPOGRAPHY_HEADING_MUTED: \"--rui-typography-heading-muted\",\n TYPOGRAPHY_BODY_PRIMARY: \"--rui-typography-body-primary\",\n TYPOGRAPHY_BODY_SECONDARY: \"--rui-typography-body-secondary\",\n TYPOGRAPHY_BODY_MUTED: \"--rui-typography-body-muted\",\n TYPOGRAPHY_LABEL_PRIMARY: \"--rui-typography-label-primary\",\n TYPOGRAPHY_LABEL_SECONDARY: \"--rui-typography-label-secondary\",\n TYPOGRAPHY_LABEL_MUTED: \"--rui-typography-label-muted\",\n TYPOGRAPHY_BUTTON_PRIMARY: \"--rui-typography-button-primary\",\n TYPOGRAPHY_BUTTON_SECONDARY: \"--rui-typography-button-secondary\",\n} as const;\n","/**\n * @description Defines the standard typography weights.\n * @author Steveen Cues\n * @version 2.0.0\n */\nconst THEME_FONT_WEIGHT_THIN = 100;\nconst THEME_FONT_WEIGHT_EXTRA_LIGHT = 200;\nconst THEME_FONT_WEIGHT_LIGHT = 300;\nconst THEME_FONT_WEIGHT_REGULAR = 400;\nconst THEME_FONT_WEIGHT_MEDIUM = 500;\nconst THEME_FONT_WEIGHT_SEMI_BOLD = 600;\nconst THEME_FONT_WEIGHT_BOLD = 700;\nconst THEME_FONT_WEIGHT_EXTRA_BOLD = 800;\nconst THEME_FONT_WEIGHT_BLACK = 900;\n\n/**\n * @description Defines the available typography weights.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport const THEME_FONT_WEIGHT = {\n THIN: THEME_FONT_WEIGHT_THIN,\n EXTRA_LIGHT: THEME_FONT_WEIGHT_EXTRA_LIGHT,\n LIGHT: THEME_FONT_WEIGHT_LIGHT,\n REGULAR: THEME_FONT_WEIGHT_REGULAR,\n MEDIUM: THEME_FONT_WEIGHT_MEDIUM,\n SEMI_BOLD: THEME_FONT_WEIGHT_SEMI_BOLD,\n BOLD: THEME_FONT_WEIGHT_BOLD,\n EXTRA_BOLD: THEME_FONT_WEIGHT_EXTRA_BOLD,\n BLACK: THEME_FONT_WEIGHT_BLACK,\n} as const;\n","import {\n type TranslationCatalog,\n type TranslationDictionary,\n type TranslationParams,\n type TranslationValue,\n GLOBAL_REGEX_FLAG,\n TranslationRegex,\n} from \"@domain\";\n\n/**\n * @description Comprueba si un idioma existe en el catalogo.\n * @param translations Catalogo disponible.\n * @param language Codigo del idioma.\n * @returns Indica si el idioma esta registrado.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction isLanguageAvailable(\n translations: TranslationCatalog,\n language: string,\n): boolean {\n return Object.hasOwn(translations, language);\n}\n\n/**\n * @description Obtiene el primer idioma registrado en el catalogo.\n * @param translations Catalogo de traducciones.\n * @returns Codigo del primer idioma o undefined si esta vacio.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction findFirstLanguage(\n translations: TranslationCatalog,\n): string | undefined {\n const [firstLanguage] = Object.keys(translations);\n\n return firstLanguage;\n}\n\n/**\n * @description Obtiene el idioma inicial disponible, priorizando el\n * idioma solicitado, el idioma de respaldo y el primer idioma registrado.\n * @param translations Catalogo de traducciones.\n * @param initialLanguage Idioma solicitado inicialmente.\n * @param fallbackLanguage Idioma de respaldo.\n * @returns Codigo del idioma inicial disponible.\n * @throws Error cuando el catalogo esta vacio.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function resolveInitialLanguage(\n translations: TranslationCatalog,\n initialLanguage: string,\n fallbackLanguage: string,\n): string {\n if (isLanguageAvailable(translations, initialLanguage)) {\n return initialLanguage;\n }\n\n if (isLanguageAvailable(translations, fallbackLanguage)) {\n return fallbackLanguage;\n }\n\n const firstLanguage = findFirstLanguage(translations);\n\n if (firstLanguage === undefined) {\n throw new Error(\n \"TranslateProvider requires at least one translation catalog.\",\n );\n }\n\n return firstLanguage;\n}\n\n/**\n * @description Resuelve el idioma seleccionado y utiliza el idioma\n * inicial, el respaldo o el primer idioma disponible si es necesario.\n * @param translations Catalogo de traducciones.\n * @param selectedLanguage Idioma seleccionado actualmente.\n * @param initialLanguage Idioma inicial configurado.\n * @param fallbackLanguage Idioma de respaldo.\n * @returns Codigo del idioma activo.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function resolveActiveLanguage(\n translations: TranslationCatalog,\n selectedLanguage: string,\n initialLanguage: string,\n fallbackLanguage: string,\n): string {\n if (isLanguageAvailable(translations, selectedLanguage)) {\n return selectedLanguage;\n }\n\n return resolveInitialLanguage(\n translations,\n initialLanguage,\n fallbackLanguage,\n );\n}\n\n/**\n * @description Valida que un idioma este registrado en el catalogo.\n * @param translations Catalogo de traducciones.\n * @param language Codigo del idioma que se desea validar.\n * @returns No devuelve ningun valor.\n * @throws Error cuando el idioma no esta disponible.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function assertLanguageExists(\n translations: TranslationCatalog,\n language: string,\n): void {\n if (isLanguageAvailable(translations, language)) {\n return;\n }\n\n throw new Error(\n `Language \"${language}\" is not available in the translation catalog.`,\n );\n}\n\n/**\n * @description Obtiene el valor anidado de una clave usando notacion\n * de puntos, por ejemplo \"navigation.contact\".\n * @param dictionary Diccionario donde se realiza la busqueda.\n * @param key Clave de traduccion.\n * @returns Valor encontrado o undefined si no existe.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction findTranslationValue(\n dictionary: TranslationDictionary,\n key: string,\n): TranslationValue | undefined {\n let current: TranslationValue = dictionary;\n\n for (const segment of key.split(\".\")) {\n if (typeof current === \"string\") {\n return undefined;\n }\n\n if (!Object.hasOwn(current, segment)) {\n return undefined;\n }\n\n current = current[segment];\n }\n\n return current;\n}\n\n/**\n * @description Busca una traduccion dentro de un diccionario.\n * @param dictionary Diccionario del idioma.\n * @param key Clave con notacion de puntos.\n * @returns Traduccion encontrada o undefined.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function findTranslation(\n dictionary: TranslationDictionary | undefined,\n key: string,\n): string | undefined {\n if (dictionary === undefined || key === \"\") {\n return undefined;\n }\n\n const value = findTranslationValue(dictionary, key);\n\n return typeof value === \"string\" ? value : undefined;\n}\n\n/**\n * @description Resuelve el texto correspondiente a un marcador de\n * interpolacion sin eliminarlo cuando falta su parametro.\n * @param placeholder Marcador original, por ejemplo {{name}}.\n * @param key Nombre del parametro.\n * @param params Parametros disponibles.\n * @returns Valor interpolado o marcador original.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction resolveInterpolationValue(\n placeholder: string,\n key: string,\n params: TranslationParams | undefined,\n): string {\n const value = params?.[key];\n\n return value === undefined ? placeholder : String(value);\n}\n\n/**\n * @description Sustituye los marcadores {{name}} usando los parametros.\n * @param message Mensaje que se desea interpolar.\n * @param params Valores disponibles para la interpolacion.\n * @returns Mensaje con los parametros sustituidos.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function interpolateTranslation(\n message: string,\n params?: TranslationParams,\n): string {\n const placeholderRegex = new RegExp(\n TranslationRegex.INTERPOLATION_PLACEHOLDER,\n GLOBAL_REGEX_FLAG,\n );\n\n return message.replace(\n placeholderRegex,\n (placeholder: string, key: string): string =>\n resolveInterpolationValue(placeholder, key, params),\n );\n}\n\n/**\n * @description Busca una traduccion en el idioma activo y utiliza el\n * idioma de respaldo cuando la clave no esta disponible.\n * @param currentDictionary Diccionario del idioma activo.\n * @param fallbackDictionary Diccionario del idioma de respaldo.\n * @param key Clave de traduccion.\n * @returns Traduccion encontrada o clave original.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction resolveTranslationMessage(\n currentDictionary: TranslationDictionary | undefined,\n fallbackDictionary: TranslationDictionary | undefined,\n key: string,\n): string {\n const currentTranslation = findTranslation(currentDictionary, key);\n\n if (currentTranslation !== undefined) {\n return currentTranslation;\n }\n\n const fallbackTranslation = findTranslation(fallbackDictionary, key);\n\n return fallbackTranslation ?? key;\n}\n\n/**\n * @description Traduce un mensaje aplicando respaldo e interpolacion.\n * @param currentDictionary Diccionario del idioma activo.\n * @param fallbackDictionary Diccionario del idioma de respaldo.\n * @param key Clave de traduccion.\n * @param params Parametros de interpolacion.\n * @returns Mensaje final traducido e interpolado.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function translateMessage(\n currentDictionary: TranslationDictionary | undefined,\n fallbackDictionary: TranslationDictionary | undefined,\n key: string,\n params?: TranslationParams,\n): string {\n const message = resolveTranslationMessage(\n currentDictionary,\n fallbackDictionary,\n key,\n );\n\n return interpolateTranslation(message, params);\n}\n","import {\n ThemeCssVariable,\n type AppTheme,\n type BorderVariables,\n type BrandVariables,\n type EffectVariables,\n type StateVariables,\n type SurfaceVariables,\n type TextVariables,\n type ThemeCssVariables,\n type ThemeName,\n type TypographyVariables,\n} from \"@domain\";\n\n/**\n * @description Busca un tema por su nombre.\n * @author Steveen Cues\n * @version 1.0.0\n */\nfunction findTheme(\n themes: readonly AppTheme[],\n themeName: ThemeName,\n): AppTheme | undefined {\n return themes.find((theme) => theme.name === themeName);\n}\n\n/**\n * @description Obtiene el primer tema registrado.\n * @throws {Error} Cuando no hay temas registrados.\n * @author Steveen Cues\n * @version 1.0.0\n */\n/**\n * @description Obtiene el primer tema registrado.\n * @author Steveen Cues\n * @version 2.1.0\n */\n/**\n * @description Obtiene el primer tema registrado.\n * @author Steveen Cues\n * @version 2.1.0\n */\n/**\n * @description Obtiene el primer tema registrado.\n * @author Steveen Cues\n * @version 2.2.0\n */\nfunction getFirstTheme(themes: readonly AppTheme[]): AppTheme {\n const firstTheme = themes.at(0);\n\n if (firstTheme === undefined) {\n throw new Error(\"ThemeProvider requires at least one registered theme.\");\n }\n\n return firstTheme;\n}\n\n/**\n * @description Resuelve el tema inicial solicitado o utiliza el primero registrado.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function resolveInitialTheme(\n themes: readonly AppTheme[],\n initialTheme: ThemeName,\n): AppTheme {\n return findTheme(themes, initialTheme) ?? getFirstTheme(themes);\n}\n\n/**\n * @description Resuelve el tema activo o recupera uno disponible.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function resolveActiveTheme(\n themes: readonly AppTheme[],\n selectedTheme: ThemeName,\n initialTheme: ThemeName,\n): AppTheme {\n return (\n findTheme(themes, selectedTheme) ??\n resolveInitialTheme(themes, initialTheme)\n );\n}\n\n/**\n * @description Valida que el tema solicitado este registrado.\n * @throws {Error} Cuando el tema no esta registrado.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function assertThemeExists(\n themes: readonly AppTheme[],\n themeName: ThemeName,\n): void {\n if (findTheme(themes, themeName) === undefined) {\n throw new Error(`Theme \"${themeName}\" is not registered in ThemeProvider.`);\n }\n}\n\n/**\n * @description Crea variables CSS para los colores de superficie.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createSurfaceVariables(colors: AppTheme[\"themes\"]): SurfaceVariables {\n return {\n [ThemeCssVariable.SURFACE_BACKGROUND]: colors.surface.background,\n [ThemeCssVariable.SURFACE_SURFACE]: colors.surface.surface,\n [ThemeCssVariable.SURFACE_SURFACE_ELEVATED]: colors.surface.surfaceElevated,\n [ThemeCssVariable.SURFACE_SURFACE_HOVER]: colors.surface.surfaceHover,\n [ThemeCssVariable.SURFACE_SURFACE_ACTIVE]: colors.surface.surfaceActive,\n [ThemeCssVariable.SURFACE_SURFACE_DISABLED]: colors.surface.surfaceDisabled,\n };\n}\n\n/**\n * @description Crea variables CSS para los colores de texto.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createTextVariables(colors: AppTheme[\"themes\"]): TextVariables {\n return {\n [ThemeCssVariable.TEXT_PRIMARY]: colors.text.primary,\n [ThemeCssVariable.TEXT_SECONDARY]: colors.text.secondary,\n [ThemeCssVariable.TEXT_MUTED]: colors.text.muted,\n [ThemeCssVariable.TEXT_DISABLED]: colors.text.disabled,\n [ThemeCssVariable.TEXT_INVERSE]: colors.text.inverse,\n [ThemeCssVariable.TEXT_LINK]: colors.text.link,\n [ThemeCssVariable.TEXT_LINK_HOVER]: colors.text.linkHover,\n };\n}\n\n/**\n * @description Crea variables CSS para los colores de marca.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createBrandVariables(colors: AppTheme[\"themes\"]): BrandVariables {\n return {\n [ThemeCssVariable.BRAND_PRIMARY]: colors.brand.primary,\n [ThemeCssVariable.BRAND_PRIMARY_HOVER]: colors.brand.primaryHover,\n [ThemeCssVariable.BRAND_PRIMARY_ACTIVE]: colors.brand.primaryActive,\n [ThemeCssVariable.BRAND_PRIMARY_CONTRAST]: colors.brand.primaryContrast,\n [ThemeCssVariable.BRAND_SECONDARY]: colors.brand.secondary,\n [ThemeCssVariable.BRAND_SECONDARY_HOVER]: colors.brand.secondaryHover,\n [ThemeCssVariable.BRAND_SECONDARY_ACTIVE]: colors.brand.secondaryActive,\n [ThemeCssVariable.BRAND_SECONDARY_CONTRAST]: colors.brand.secondaryContrast,\n [ThemeCssVariable.BRAND_ACCENT]: colors.brand.accent,\n [ThemeCssVariable.BRAND_ACCENT_HOVER]: colors.brand.accentHover,\n [ThemeCssVariable.BRAND_ACCENT_CONTRAST]: colors.brand.accentContrast,\n };\n}\n\n/**\n * @description Crea variables CSS para los estados.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createStateVariables(colors: AppTheme[\"themes\"]): StateVariables {\n return {\n [ThemeCssVariable.STATE_SUCCESS]: colors.state.success,\n [ThemeCssVariable.STATE_SUCCESS_BACKGROUND]: colors.state.successBackground,\n [ThemeCssVariable.STATE_WARNING]: colors.state.warning,\n [ThemeCssVariable.STATE_WARNING_BACKGROUND]: colors.state.warningBackground,\n [ThemeCssVariable.STATE_ERROR]: colors.state.error,\n [ThemeCssVariable.STATE_ERROR_BACKGROUND]: colors.state.errorBackground,\n [ThemeCssVariable.STATE_INFO]: colors.state.info,\n [ThemeCssVariable.STATE_INFO_BACKGROUND]: colors.state.infoBackground,\n };\n}\n\n/**\n * @description Crea variables CSS para los bordes.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createBorderVariables(colors: AppTheme[\"themes\"]): BorderVariables {\n return {\n [ThemeCssVariable.BORDER_DEFAULT]: colors.border.default,\n [ThemeCssVariable.BORDER_SUBTLE]: colors.border.subtle,\n [ThemeCssVariable.BORDER_STRONG]: colors.border.strong,\n [ThemeCssVariable.BORDER_FOCUS]: colors.border.focus,\n [ThemeCssVariable.BORDER_HOVER]: colors.border.hover,\n [ThemeCssVariable.BORDER_ACTIVE]: colors.border.active,\n [ThemeCssVariable.BORDER_DISABLED]: colors.border.disabled,\n };\n}\n\n/**\n * @description Crea variables CSS para los efectos visuales.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createEffectVariables(colors: AppTheme[\"themes\"]): EffectVariables {\n return {\n [ThemeCssVariable.EFFECTS_OVERLAY]: colors.effects.overlay,\n [ThemeCssVariable.EFFECTS_BACKDROP]: colors.effects.backdrop,\n [ThemeCssVariable.EFFECTS_BLUR]: colors.effects.blur,\n [ThemeCssVariable.EFFECTS_BLUR_STRONG]: colors.effects.blurStrong,\n [ThemeCssVariable.EFFECTS_GLASS_BACKGROUND]: colors.effects.glassBackground,\n [ThemeCssVariable.EFFECTS_GLASS_BORDER]: colors.effects.glassBorder,\n };\n}\n\n/**\n * @description Crea variables CSS para la tipografia.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createTypographyVariables(\n colors: AppTheme[\"themes\"],\n): TypographyVariables {\n return {\n [ThemeCssVariable.TYPOGRAPHY_HEADING_PRIMARY]:\n colors.typography.heading.h1.color,\n [ThemeCssVariable.TYPOGRAPHY_HEADING_SECONDARY]:\n colors.typography.heading.h2.color,\n [ThemeCssVariable.TYPOGRAPHY_HEADING_MUTED]:\n colors.typography.body.muted.color,\n [ThemeCssVariable.TYPOGRAPHY_BODY_PRIMARY]:\n colors.typography.body.primary.color,\n [ThemeCssVariable.TYPOGRAPHY_BODY_SECONDARY]:\n colors.typography.body.secondary.color,\n [ThemeCssVariable.TYPOGRAPHY_BODY_MUTED]:\n colors.typography.body.muted.color,\n [ThemeCssVariable.TYPOGRAPHY_LABEL_PRIMARY]:\n colors.typography.label.primary.color,\n [ThemeCssVariable.TYPOGRAPHY_LABEL_SECONDARY]:\n colors.typography.label.secondary.color,\n [ThemeCssVariable.TYPOGRAPHY_LABEL_MUTED]:\n colors.typography.label.muted.color,\n [ThemeCssVariable.TYPOGRAPHY_BUTTON_PRIMARY]:\n colors.typography.button.primary.color,\n [ThemeCssVariable.TYPOGRAPHY_BUTTON_SECONDARY]:\n colors.typography.button.secondary.color,\n };\n}\n\n/**\n * @description Genera todas las variables CSS a partir de los tokens del tema.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport function createThemeVariables(theme: AppTheme): ThemeCssVariables {\n const { themes: colors } = theme;\n\n return {\n ...createSurfaceVariables(colors),\n ...createTextVariables(colors),\n ...createBrandVariables(colors),\n ...createStateVariables(colors),\n ...createBorderVariables(colors),\n ...createEffectVariables(colors),\n ...createTypographyVariables(colors),\n };\n}\n","/**\n * @description Obtains the cryptographic API when available.\n * @returns Cryptographic API or undefined if unavailable.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function getCryptoApi(): Crypto | undefined {\n try {\n return globalThis.crypto;\n } catch {\n return undefined;\n }\n}\n","/**\n * @description Obtains localStorage when available.\n * @returns Browser storage or undefined if unavailable.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function getLocalStorage(): Storage | undefined {\n try {\n return globalThis.localStorage;\n } catch {\n return undefined;\n }\n}\n","/**\n * @description Encodes text into UTF-8 bytes.\n * @param value Text to encode.\n * @returns Encoded bytes.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function encodeText(value: string): Uint8Array<ArrayBuffer> {\n return new TextEncoder().encode(value);\n}\n\n/**\n * @description Decodes UTF-8 bytes into text.\n * @param value Encoded bytes.\n * @returns Decoded text.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function decodeText(value: ArrayBuffer): string {\n return new TextDecoder().decode(value);\n}\n","/**\n * @description Encodes bytes into Base64.\n * @param bytes Bytes to encode.\n * @returns Base64 string.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function encodeBase64(bytes: Uint8Array): string {\n let binary = \"\";\n\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n\n return btoa(binary);\n}\n\n/**\n * @description Decodes Base64 into bytes.\n * @param value Base64 string.\n * @returns Decoded bytes.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport function decodeBase64(value: string): Uint8Array<ArrayBuffer> {\n const binary = atob(value);\n const bytes = new Uint8Array(binary.length);\n\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n\n return bytes;\n}\n","import {\n AES_GCM_ALGORITHM,\n AES_GCM_IV_LENGTH,\n ENCRYPTED_VALUE_PART_COUNT,\n KEY_USAGES,\n RAW_KEY_FORMAT,\n SHA_256_ALGORITHM,\n STORAGE_VALUE_SEPARATOR,\n} from \"@domain\";\n\nimport {\n decodeBase64,\n encodeBase64,\n getCryptoApi,\n decodeText,\n encodeText,\n} from \"@aplicacion\";\n\n/**\n * @description Represents validated encrypted data.\n * @author Steveen Cues\n * @version 2.0.0\n */\ninterface EncryptedPayload {\n iv: Uint8Array<ArrayBuffer>;\n ciphertext: Uint8Array<ArrayBuffer>;\n}\n\n/**\n * @description Derives an AES-GCM key from a configured secret.\n * @param secret Encryption secret.\n * @returns Crypto key or undefined when unavailable.\n * @author Steveen Cues\n * @version 2.0.0\n */\nasync function deriveAesKey(secret: string): Promise<CryptoKey | undefined> {\n const cryptoApi = getCryptoApi();\n\n if (cryptoApi === undefined || secret.length === 0) {\n return undefined;\n }\n\n const digest = await cryptoApi.subtle.digest(\n SHA_256_ALGORITHM,\n encodeText(secret),\n );\n\n return cryptoApi.subtle.importKey(\n RAW_KEY_FORMAT,\n digest,\n { name: AES_GCM_ALGORITHM },\n false,\n KEY_USAGES,\n );\n}\n\n/**\n * @description Creates a cryptographically random initialization vector.\n * @returns Initialization vector.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createInitializationVector(): Uint8Array<ArrayBuffer> {\n const cryptoApi = getCryptoApi();\n\n if (cryptoApi === undefined) {\n throw new Error(\"Cryptographic API is unavailable.\");\n }\n\n return cryptoApi.getRandomValues(new Uint8Array(AES_GCM_IV_LENGTH));\n}\n\n/**\n * @description Validates and decodes an initialization vector.\n * @param value Base64-encoded initialization vector.\n * @returns Valid vector or undefined.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction decodeInitializationVector(\n value: string,\n): Uint8Array<ArrayBuffer> | undefined {\n try {\n const iv = decodeBase64(value);\n\n return iv.length === AES_GCM_IV_LENGTH ? iv : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Checks whether the encrypted value has the expected segments.\n * @param parts Encrypted value segments.\n * @returns Whether the segments contain an IV and ciphertext.\n * @author Steveen Cues\n * @version 2.2.0\n */\nfunction hasExpectedEncryptedParts(parts: string[]): parts is [string, string] {\n return parts.length === ENCRYPTED_VALUE_PART_COUNT;\n}\n\n/**\n * @description Validates the encrypted value segments.\n * @param parts Encrypted value segments.\n * @returns Validated segments or undefined.\n * @author Steveen Cues\n * @version 2.2.0\n */\nfunction validateEncryptedParts(parts: string[]): [string, string] | undefined {\n if (!hasExpectedEncryptedParts(parts)) {\n return undefined;\n }\n\n return [parts[0], parts[1]];\n}\n\n/**\n * @description Splits and validates an encrypted value.\n * @param value Encoded initialization vector and ciphertext.\n * @returns Validated payload or undefined.\n * @author Steveen Cues\n * @version 2.1.0\n */\nfunction parseEncryptedPayload(value: string): EncryptedPayload | undefined {\n const parts = validateEncryptedParts(value.split(STORAGE_VALUE_SEPARATOR));\n\n if (parts === undefined) {\n return undefined;\n }\n\n const [encodedIv, encodedCiphertext] = parts;\n const iv = decodeInitializationVector(encodedIv);\n\n if (iv === undefined) {\n return undefined;\n }\n\n try {\n return {\n iv,\n ciphertext: decodeBase64(encodedCiphertext),\n };\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Encrypts bytes using AES-GCM.\n * @param plaintext Plaintext bytes.\n * @param key Encryption key.\n * @param iv Initialization vector.\n * @returns Encrypted bytes.\n * @author Steveen Cues\n * @version 2.1.0\n */\nasync function encryptPayload(\n plaintext: Uint8Array<ArrayBuffer>,\n key: CryptoKey,\n iv: Uint8Array<ArrayBuffer>,\n): Promise<ArrayBuffer> {\n const cryptoApi = requireCryptoApi();\n\n return cryptoApi.subtle.encrypt(\n { name: AES_GCM_ALGORITHM, iv },\n key,\n plaintext,\n );\n}\n\n/**\n * @description Decrypts bytes using AES-GCM.\n * @param payload Validated encrypted payload.\n * @param key Decryption key.\n * @returns Decrypted bytes.\n * @author Steveen Cues\n * @version 2.1.0\n */\nasync function decryptPayload(\n payload: EncryptedPayload,\n key: CryptoKey,\n): Promise<ArrayBuffer> {\n const cryptoApi = requireCryptoApi();\n\n return cryptoApi.subtle.decrypt(\n {\n name: AES_GCM_ALGORITHM,\n iv: payload.iv,\n },\n key,\n payload.ciphertext,\n );\n}\n\n/**\n * @description Obtains the cryptographic API or throws when unavailable.\n * @returns Available cryptographic API.\n * @author Steveen Cues\n * @version 2.2.0\n */\nfunction requireCryptoApi(): Crypto {\n const cryptoApi = getCryptoApi();\n\n if (cryptoApi === undefined) {\n throw new Error(\"Cryptographic API is unavailable.\");\n }\n\n return cryptoApi;\n}\n\n/**\n * @description Encrypts text using AES-GCM.\n * @param value Text to encrypt.\n * @param secret Encryption secret.\n * @returns Encoded encrypted value or undefined when unavailable.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport async function encryptText(\n value: string,\n secret: string,\n): Promise<string | undefined> {\n try {\n const key = await deriveAesKey(secret);\n\n if (key === undefined) {\n return undefined;\n }\n\n const iv = createInitializationVector();\n const ciphertext = await encryptPayload(encodeText(value), key, iv);\n\n return [encodeBase64(iv), encodeBase64(new Uint8Array(ciphertext))].join(\n STORAGE_VALUE_SEPARATOR,\n );\n } catch {\n return undefined;\n }\n}\n\n/**\n * @description Decrypts an AES-GCM encrypted value.\n * @param value Encoded initialization vector and ciphertext.\n * @param secret Encryption secret.\n * @returns Original text or undefined if decryption fails.\n * @author Steveen Cues\n * @version 2.0.0\n */\nexport async function decryptText(\n value: string,\n secret: string,\n): Promise<string | undefined> {\n try {\n const payload = parseEncryptedPayload(value);\n\n if (payload === undefined) {\n return undefined;\n }\n\n const key = await deriveAesKey(secret);\n\n if (key === undefined) {\n return undefined;\n }\n\n const plaintext = await decryptPayload(payload, key);\n\n return decodeText(plaintext);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -305,20 +305,30 @@ var w = Object.freeze({ INTERPOLATION_PLACEHOLDER: String.raw`\{\{([a-zA-Z0-9_]+
|
|
|
305
305
|
TYPOGRAPHY_LABEL_MUTED: "--rui-typography-label-muted",
|
|
306
306
|
TYPOGRAPHY_BUTTON_PRIMARY: "--rui-typography-button-primary",
|
|
307
307
|
TYPOGRAPHY_BUTTON_SECONDARY: "--rui-typography-button-secondary"
|
|
308
|
+
}, he = {
|
|
309
|
+
THIN: 100,
|
|
310
|
+
EXTRA_LIGHT: 200,
|
|
311
|
+
LIGHT: 300,
|
|
312
|
+
REGULAR: 400,
|
|
313
|
+
MEDIUM: 500,
|
|
314
|
+
SEMI_BOLD: 600,
|
|
315
|
+
BOLD: 700,
|
|
316
|
+
EXTRA_BOLD: 800,
|
|
317
|
+
BLACK: 900
|
|
308
318
|
};
|
|
309
319
|
//#endregion
|
|
310
320
|
//#region src/libs/aplicacion/utils/translation.utils.ts
|
|
311
321
|
function A(e, t) {
|
|
312
322
|
return Object.hasOwn(e, t);
|
|
313
323
|
}
|
|
314
|
-
function
|
|
324
|
+
function ge(e) {
|
|
315
325
|
let [t] = Object.keys(e);
|
|
316
326
|
return t;
|
|
317
327
|
}
|
|
318
328
|
function j(e, t, n) {
|
|
319
329
|
if (A(e, t)) return t;
|
|
320
330
|
if (A(e, n)) return n;
|
|
321
|
-
let r =
|
|
331
|
+
let r = ge(e);
|
|
322
332
|
if (r === void 0) throw Error("TranslateProvider requires at least one translation catalog.");
|
|
323
333
|
return r;
|
|
324
334
|
}
|
|
@@ -328,7 +338,7 @@ function M(e, t, n, r) {
|
|
|
328
338
|
function N(e, t) {
|
|
329
339
|
if (!A(e, t)) throw Error(`Language "${t}" is not available in the translation catalog.`);
|
|
330
340
|
}
|
|
331
|
-
function
|
|
341
|
+
function _e(e, t) {
|
|
332
342
|
let n = e;
|
|
333
343
|
for (let e of t.split(".")) {
|
|
334
344
|
if (typeof n == "string" || !Object.hasOwn(n, e)) return;
|
|
@@ -338,35 +348,36 @@ function ge(e, t) {
|
|
|
338
348
|
}
|
|
339
349
|
function P(e, t) {
|
|
340
350
|
if (e === void 0 || t === "") return;
|
|
341
|
-
let n =
|
|
351
|
+
let n = _e(e, t);
|
|
342
352
|
return typeof n == "string" ? n : void 0;
|
|
343
353
|
}
|
|
344
|
-
function
|
|
354
|
+
function F(e, t, n) {
|
|
345
355
|
let r = n?.[t];
|
|
346
356
|
return r === void 0 ? e : String(r);
|
|
347
357
|
}
|
|
348
|
-
function
|
|
358
|
+
function I(e, t) {
|
|
349
359
|
let n = new RegExp(w.INTERPOLATION_PLACEHOLDER, "g");
|
|
350
|
-
return e.replace(n, (e, n) =>
|
|
360
|
+
return e.replace(n, (e, n) => F(e, n, t));
|
|
351
361
|
}
|
|
352
|
-
function
|
|
362
|
+
function ve(e, t, n) {
|
|
353
363
|
let r = P(e, n);
|
|
354
364
|
return r === void 0 ? P(t, n) ?? n : r;
|
|
355
365
|
}
|
|
356
366
|
function L(e, t, n, r) {
|
|
357
|
-
return
|
|
367
|
+
return I(ve(e, t, n), r);
|
|
358
368
|
}
|
|
359
369
|
//#endregion
|
|
360
370
|
//#region src/libs/aplicacion/utils/theme.utils.ts
|
|
361
371
|
function R(e, t) {
|
|
362
372
|
return e.find((e) => e.name === t);
|
|
363
373
|
}
|
|
364
|
-
function
|
|
365
|
-
|
|
366
|
-
|
|
374
|
+
function ye(e) {
|
|
375
|
+
let t = e.at(0);
|
|
376
|
+
if (t === void 0) throw Error("ThemeProvider requires at least one registered theme.");
|
|
377
|
+
return t;
|
|
367
378
|
}
|
|
368
379
|
function z(e, t) {
|
|
369
|
-
return R(e, t) ??
|
|
380
|
+
return R(e, t) ?? ye(e);
|
|
370
381
|
}
|
|
371
382
|
function B(e, t, n) {
|
|
372
383
|
return R(e, t) ?? z(e, n);
|
|
@@ -374,7 +385,7 @@ function B(e, t, n) {
|
|
|
374
385
|
function V(e, t) {
|
|
375
386
|
if (R(e, t) === void 0) throw Error(`Theme "${t}" is not registered in ThemeProvider.`);
|
|
376
387
|
}
|
|
377
|
-
function
|
|
388
|
+
function be(e) {
|
|
378
389
|
return {
|
|
379
390
|
[k.SURFACE_BACKGROUND]: e.surface.background,
|
|
380
391
|
[k.SURFACE_SURFACE]: e.surface.surface,
|
|
@@ -384,7 +395,7 @@ function ye(e) {
|
|
|
384
395
|
[k.SURFACE_SURFACE_DISABLED]: e.surface.surfaceDisabled
|
|
385
396
|
};
|
|
386
397
|
}
|
|
387
|
-
function
|
|
398
|
+
function xe(e) {
|
|
388
399
|
return {
|
|
389
400
|
[k.TEXT_PRIMARY]: e.text.primary,
|
|
390
401
|
[k.TEXT_SECONDARY]: e.text.secondary,
|
|
@@ -395,7 +406,7 @@ function be(e) {
|
|
|
395
406
|
[k.TEXT_LINK_HOVER]: e.text.linkHover
|
|
396
407
|
};
|
|
397
408
|
}
|
|
398
|
-
function
|
|
409
|
+
function Se(e) {
|
|
399
410
|
return {
|
|
400
411
|
[k.BRAND_PRIMARY]: e.brand.primary,
|
|
401
412
|
[k.BRAND_PRIMARY_HOVER]: e.brand.primaryHover,
|
|
@@ -410,7 +421,7 @@ function xe(e) {
|
|
|
410
421
|
[k.BRAND_ACCENT_CONTRAST]: e.brand.accentContrast
|
|
411
422
|
};
|
|
412
423
|
}
|
|
413
|
-
function
|
|
424
|
+
function Ce(e) {
|
|
414
425
|
return {
|
|
415
426
|
[k.STATE_SUCCESS]: e.state.success,
|
|
416
427
|
[k.STATE_SUCCESS_BACKGROUND]: e.state.successBackground,
|
|
@@ -422,7 +433,7 @@ function Se(e) {
|
|
|
422
433
|
[k.STATE_INFO_BACKGROUND]: e.state.infoBackground
|
|
423
434
|
};
|
|
424
435
|
}
|
|
425
|
-
function
|
|
436
|
+
function we(e) {
|
|
426
437
|
return {
|
|
427
438
|
[k.BORDER_DEFAULT]: e.border.default,
|
|
428
439
|
[k.BORDER_SUBTLE]: e.border.subtle,
|
|
@@ -433,16 +444,6 @@ function Ce(e) {
|
|
|
433
444
|
[k.BORDER_DISABLED]: e.border.disabled
|
|
434
445
|
};
|
|
435
446
|
}
|
|
436
|
-
function we(e) {
|
|
437
|
-
return {
|
|
438
|
-
[k.SHADOW_COLOR]: e.shadow.color,
|
|
439
|
-
[k.SHADOW_SUBTLE]: e.shadow.subtle,
|
|
440
|
-
[k.SHADOW_SMALL]: e.shadow.small,
|
|
441
|
-
[k.SHADOW_MEDIUM]: e.shadow.medium,
|
|
442
|
-
[k.SHADOW_LARGE]: e.shadow.large,
|
|
443
|
-
[k.SHADOW_GLOW]: e.shadow.glow
|
|
444
|
-
};
|
|
445
|
-
}
|
|
446
447
|
function Te(e) {
|
|
447
448
|
return {
|
|
448
449
|
[k.EFFECTS_OVERLAY]: e.effects.overlay,
|
|
@@ -455,23 +456,22 @@ function Te(e) {
|
|
|
455
456
|
}
|
|
456
457
|
function Ee(e) {
|
|
457
458
|
return {
|
|
458
|
-
[k.TYPOGRAPHY_HEADING_PRIMARY]: e.typography.heading.
|
|
459
|
-
[k.TYPOGRAPHY_HEADING_SECONDARY]: e.typography.heading.
|
|
460
|
-
[k.TYPOGRAPHY_HEADING_MUTED]: e.typography.
|
|
461
|
-
[k.TYPOGRAPHY_BODY_PRIMARY]: e.typography.body.primary,
|
|
462
|
-
[k.TYPOGRAPHY_BODY_SECONDARY]: e.typography.body.secondary,
|
|
463
|
-
[k.TYPOGRAPHY_BODY_MUTED]: e.typography.body.muted,
|
|
464
|
-
[k.TYPOGRAPHY_LABEL_PRIMARY]: e.typography.label.primary,
|
|
465
|
-
[k.TYPOGRAPHY_LABEL_SECONDARY]: e.typography.label.secondary,
|
|
466
|
-
[k.TYPOGRAPHY_LABEL_MUTED]: e.typography.label.muted,
|
|
467
|
-
[k.TYPOGRAPHY_BUTTON_PRIMARY]: e.typography.button.primary,
|
|
468
|
-
[k.TYPOGRAPHY_BUTTON_SECONDARY]: e.typography.button.secondary
|
|
459
|
+
[k.TYPOGRAPHY_HEADING_PRIMARY]: e.typography.heading.h1.color,
|
|
460
|
+
[k.TYPOGRAPHY_HEADING_SECONDARY]: e.typography.heading.h2.color,
|
|
461
|
+
[k.TYPOGRAPHY_HEADING_MUTED]: e.typography.body.muted.color,
|
|
462
|
+
[k.TYPOGRAPHY_BODY_PRIMARY]: e.typography.body.primary.color,
|
|
463
|
+
[k.TYPOGRAPHY_BODY_SECONDARY]: e.typography.body.secondary.color,
|
|
464
|
+
[k.TYPOGRAPHY_BODY_MUTED]: e.typography.body.muted.color,
|
|
465
|
+
[k.TYPOGRAPHY_LABEL_PRIMARY]: e.typography.label.primary.color,
|
|
466
|
+
[k.TYPOGRAPHY_LABEL_SECONDARY]: e.typography.label.secondary.color,
|
|
467
|
+
[k.TYPOGRAPHY_LABEL_MUTED]: e.typography.label.muted.color,
|
|
468
|
+
[k.TYPOGRAPHY_BUTTON_PRIMARY]: e.typography.button.primary.color,
|
|
469
|
+
[k.TYPOGRAPHY_BUTTON_SECONDARY]: e.typography.button.secondary.color
|
|
469
470
|
};
|
|
470
471
|
}
|
|
471
472
|
function H(e) {
|
|
472
|
-
let {
|
|
473
|
+
let { themes: t } = e;
|
|
473
474
|
return {
|
|
474
|
-
...ye(t),
|
|
475
475
|
...be(t),
|
|
476
476
|
...xe(t),
|
|
477
477
|
...Se(t),
|
|
@@ -597,6 +597,6 @@ async function $(e, t) {
|
|
|
597
597
|
}
|
|
598
598
|
}
|
|
599
599
|
//#endregion
|
|
600
|
-
export { T as AES_GCM_ALGORITHM, fe as AES_GCM_IV_LENGTH, me as ENCRYPTED_VALUE_PART_COUNT, de as GLOBAL_REGEX_FLAG, O as KEY_USAGES, pe as RAW_KEY_FORMAT, E as SHA_256_ALGORITHM, D as STORAGE_VALUE_SEPARATOR, c as ThemeContext, k as ThemeCssVariable, ue as ThemeProvider, s as TranslateContext, ce as TranslateProvider, w as TranslationRegex, N as assertLanguageExists, V as assertThemeExists, H as createThemeVariables, J as decodeBase64, K as decodeText, $ as decryptText, q as encodeBase64, G as encodeText, Q as encryptText, P as findTranslation, U as getCryptoApi, W as getLocalStorage,
|
|
600
|
+
export { T as AES_GCM_ALGORITHM, fe as AES_GCM_IV_LENGTH, me as ENCRYPTED_VALUE_PART_COUNT, de as GLOBAL_REGEX_FLAG, O as KEY_USAGES, pe as RAW_KEY_FORMAT, E as SHA_256_ALGORITHM, D as STORAGE_VALUE_SEPARATOR, he as THEME_FONT_WEIGHT, c as ThemeContext, k as ThemeCssVariable, ue as ThemeProvider, s as TranslateContext, ce as TranslateProvider, w as TranslationRegex, N as assertLanguageExists, V as assertThemeExists, H as createThemeVariables, J as decodeBase64, K as decodeText, $ as decryptText, q as encodeBase64, G as encodeText, Q as encryptText, P as findTranslation, U as getCryptoApi, W as getLocalStorage, I as interpolateTranslation, f as loadEncryptedPreference, h as loadLanguagePreference, v as loadThemePreference, M as resolveActiveLanguage, B as resolveActiveTheme, j as resolveInitialLanguage, z as resolveInitialTheme, d as saveEncryptedPreference, m as saveLanguagePreference, _ as saveThemePreference, L as translateMessage, l as useLanguage, u as useTheme, x as useThemePreference };
|
|
601
601
|
|
|
602
602
|
//# sourceMappingURL=index.js.map
|