@steveencues/starter-react-ui 1.0.2 → 1.0.4

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.
Files changed (31) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.js +57 -30
  4. package/dist/index.js.map +1 -1
  5. package/dist/libs/components/Button/Button.d.ts +23 -1
  6. package/dist/libs/components/Button/index.d.ts +1 -1
  7. package/dist/libs/components/index.d.ts +1 -1
  8. package/dist/libs/domain/interface/theme/core/theme.interface.d.ts +3 -9
  9. package/dist/libs/domain/interface/theme/effects/index.d.ts +0 -2
  10. package/dist/libs/domain/interface/theme/index.d.ts +0 -2
  11. package/dist/libs/domain/interface/theme/preferences/theme-context.interface.d.ts +0 -1
  12. package/package.json +1 -1
  13. package/dist/libs/components/Button/button.types.d.ts +0 -1
  14. package/dist/libs/domain/interface/theme/components/index.d.ts +0 -6
  15. package/dist/libs/domain/interface/theme/components/theme-button.interface.d.ts +0 -18
  16. package/dist/libs/domain/interface/theme/components/theme-card.interface.d.ts +0 -15
  17. package/dist/libs/domain/interface/theme/components/theme-components.interface.d.ts +0 -12
  18. package/dist/libs/domain/interface/theme/components/theme-input.interface.d.ts +0 -18
  19. package/dist/libs/domain/interface/theme/components/theme-interactive-colors.interface.d.ts +0 -16
  20. package/dist/libs/domain/interface/theme/components/theme-modal.interface.d.ts +0 -14
  21. package/dist/libs/domain/interface/theme/effects/theme-animations.interface.d.ts +0 -20
  22. package/dist/libs/domain/interface/theme/effects/theme-transitions.interface.d.ts +0 -18
  23. package/dist/libs/domain/interface/theme/layout/index.d.ts +0 -8
  24. package/dist/libs/domain/interface/theme/layout/theme-breakpoints.interface.d.ts +0 -13
  25. package/dist/libs/domain/interface/theme/layout/theme-dimensions.interface.d.ts +0 -15
  26. package/dist/libs/domain/interface/theme/layout/theme-layout.interface.d.ts +0 -14
  27. package/dist/libs/domain/interface/theme/layout/theme-radii.interface.d.ts +0 -16
  28. package/dist/libs/domain/interface/theme/layout/theme-shadow-colors.interface.d.ts +0 -13
  29. package/dist/libs/domain/interface/theme/layout/theme-shadows.interface.d.ts +0 -16
  30. package/dist/libs/domain/interface/theme/layout/theme-spacing.interface.d.ts +0 -20
  31. package/dist/libs/domain/interface/theme/layout/theme-z-index.interface.d.ts +0 -16
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 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 x(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 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=x(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.SHADOW_COLOR]:e.shadowColors.color,[O.SHADOW_SUBTLE]:e.shadowColors.subtle,[O.SHADOW_SMALL]:e.shadowColors.small,[O.SHADOW_MEDIUM]:e.shadowColors.medium,[O.SHADOW_LARGE]:e.shadowColors.large,[O.SHADOW_GLOW]:e.shadowColors.glow}}function be(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 xe(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),...xe(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 Se(){let e=W();if(e===void 0)throw Error(`Cryptographic API is unavailable.`);return e.getRandomValues(new Uint8Array(12))}function Ce(e){try{let t=Y(e);return t.length===12?t:void 0}catch{return}}function we(e){return e.length===2}function Te(e){if(we(e))return[e[0],e[1]]}function Ee(e){let t=Te(e.split(`.`));if(t===void 0)return;let[n,r]=t,i=Ce(n);if(i!==void 0)try{return{iv:i,ciphertext:Y(r)}}catch{return}}async function De(e,t,n){return Z().subtle.encrypt({name:C,iv:n},t,e)}async function Oe(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=Se(),i=await De(K(e),n,r);return[J(r),J(new Uint8Array(i))].join(`.`)}catch{return}}async function $(e,t){try{let n=Ee(e);if(n===void 0)return;let r=await X(t);return r===void 0?void 0:q(await Oe(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=ae,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=_;
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 x(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 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=>{M(t.translations,e),n(v(t,e,!0))},[t,n])}function ie(t){let[n,r]=(0,e.useState)(()=>v(t,t.initialLanguage,!1));x(t,r);let i=y(n,t),a=i?n.selectedLanguage:t.initialLanguage,o=i&&n.isLoaded,s=re(t,r);return{language:j(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=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 S({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 C=Object.freeze({INTERPOLATION_PLACEHOLDER:String.raw`\{\{([a-zA-Z0-9_]+)\}\}`}),se=`g`,w=`AES-GCM`,ce=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(C.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:w},!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: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}}var Oe=({titulo:e,variant:n=`solid`,disabled:r=!1,className:o=``,style:s,type:c=`button`,...l})=>{let{t:u}=i(),{theme:d}=a(),f=d.themes.brand.primary,p={solid:`border`,outline:`border bg-transparent`,ghost:`border border-transparent bg-transparent`},m={solid:{backgroundColor:f,borderColor:f},outline:{color:f,borderColor:f},ghost:{color:f}};return(0,t.jsx)(`button`,{...l,type:c,disabled:r,"aria-label":l[`aria-label`]??u(e),className:[`inline-flex items-center justify-center rounded-md px-4 py-2`,`transition-colors focus-visible:outline-2`,`focus-visible:outline-offset-2 disabled:cursor-not-allowed`,`disabled:opacity-50`,p[n],o].filter(Boolean).join(` `),style:{...m[n],...s},children:u(e)})};exports.AES_GCM_ALGORITHM=w,exports.AES_GCM_IV_LENGTH=ce,exports.Button=Oe,exports.ENCRYPTED_VALUE_PART_COUNT=D,exports.GLOBAL_REGEX_FLAG=se,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=S,exports.TranslateContext=n,exports.TranslateProvider=ae,exports.TranslationRegex=C,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
@@ -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","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","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/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 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 */\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 las sombras.\n * @author Steveen Cues\n * @version 2.0.0\n */\nfunction createShadowVariables(colors: AppTheme[\"themes\"]): ShadowVariables {\n return {\n [ThemeCssVariable.SHADOW_COLOR]: colors.shadowColors.color,\n [ThemeCssVariable.SHADOW_SUBTLE]: colors.shadowColors.subtle,\n [ThemeCssVariable.SHADOW_SMALL]: colors.shadowColors.small,\n [ThemeCssVariable.SHADOW_MEDIUM]: colors.shadowColors.medium,\n [ThemeCssVariable.SHADOW_LARGE]: colors.shadowColors.large,\n [ThemeCssVariable.SHADOW_GLOW]: colors.shadowColors.glow,\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 ...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","Button","props","primaryColor","variantClasses","variantStyles","titulo","variant","className","style"],"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","../src/libs/components/Button/Button.tsx"],"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","import type { FC, ButtonHTMLAttributes } from \"react\";\nimport { useLanguage, useTheme } from \"@aplicacion\";\n\n/**\n * @description Variantes visuales del boton.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport type ButtonVariant = \"solid\" | \"outline\" | \"ghost\";\n\n/**\n * @description Propiedades del componente Button.\n * @author Steveen Cues\n * @version 1.0.0\n */\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n readonly titulo: string;\n readonly variant?: ButtonVariant;\n}\n\n/**\n * @description Renderiza un boton accesible adaptado al tema activo.\n * @author Steveen Cues\n * @version 1.0.0\n */\nconst Button: FC<ButtonProps> = ({\n titulo,\n variant = \"solid\",\n disabled = false,\n className = \"\",\n style,\n type = \"button\",\n ...props\n}) => {\n const { t } = useLanguage();\n const { theme } = useTheme();\n\n const primaryColor = theme.themes.brand.primary;\n\n const variantClasses: Record<ButtonVariant, string> = {\n solid: \"border\",\n outline: \"border bg-transparent\",\n ghost: \"border border-transparent bg-transparent\",\n };\n\n const variantStyles = {\n solid: {\n backgroundColor: primaryColor,\n borderColor: primaryColor,\n },\n outline: {\n color: primaryColor,\n borderColor: primaryColor,\n },\n ghost: {\n color: primaryColor,\n },\n } satisfies Record<ButtonVariant, React.CSSProperties>;\n\n return (\n <button\n {...props}\n type={type}\n disabled={disabled}\n aria-label={props[\"aria-label\"] ?? t(titulo)}\n className={[\n \"inline-flex items-center justify-center rounded-md px-4 py-2\",\n \"transition-colors focus-visible:outline-2\",\n \"focus-visible:outline-offset-2 disabled:cursor-not-allowed\",\n \"disabled:opacity-50\",\n variantClasses[variant],\n className,\n ]\n .filter(Boolean)\n .join(\" \")}\n style={{\n ...variantStyles[variant],\n ...style,\n }}\n >\n {t(titulo)}\n </button>\n );\n};\n\nexport default Button;\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -242,7 +242,7 @@ function ue({ themes: e, initialTheme: n, themeEncryptionKey: a, children: s })
242
242
  }
243
243
  //#endregion
244
244
  //#region src/libs/domain/enums/translation-regex.enum.ts
245
- var w = Object.freeze({ INTERPOLATION_PLACEHOLDER: String.raw`\{\{([a-zA-Z0-9_]+)\}\}` }), de = "g", T = "AES-GCM", fe = 12, E = "SHA-256", pe = "raw", D = ".", O = ["encrypt", "decrypt"], me = 2, k = {
245
+ var w = Object.freeze({ INTERPOLATION_PLACEHOLDER: String.raw`\{\{([a-zA-Z0-9_]+)\}\}` }), T = "g", E = "AES-GCM", de = 12, D = "SHA-256", fe = "raw", pe = ".", O = ["encrypt", "decrypt"], me = 2, k = {
246
246
  SURFACE_BACKGROUND: "--rui-surface-background",
247
247
  SURFACE_SURFACE: "--rui-surface-surface",
248
248
  SURFACE_SURFACE_ELEVATED: "--rui-surface-surface-elevated",
@@ -445,16 +445,6 @@ function we(e) {
445
445
  };
446
446
  }
447
447
  function Te(e) {
448
- return {
449
- [k.SHADOW_COLOR]: e.shadowColors.color,
450
- [k.SHADOW_SUBTLE]: e.shadowColors.subtle,
451
- [k.SHADOW_SMALL]: e.shadowColors.small,
452
- [k.SHADOW_MEDIUM]: e.shadowColors.medium,
453
- [k.SHADOW_LARGE]: e.shadowColors.large,
454
- [k.SHADOW_GLOW]: e.shadowColors.glow
455
- };
456
- }
457
- function Ee(e) {
458
448
  return {
459
449
  [k.EFFECTS_OVERLAY]: e.effects.overlay,
460
450
  [k.EFFECTS_BACKDROP]: e.effects.backdrop,
@@ -464,7 +454,7 @@ function Ee(e) {
464
454
  [k.EFFECTS_GLASS_BORDER]: e.effects.glassBorder
465
455
  };
466
456
  }
467
- function De(e) {
457
+ function Ee(e) {
468
458
  return {
469
459
  [k.TYPOGRAPHY_HEADING_PRIMARY]: e.typography.heading.h1.color,
470
460
  [k.TYPOGRAPHY_HEADING_SECONDARY]: e.typography.heading.h2.color,
@@ -488,8 +478,7 @@ function H(e) {
488
478
  ...Ce(t),
489
479
  ...we(t),
490
480
  ...Te(t),
491
- ...Ee(t),
492
- ...De(t)
481
+ ...Ee(t)
493
482
  };
494
483
  }
495
484
  //#endregion
@@ -535,15 +524,15 @@ function J(e) {
535
524
  async function Y(e) {
536
525
  let t = U();
537
526
  if (t === void 0 || e.length === 0) return;
538
- let n = await t.subtle.digest(E, G(e));
539
- return t.subtle.importKey("raw", n, { name: T }, !1, O);
527
+ let n = await t.subtle.digest(D, G(e));
528
+ return t.subtle.importKey("raw", n, { name: E }, !1, O);
540
529
  }
541
- function Oe() {
530
+ function De() {
542
531
  let e = U();
543
532
  if (e === void 0) throw Error("Cryptographic API is unavailable.");
544
533
  return e.getRandomValues(/* @__PURE__ */ new Uint8Array(12));
545
534
  }
546
- function ke(e) {
535
+ function Oe(e) {
547
536
  try {
548
537
  let t = J(e);
549
538
  return t.length === 12 ? t : void 0;
@@ -551,16 +540,16 @@ function ke(e) {
551
540
  return;
552
541
  }
553
542
  }
554
- function X(e) {
543
+ function ke(e) {
555
544
  return e.length === 2;
556
545
  }
557
546
  function Ae(e) {
558
- if (X(e)) return [e[0], e[1]];
547
+ if (ke(e)) return [e[0], e[1]];
559
548
  }
560
- function je(e) {
549
+ function X(e) {
561
550
  let t = Ae(e.split("."));
562
551
  if (t === void 0) return;
563
- let [n, r] = t, i = ke(n);
552
+ let [n, r] = t, i = Oe(n);
564
553
  if (i !== void 0) try {
565
554
  return {
566
555
  iv: i,
@@ -570,15 +559,15 @@ function je(e) {
570
559
  return;
571
560
  }
572
561
  }
573
- async function Me(e, t, n) {
562
+ async function je(e, t, n) {
574
563
  return Z().subtle.encrypt({
575
- name: T,
564
+ name: E,
576
565
  iv: n
577
566
  }, t, e);
578
567
  }
579
- async function Ne(e, t) {
568
+ async function Me(e, t) {
580
569
  return Z().subtle.decrypt({
581
- name: T,
570
+ name: E,
582
571
  iv: e.iv
583
572
  }, t, e.ciphertext);
584
573
  }
@@ -591,7 +580,7 @@ async function Q(e, t) {
591
580
  try {
592
581
  let n = await Y(t);
593
582
  if (n === void 0) return;
594
- let r = Oe(), i = await Me(G(e), n, r);
583
+ let r = De(), i = await je(G(e), n, r);
595
584
  return [q(r), q(new Uint8Array(i))].join(".");
596
585
  } catch {
597
586
  return;
@@ -599,15 +588,53 @@ async function Q(e, t) {
599
588
  }
600
589
  async function $(e, t) {
601
590
  try {
602
- let n = je(e);
591
+ let n = X(e);
603
592
  if (n === void 0) return;
604
593
  let r = await Y(t);
605
- return r === void 0 ? void 0 : K(await Ne(n, r));
594
+ return r === void 0 ? void 0 : K(await Me(n, r));
606
595
  } catch {
607
596
  return;
608
597
  }
609
598
  }
610
599
  //#endregion
611
- 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 };
600
+ //#region src/libs/components/Button/Button.tsx
601
+ var Ne = ({ titulo: e, variant: t = "solid", disabled: n = !1, className: r = "", style: i, type: a = "button", ...s }) => {
602
+ let { t: c } = l(), { theme: d } = u(), f = d.themes.brand.primary, p = {
603
+ solid: "border",
604
+ outline: "border bg-transparent",
605
+ ghost: "border border-transparent bg-transparent"
606
+ }, m = {
607
+ solid: {
608
+ backgroundColor: f,
609
+ borderColor: f
610
+ },
611
+ outline: {
612
+ color: f,
613
+ borderColor: f
614
+ },
615
+ ghost: { color: f }
616
+ };
617
+ return /* @__PURE__ */ o("button", {
618
+ ...s,
619
+ type: a,
620
+ disabled: n,
621
+ "aria-label": s["aria-label"] ?? c(e),
622
+ className: [
623
+ "inline-flex items-center justify-center rounded-md px-4 py-2",
624
+ "transition-colors focus-visible:outline-2",
625
+ "focus-visible:outline-offset-2 disabled:cursor-not-allowed",
626
+ "disabled:opacity-50",
627
+ p[t],
628
+ r
629
+ ].filter(Boolean).join(" "),
630
+ style: {
631
+ ...m[t],
632
+ ...i
633
+ },
634
+ children: c(e)
635
+ });
636
+ };
637
+ //#endregion
638
+ export { E as AES_GCM_ALGORITHM, de as AES_GCM_IV_LENGTH, Ne as Button, me as ENCRYPTED_VALUE_PART_COUNT, T as GLOBAL_REGEX_FLAG, O as KEY_USAGES, fe as RAW_KEY_FORMAT, D as SHA_256_ALGORITHM, pe 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 };
612
639
 
613
640
  //# sourceMappingURL=index.js.map