@lardexx/react 1.0.0

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 (86) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +286 -0
  3. package/dist/icons-BbGGUHyX.cjs +2 -0
  4. package/dist/icons-BbGGUHyX.cjs.map +1 -0
  5. package/dist/icons-DQRCVyKi.js +126 -0
  6. package/dist/icons-DQRCVyKi.js.map +1 -0
  7. package/dist/icons.cjs +2 -0
  8. package/dist/icons.cjs.map +1 -0
  9. package/dist/icons.js +13620 -0
  10. package/dist/icons.js.map +1 -0
  11. package/dist/oneui-react.cjs +2 -0
  12. package/dist/oneui-react.cjs.map +1 -0
  13. package/dist/oneui-react.css +2 -0
  14. package/dist/oneui-react.js +1402 -0
  15. package/dist/oneui-react.js.map +1 -0
  16. package/dist/types/components/AppInfo.d.ts +35 -0
  17. package/dist/types/components/AppInfo.d.ts.map +1 -0
  18. package/dist/types/components/BottomNav.d.ts +25 -0
  19. package/dist/types/components/BottomNav.d.ts.map +1 -0
  20. package/dist/types/components/Button.d.ts +16 -0
  21. package/dist/types/components/Button.d.ts.map +1 -0
  22. package/dist/types/components/ColorPickerPreference.d.ts +19 -0
  23. package/dist/types/components/ColorPickerPreference.d.ts.map +1 -0
  24. package/dist/types/components/DescriptionPreference.d.ts +18 -0
  25. package/dist/types/components/DescriptionPreference.d.ts.map +1 -0
  26. package/dist/types/components/Dialog.d.ts +38 -0
  27. package/dist/types/components/Dialog.d.ts.map +1 -0
  28. package/dist/types/components/Drawer.d.ts +24 -0
  29. package/dist/types/components/Drawer.d.ts.map +1 -0
  30. package/dist/types/components/GridMenuDialog.d.ts +27 -0
  31. package/dist/types/components/GridMenuDialog.d.ts.map +1 -0
  32. package/dist/types/components/HorizontalRadioPreference.d.ts +26 -0
  33. package/dist/types/components/HorizontalRadioPreference.d.ts.map +1 -0
  34. package/dist/types/components/Page.d.ts +66 -0
  35. package/dist/types/components/Page.d.ts.map +1 -0
  36. package/dist/types/components/Preference.d.ts +23 -0
  37. package/dist/types/components/Preference.d.ts.map +1 -0
  38. package/dist/types/components/PreferenceGroup.d.ts +20 -0
  39. package/dist/types/components/PreferenceGroup.d.ts.map +1 -0
  40. package/dist/types/components/ProgressBar.d.ts +35 -0
  41. package/dist/types/components/ProgressBar.d.ts.map +1 -0
  42. package/dist/types/components/ProgressDialog.d.ts +23 -0
  43. package/dist/types/components/ProgressDialog.d.ts.map +1 -0
  44. package/dist/types/components/RelatedCard.d.ts +22 -0
  45. package/dist/types/components/RelatedCard.d.ts.map +1 -0
  46. package/dist/types/components/RoundBox.d.ts +31 -0
  47. package/dist/types/components/RoundBox.d.ts.map +1 -0
  48. package/dist/types/components/Separator.d.ts +13 -0
  49. package/dist/types/components/Separator.d.ts.map +1 -0
  50. package/dist/types/components/Slider.d.ts +39 -0
  51. package/dist/types/components/Slider.d.ts.map +1 -0
  52. package/dist/types/components/SliderPreference.d.ts +22 -0
  53. package/dist/types/components/SliderPreference.d.ts.map +1 -0
  54. package/dist/types/components/Splash.d.ts +21 -0
  55. package/dist/types/components/Splash.d.ts.map +1 -0
  56. package/dist/types/components/Switch.d.ts +15 -0
  57. package/dist/types/components/Switch.d.ts.map +1 -0
  58. package/dist/types/components/SwitchBar.d.ts +38 -0
  59. package/dist/types/components/SwitchBar.d.ts.map +1 -0
  60. package/dist/types/components/SwitchPreference.d.ts +9 -0
  61. package/dist/types/components/SwitchPreference.d.ts.map +1 -0
  62. package/dist/types/components/Tabs.d.ts +31 -0
  63. package/dist/types/components/Tabs.d.ts.map +1 -0
  64. package/dist/types/components/TipPopup.d.ts +27 -0
  65. package/dist/types/components/TipPopup.d.ts.map +1 -0
  66. package/dist/types/components/TipsCard.d.ts +25 -0
  67. package/dist/types/components/TipsCard.d.ts.map +1 -0
  68. package/dist/types/components/Toast.d.ts +28 -0
  69. package/dist/types/components/Toast.d.ts.map +1 -0
  70. package/dist/types/icons.d.ts +47 -0
  71. package/dist/types/icons.d.ts.map +1 -0
  72. package/dist/types/index.d.ts +36 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/oneui-icons/OneIcon.d.ts +26 -0
  75. package/dist/types/oneui-icons/OneIcon.d.ts.map +1 -0
  76. package/dist/types/oneui-icons/generated.d.ts +2670 -0
  77. package/dist/types/oneui-icons/generated.d.ts.map +1 -0
  78. package/dist/types/oneui-icons/index.d.ts +18 -0
  79. package/dist/types/oneui-icons/index.d.ts.map +1 -0
  80. package/dist/types/strings.d.ts +44 -0
  81. package/dist/types/strings.d.ts.map +1 -0
  82. package/dist/types/theme.d.ts +47 -0
  83. package/dist/types/theme.d.ts.map +1 -0
  84. package/dist/types/utils.d.ts +19 -0
  85. package/dist/types/utils.d.ts.map +1 -0
  86. package/package.json +71 -0
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./icons-BbGGUHyX.cjs");let t=require("react"),n=require("react/jsx-runtime"),r=require("react-dom"),i=require("react-dom/client");var a={relatedDescription:`Looking for something else?`,newBadge:`N`,navigationDrawer:`Navigation drawer`,actionModeAll:`All`,actionModeSelected:e=>`${e} selected`,actionModeSelectItems:`Select items`,appInfo:`App info`,versionInfo:e=>`Version ${e}`,update:`Update`,retry:`Retry`,newVersionIsAvailable:`A new version is available.`,latestVersion:`The latest version is already installed.`,timeStart:`Start`,timeEnd:`End`,add:`Add`,apply:`Apply`,yes:`Yes`,cancel:`Cancel`,continue:`Continue`,disable:`Disable`,done:`Done`,edit:`Edit`,close:`Close`,tipHint:`Double tap this button to learn more.`};function o(e){return e?{...a,...e}:a}var s=(0,t.createContext)(null);function c(e){return e===`system`?typeof window>`u`||!window.matchMedia?`light`:window.matchMedia(`(prefers-color-scheme: dark)`).matches?`dark`:`light`:e}function l({theme:e=`system`,onThemeChange:r,strings:i,accent:a,radius:l,scope:u=`document`,className:d,style:f,children:p}){let m=e,h=e=>r?.(e);(0,t.useEffect)(()=>{if(m!==`system`||typeof window>`u`||!window.matchMedia)return;let e=window.matchMedia(`(prefers-color-scheme: dark)`),t=()=>r?.(`system`);return e.addEventListener(`change`,t),()=>e.removeEventListener(`change`,t)},[m,r]);let g=c(m);(0,t.useEffect)(()=>{if(u!==`document`||typeof document>`u`)return;let e=document.documentElement;return e.setAttribute(`data-oneui-theme`,g),()=>{e.getAttribute(`data-oneui-theme`)===g&&e.removeAttribute(`data-oneui-theme`)}},[g,u]);let _=(0,t.useMemo)(()=>{if(!a)return l===void 0?void 0:{};let e=typeof a==`string`?a:a.primary;return{"--oui-primary":e,"--oui-primary-dark":typeof a==`string`?`color-mix(in srgb, ${e}, #000 20%)`:a.dark??e}},[a]),v=l===void 0?f:{"--oui-radius-page":`${l}px`,...f},y=_?{..._,...v}:v,b=(0,t.useMemo)(()=>({theme:g,preference:m,setTheme:h,strings:o(i)}),[g,m,i]);return(0,n.jsx)(s.Provider,{value:b,children:(0,n.jsx)(`div`,{className:d,"data-oneui-theme":u===`element`?g:void 0,"data-oneui-root":``,style:y,children:p})})}function u(){return(0,t.useContext)(s)||{theme:c(`system`),preference:`system`,setTheme:()=>{},strings:o(void 0)}}function d(){let{theme:e,preference:t,setTheme:n}=u();return{theme:e,preference:t,setTheme:n}}function f(){return u().strings}function p(...e){return e.filter(Boolean).join(` `)}function m(e,t,n){return Math.min(n,Math.max(t,e))}function h(e,n,r){let i=e!==void 0,[a,o]=(0,t.useState)(n),s=i?e:a,c=(0,t.useRef)(r);return c.current=r,[s,(0,t.useCallback)(e=>{i||o(e),c.current?.(e)},[i])]}function g(e,n){let r=(0,t.useRef)(n);r.current=n,(0,t.useEffect)(()=>{if(!e||typeof window>`u`)return;let t=e=>{e.key===`Escape`&&r.current()};return window.addEventListener(`keydown`,t),()=>window.removeEventListener(`keydown`,t)},[e])}function _(e){if(!e)return null;if(typeof e==`function`)return e();if(typeof HTMLElement<`u`&&e instanceof HTMLElement)return e.getBoundingClientRect();if(typeof DOMRect<`u`&&e instanceof DOMRect)return e;let t=e.current;return t?t.getBoundingClientRect():null}var v=typeof window<`u`&&typeof document<`u`,y=0,b=1,x=2,S=4,C=8,w=15,T=3,E=12;function D(e){if(typeof e==`number`)return e;switch(e){case`all`:return 15;case`none`:return 0;case`top`:return 3;case`bottom`:return 12;case`topLeft`:return 1;case`topRight`:return 2;case`bottomLeft`:return 4;case`bottomRight`:return 8}}function O({roundedCorners:e=15,radius:t,color:r,as:i=`div`,className:a,style:o,children:s,...c}){let l=D(e),u=t==null?`var(--oui-radius-xl)`:`${t}px`,d=l&1?u:`0`,f=l&2?u:`0`,m=l&4?u:`0`,h=l&8?u:`0`;return(0,n.jsx)(i,{className:p(`oui-round`,a),style:{borderRadius:`${d} ${f} ${h} ${m}`,...r==null?null:{background:r},...o},...c,children:s})}function k({variant:e=`colored`,fullWidth:t=!1,className:r,children:i,type:a=`button`,...o}){return(0,n.jsx)(`button`,{type:a,className:p(`oui-btn`,`oui-btn--${e}`,t&&`oui-btn--full`,`oui-press`,r),...o,children:(0,n.jsx)(`span`,{className:`oui-btn__label`,children:i})})}var A=(0,t.forwardRef)(function({checked:e,defaultChecked:t=!1,onChange:r,label:i,className:a,disabled:o,type:s=`button`,...c},l){let[u,d]=h(e,t,r);return(0,n.jsx)(`button`,{ref:l,type:s,role:`switch`,"aria-checked":u,"aria-label":i,disabled:o,className:p(`oui-switch`,a),onClick:()=>d(!u),...c,children:(0,n.jsx)(`span`,{className:`oui-switch__track`,"aria-hidden":`true`,children:(0,n.jsx)(`span`,{className:`oui-switch__thumb`})})})});function j({checked:e,defaultChecked:t,onChange:r,label:i,loading:a=!1,wrapContent:o=!0,className:s,contentClassName:c,children:l}){let u=(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(`div`,{className:p(`oui-switchbar`,s),"data-on":e,children:[(0,n.jsx)(`span`,{className:`oui-switchbar__label`,children:i}),a?(0,n.jsx)(`span`,{className:`oui-switchbar__spinner`,"aria-hidden":`true`}):null,(0,n.jsx)(A,{checked:e,defaultChecked:t,onChange:r,label:i})]}),o?(0,n.jsx)(O,{roundedCorners:3,className:p(`oui-switchbar__content`,c),children:l}):l]});return(0,n.jsx)(`div`,{className:`oui-switchbar-layout`,children:u})}function M({label:e,onClick:t,className:r}){return(0,n.jsx)(`button`,{type:`button`,className:p(`oui-switchbar__action`,`oui-press`,r),onClick:t,children:e})}function N({children:e,className:t,...r}){let i=e!=null&&e!==``;return(0,n.jsx)(`div`,{role:i?void 0:`separator`,className:p(`oui-separator`,i?`oui-separator--label`:`oui-separator--line`,t),...r,children:i?(0,n.jsx)(`span`,{className:`oui-separator__text`,children:e}):null})}var P=0,F=[],I=new Set,L=null,R=null;function z(){for(let e of I)e()}function B(e){return I.add(e),()=>I.delete(e)}function V(){return F}function H(){v&&(!R||!document.body.contains(R))&&(R=document.createElement(`div`),R.className=`oui-toast-host`,document.body.appendChild(R),L=(0,i.createRoot)(R),L.render((0,n.jsx)(K,{})))}function U(e,t={}){if(!v)return-1;let n=++P,r=t.position??`bottom`;H(),F=[...F,{id:n,message:e,position:r}],z();let i=t.duration??2200;return i>0&&window.setTimeout(()=>W(n),i),n}function W(e){F=F.filter(t=>t.id!==e),z()}function G(){F=[],z()}function K(){let e=(0,t.useSyncExternalStore)(B,V,V);return(0,n.jsx)(n.Fragment,{children:[`bottom`,`top`,`center`].map(t=>{let r=e.filter(e=>e.position===t);return r.length===0?null:(0,n.jsx)(`div`,{className:p(`oui-toast-viewport`,`oui-toast-viewport--${t}`),"aria-live":`polite`,children:r.map(e=>(0,n.jsx)(`div`,{className:`oui-toast`,role:`status`,children:(0,n.jsx)(`span`,{className:`oui-toast__text`,children:e.message})},e.id))},t)})})}function ee({open:e,onClose:i,duration:a=2200,position:o=`bottom`,children:s}){let[c,l]=(0,t.useState)(e);return(0,t.useEffect)(()=>l(e),[e]),(0,t.useEffect)(()=>{if(!e||a<=0)return;let t=window.setTimeout(()=>{l(!1),i?.()},a);return()=>window.clearTimeout(t)},[e,a,i]),!c||!v?null:(0,r.createPortal)((0,n.jsx)(`div`,{className:p(`oui-toast-viewport`,`oui-toast-viewport--${o}`),"aria-live":`polite`,children:(0,n.jsx)(`div`,{className:`oui-toast`,role:`status`,children:(0,n.jsx)(`span`,{className:`oui-toast__text`,children:s})})}),document.body)}function te({title:r,expandedTitle:i,subtitle:a,expandedSubtitle:o,onNavClick:s,navIcon:c,navLabel:l,navBadge:u,navAsBack:d=!1,actions:h,expandable:g=!0,expanded:_=!0,onExpandedChange:v,searchMode:y=!1,searchQuery:b=``,searchPlaceholder:x=`Search`,onSearchQueryChange:S,onSearchClose:C,searchTrailing:w,actionMode:T=null,headerBackground:E,footer:D,className:O,style:k,children:A}){let j=f(),M=(0,t.useRef)(null),N=(0,t.useRef)(null),P=(0,t.useRef)(null),[F,I]=(0,t.useState)(+!_),L=(0,t.useCallback)(()=>{let e=N.current;return Math.max(e?.offsetHeight??0,1)},[]),R=(0,t.useCallback)(()=>{if(!g)return;let e=M.current;if(!e)return;let t=m(e.scrollTop/L(),0,1);I(t),v?.(t<.5)},[g,L,v]);(0,t.useEffect)(()=>{let e=M.current;if(!e)return;let t=_||!g?0:L();Math.abs(e.scrollTop-t)>1&&(e.scrollTop=t,I(_||!g?0:1))},[]);let z=(0,t.useRef)(_);(0,t.useEffect)(()=>{if(z.current===_)return;z.current=_;let e=M.current;if(!e||!g)return;let t=_?0:L();e.scrollTo({top:t,behavior:`smooth`})},[_,g]),(0,t.useEffect)(()=>{y&&P.current?.focus()},[y]);let B=m((F-.55)/.35,0,1),V=F>.6||!g||y||!!T,H=i??r,U=o??a,W=g&&!y&&!T,G=s||c?(0,n.jsxs)(`button`,{type:`button`,className:`oui-page__nav oui-press`,"aria-label":l??j.navigationDrawer,onClick:s,children:[c??(d?(0,n.jsx)(e.r,{}):(0,n.jsx)(e.l,{})),u!=null&&u!==0&&u!==``?(0,n.jsx)(`span`,{className:`oui-page__nav-badge`,children:typeof u==`number`&&u>99?`99+`:u}):null]}):(0,n.jsx)(`span`,{className:`oui-page__nav-spacer`,"aria-hidden":`true`}),K;return K=T?(0,n.jsxs)(`div`,{className:`oui-page__action-mode`,role:`toolbar`,children:[(0,n.jsx)(`button`,{type:`button`,className:`oui-page__nav oui-press`,"aria-label":j.close,onClick:T.onClose,children:(0,n.jsx)(e.o,{})}),(0,n.jsx)(`span`,{className:`oui-page__action-count`,children:T.count>0?j.actionModeSelected(T.count):j.actionModeSelectItems}),(0,n.jsx)(`span`,{className:`oui-page__toolbar-spacer`}),T.showAll!==!1&&T.onToggleAll?(0,n.jsxs)(`label`,{className:`oui-page__action-all`,children:[(0,n.jsx)(`input`,{type:`checkbox`,checked:!!T.allChecked,onChange:e=>T.onToggleAll?.(e.target.checked)}),j.actionModeAll]}):null,T.actions]}):y?(0,n.jsxs)(`div`,{className:`oui-page__search`,role:`search`,children:[(0,n.jsx)(`button`,{type:`button`,className:`oui-page__nav oui-press`,"aria-label":j.close,onClick:C,children:(0,n.jsx)(e.r,{})}),(0,n.jsx)(`input`,{ref:P,className:`oui-page__search-input`,type:`search`,value:b,placeholder:x,"aria-label":x,onChange:e=>S?.(e.target.value)}),w??(0,n.jsx)(`span`,{className:`oui-page__search-icon`,"aria-hidden":`true`,children:(0,n.jsx)(e.p,{size:20})})]}):(0,n.jsxs)(n.Fragment,{children:[G,(0,n.jsx)(`span`,{className:`oui-page__collapsed-title`,style:{opacity:g?B:1},"aria-hidden":g?B<.5:!1,children:r}),(0,n.jsx)(`span`,{className:`oui-page__toolbar-spacer`}),h?(0,n.jsx)(`div`,{className:`oui-page__actions`,children:h}):null]}),(0,n.jsxs)(`div`,{className:p(`oui-page`,O),"data-collapsed":V||void 0,style:E?{"--oui-header-bg":E}:void 0,children:[(0,n.jsxs)(`div`,{ref:M,className:`oui-page__scroll`,onScroll:R,children:[(0,n.jsx)(`div`,{className:`oui-page__toolbar`,role:`toolbar`,"aria-label":r,children:K}),W?(0,n.jsxs)(`div`,{ref:N,className:`oui-page__title-block`,children:[(0,n.jsx)(`h1`,{className:`oui-page__expanded-title`,children:H}),U?(0,n.jsx)(`p`,{className:`oui-page__expanded-subtitle`,children:U}):null]}):null,(0,n.jsx)(`main`,{className:`oui-page__surface`,style:k,children:A})]}),D?(0,n.jsx)(`div`,{className:`oui-page__footer`,children:D}):null]})}function ne({items:e,value:t,onChange:r,variant:i=`fixed`,className:a,"aria-label":o}){return(0,n.jsx)(`nav`,{className:p(`oui-bottom-nav`,`oui-bottom-nav--${i}`,a),"aria-label":o,children:e.map(e=>{let i=e.key===t;return(0,n.jsxs)(`button`,{type:`button`,className:p(`oui-bottom-nav__item`,i&&`is-active`),"aria-current":i?`page`:void 0,disabled:e.disabled,onClick:()=>r?.(e.key),children:[(0,n.jsxs)(`span`,{className:`oui-bottom-nav__icon`,"aria-hidden":`true`,children:[e.icon,e.badge!=null&&e.badge!==0&&e.badge!==``?(0,n.jsx)(`span`,{className:`oui-bottom-nav__badge`,children:typeof e.badge==`number`&&e.badge>9?`9+`:e.badge}):null]}),(0,n.jsx)(`span`,{className:`oui-bottom-nav__label`,children:e.label})]},e.key)})})}function re({open:e,onClose:i,children:a,header:o,width:s=320,dimColor:c,disableScrim:l=!1,className:u,"aria-label":d}){let m=f(),h=(0,t.useRef)(null),_=(0,t.useRef)(e);return g(e,()=>i?.()),(0,t.useEffect)(()=>{e&&!_.current&&h.current?.focus(),_.current=e},[e]),v?(0,r.createPortal)((0,n.jsxs)(`div`,{className:p(`oui-drawer-root`,e&&`is-open`),"aria-hidden":!e,children:[(0,n.jsx)(`div`,{className:`oui-drawer__scrim`,style:c?{background:c}:void 0,onClick:l?void 0:i,"aria-hidden":`true`}),(0,n.jsxs)(`div`,{ref:h,className:p(`oui-drawer`,u),style:{width:`min(${s}px, 86vw)`},role:`dialog`,"aria-modal":`true`,"aria-label":d??m.navigationDrawer,tabIndex:-1,children:[o?(0,n.jsx)(`div`,{className:`oui-drawer__header`,children:o}):null,(0,n.jsx)(`div`,{className:`oui-drawer__content`,children:a})]})]}),document.body):null}function ie({image:e,title:t,animated:r=!1,loop:i=!1,className:a,style:o}){return(0,n.jsxs)(`div`,{className:p(`oui-splash`,a),style:o,role:`presentation`,children:[e?(0,n.jsx)(`div`,{className:p(`oui-splash__image`,r&&`oui-splash__image--animated`,r&&i&&`is-looping`),children:e}):null,t?(0,n.jsx)(`p`,{className:`oui-splash__title`,children:t}):null]})}function q({size:e=40,strokeWidth:t=3.5,value:r,message:i,className:a,"aria-label":o}){let s=(e-t)/2,c=2*Math.PI*s,l=typeof r==`number`,u=l?Math.min(100,Math.max(0,r)):0;return(0,n.jsxs)(`div`,{className:p(`oui-progress-circle`,!l&&`is-indeterminate`,a),style:{width:e,height:e},role:`progressbar`,"aria-valuemin":l?0:void 0,"aria-valuemax":l?100:void 0,"aria-valuenow":l?Math.round(u):void 0,"aria-label":o??(l?`Progress`:`Loading`),children:[(0,n.jsxs)(`svg`,{width:e,height:e,viewBox:`0 0 ${e} ${e}`,"aria-hidden":`true`,children:[(0,n.jsx)(`circle`,{className:`oui-progress-circle__track`,cx:e/2,cy:e/2,r:s,fill:`none`,strokeWidth:t}),(0,n.jsx)(`circle`,{className:`oui-progress-circle__bar`,cx:e/2,cy:e/2,r:s,fill:`none`,strokeWidth:t,strokeLinecap:`round`,strokeDasharray:l?`${u/100*c} ${c}`:void 0,strokeDashoffset:l?c*.25:void 0,transform:`rotate(-90 ${e/2} ${e/2})`})]}),i?(0,n.jsx)(`span`,{className:`oui-progress-circle__message`,children:i}):null]})}function J({value:e,numberText:t,showPercent:r=!1,className:i,"aria-label":a}){let o=typeof e==`number`,s=o?Math.min(100,Math.max(0,e)):0,c=Math.round(s);return(0,n.jsxs)(`div`,{className:p(`oui-progress-linear-wrap`,i),children:[(0,n.jsx)(`div`,{className:p(`oui-progress-linear`,!o&&`is-indeterminate`),role:`progressbar`,"aria-valuemin":o?0:void 0,"aria-valuemax":o?100:void 0,"aria-valuenow":o?c:void 0,"aria-label":a??`Loading`,children:(0,n.jsx)(`div`,{className:`oui-progress-linear__bar`,style:{width:`${s}%`}})}),t||r?(0,n.jsxs)(`div`,{className:`oui-progress-linear__footer`,children:[(0,n.jsx)(`span`,{className:`oui-progress-linear__number`,children:t}),(0,n.jsx)(`span`,{className:`oui-progress-linear__percent`,children:r?`${c}%`:``})]}):null]})}function ae({variant:e=`circular`,...t}){return e===`circular`?(0,n.jsx)(q,{...t}):(0,n.jsx)(J,{value:t.value})}function oe({name:e,version:t,versionText:r,icon:i,notice:a,loading:o=!1,actions:s,children:c,className:l,style:u}){let d=f(),m=r??(t?d.versionInfo(t):null);return(0,n.jsx)(`div`,{className:p(`oui-app-info`,l),style:u,children:(0,n.jsxs)(`div`,{className:`oui-app-info__upper`,children:[i?(0,n.jsx)(`div`,{className:`oui-app-info__icon`,children:i}):null,(0,n.jsx)(`h1`,{className:`oui-app-info__name`,children:e}),m?(0,n.jsx)(`p`,{className:`oui-app-info__version`,children:m}):null,o?(0,n.jsx)(`div`,{className:`oui-app-info__progress`,children:(0,n.jsx)(q,{size:40})}):null,a?(0,n.jsx)(`p`,{className:`oui-app-info__notice`,children:a}):null,s&&s.length>0?(0,n.jsx)(`div`,{className:`oui-app-info__actions`,children:s.map((e,t)=>(0,n.jsx)(k,{variant:e.variant===`primary`?`colored`:`outline`,className:p(`oui-app-info__button`,e.variant!==`primary`&&`oui-app-info__button--default`),onClick:e.onClick,disabled:e.disabled,children:e.label},t))}):null,c?(0,n.jsx)(`div`,{className:`oui-app-info__children`,children:c}):null]})})}function se({items:e,value:r,onChange:i,variant:a=`underline`,inset:o=24,className:s,"aria-label":c}){let l=(0,t.useRef)(null);return(0,n.jsx)(`div`,{ref:l,role:`tablist`,"aria-label":c,className:p(`oui-tabs`,`oui-tabs--${a}`,s),style:{paddingInline:o},onKeyDown:t=>{if(t.key!==`ArrowLeft`&&t.key!==`ArrowRight`)return;let n=e.filter(e=>!e.disabled),a=n.findIndex(e=>e.key===r);if(a<0)return;t.preventDefault();let o=t.key===`ArrowRight`?n[(a+1)%n.length]:n[(a-1+n.length)%n.length];i?.(o.key);let s=l.current?.querySelector(`[data-key="${CSS.escape(o.key)}"]`);s?.focus(),s?.scrollIntoView({block:`nearest`,inline:`nearest`})},children:e.map(e=>{let t=e.key===r;return(0,n.jsxs)(`button`,{"data-key":e.key,type:`button`,role:`tab`,"aria-selected":t,disabled:e.disabled,className:p(`oui-tabs__tab`,t&&`is-active`),onClick:()=>i?.(e.key),children:[e.icon?(0,n.jsx)(`span`,{className:`oui-tabs__icon`,children:e.icon}):null,(0,n.jsx)(`span`,{className:`oui-tabs__label`,children:e.label}),e.badge!=null&&e.badge!==``?(0,n.jsx)(`span`,{className:`oui-tabs__badge`,children:e.badge}):null,a===`underline`?(0,n.jsx)(`span`,{className:`oui-tabs__indicator`,"aria-hidden":`true`}):null]},e.key)})})}function Y(e,t,n){return n<=t?0:(e-t)/(n-t)*100}function ce(e,t,n,r){return m(r<=0?e:t+Math.round((e-t)/r)*r,t,n)}function X({value:r,onChange:i,onCommit:a,min:o=0,max:s=100,step:c=1,disabled:l=!1,ticks:u=!1,stepper:d=!1,showValue:f=!1,units:h=``,formatValue:g,label:_,className:v,style:y}){let b=(0,t.useRef)(null),[x,S]=(0,t.useState)(null),C=Array.isArray(r),w=C?r[0]:r,T=C?r[1]:r,E=(0,t.useCallback)(e=>g?g(e):`${Math.round(e*100)/100}${h}`,[g,h]),D=(0,t.useCallback)(e=>{let t=b.current;if(!t)return o;let n=t.getBoundingClientRect();return ce(o+(n.width>0?(e-n.left)/n.width:0)*(s-o),o,s,c)},[o,s,c]),O=(0,t.useCallback)((e,t)=>{if(!C){i?.(e);return}let[n,r]=[w,T];t===0?n=Math.min(e,r):r=Math.max(e,n),i?.([n,r])},[C,w,T,i]),k=e=>{if(l||!b.current)return;e.preventDefault(),b.current.focus?.();let t=D(e.clientX),n=C&&Math.abs(t-T)<Math.abs(t-w)?1:0;S(n),O(t,n),e.currentTarget.setPointerCapture?.(e.pointerId)},A=e=>{l||x===null||O(D(e.clientX),x)},j=e=>{x!==null&&(S(null),e.currentTarget.releasePointerCapture?.(e.pointerId),a?.(r))},M=e=>{if(l)return;let t=c*10,n=null,i=+!!C,u=C?T:r;switch(e.key){case`ArrowRight`:case`ArrowUp`:n=m(u+c,o,s);break;case`ArrowLeft`:case`ArrowDown`:n=m(u-c,o,s);break;case`PageUp`:n=m(u+t,o,s);break;case`PageDown`:n=m(u-t,o,s);break;case`Home`:n=o,C&&(i=1);break;case`End`:n=s;break;default:return}e.preventDefault(),O(n,i),a?.(r)},N=u&&c>0?Math.round((s-o)/c):0,P=N>0&&N<=40,F=Y(w,o,s),I=Y(T,o,s),L=C?F:0,R=C?I:Y(r,o,s),z=e=>{let t=Y(e===0?w:T,o,s);return(0,n.jsx)(`span`,{className:p(`oui-slider__thumb`,x===e&&`is-dragging`),style:{left:`${t}%`},"aria-hidden":`true`},e)},B=C?T:r,V=(0,n.jsxs)(`div`,{ref:b,className:p(`oui-slider`,l&&`is-disabled`,C&&`is-range`),style:{"--oui-slider-fill-start":`${L}%`,"--oui-slider-fill-end":`${R}%`},role:`slider`,tabIndex:l?-1:0,"aria-label":_,"aria-valuemin":o,"aria-valuemax":s,"aria-valuenow":B,"aria-valuetext":E(B),"aria-disabled":l||void 0,"aria-orientation":`horizontal`,onPointerDown:k,onPointerMove:A,onPointerUp:j,onPointerCancel:j,onKeyDown:M,children:[(0,n.jsxs)(`div`,{className:`oui-slider__rail`,"aria-hidden":`true`,children:[(0,n.jsx)(`div`,{className:`oui-slider__fill`}),P?(0,n.jsx)(`div`,{className:`oui-slider__ticks`,children:Array.from({length:N+1},(e,t)=>(0,n.jsx)(`span`,{className:`oui-slider__tick`,style:{left:`${t/N*100}%`}},t))}):null]}),z(0),C?z(1):null,(0,n.jsx)(`input`,{className:`oui-slider__hidden-input`,type:`hidden`,name:_,value:B,readOnly:!0})]}),H=f?(0,n.jsx)(`div`,{className:`oui-slider__value`,children:E(B)}):null;return d?(0,n.jsxs)(`div`,{className:p(`oui-slider-wrap`,`oui-slider-wrap--stepper`,v),style:y,children:[(0,n.jsx)(`button`,{type:`button`,className:`oui-slider__stepper oui-slider__stepper--minus oui-press`,"aria-label":`Decrease`,disabled:l||B<=o,onClick:()=>{O(m(B-c,o,s),+!!C),a?.(r)},children:(0,n.jsx)(e.f,{})}),(0,n.jsx)(`div`,{className:`oui-slider-wrap__track`,children:V}),(0,n.jsx)(`button`,{type:`button`,className:`oui-slider__stepper oui-slider__stepper--plus oui-press`,"aria-label":`Increase`,disabled:l||B>=s,onClick:()=>{O(m(B+c,o,s),+!!C),a?.(r)},children:(0,n.jsx)(e.t,{})}),H?(0,n.jsx)(`div`,{className:`oui-slider-wrap__readout`,children:H}):null]}):(0,n.jsxs)(`div`,{className:p(`oui-slider-wrap`,v),style:y,children:[V,H]})}function Z({open:e,onClose:i,title:a,children:o,actions:s,disableDismiss:c=!1,maxWidth:l=360,className:u,"aria-label":d}){let f=(0,t.useId)();return g(e&&!c,()=>i?.()),!e||!v?null:(0,r.createPortal)((0,n.jsxs)(`div`,{className:`oui-dialog-root`,children:[(0,n.jsx)(`div`,{className:`oui-dialog__scrim`,onClick:c?void 0:i,"aria-hidden":`true`}),(0,n.jsxs)(`div`,{className:p(`oui-dialog`,u),role:`alertdialog`,"aria-modal":`true`,"aria-label":d??(a?void 0:`Dialog`),"aria-labelledby":a?f:void 0,style:{maxWidth:l},children:[a?(0,n.jsx)(`h2`,{className:`oui-dialog__title`,id:f,children:a}):null,o==null?null:(0,n.jsx)(`div`,{className:`oui-dialog__body`,children:o}),s?(0,n.jsx)(`div`,{className:`oui-dialog__actions`,children:s}):null]})]}),document.body)}function le({children:e,onClick:t,disabled:r,emphasis:i,className:a,autoFocus:o}){return(0,n.jsx)(`button`,{type:`button`,className:p(`oui-dialog__button`,i&&`is-emphasis`,a),onClick:t,disabled:r,autoFocus:o,children:e})}function ue({open:e,onClose:t,variant:r=`circle`,message:i,value:a,numberText:o,percentText:s,disableDismiss:c=!0,className:l,maxWidth:u,"aria-label":d}){let f=null;return f=r===`circle`?(0,n.jsx)(`div`,{className:`oui-progress-dialog__circle`,children:(0,n.jsx)(q,{size:56,strokeWidth:4,value:a,message:s??(typeof a==`number`?`${Math.round(a)}%`:void 0),"aria-label":typeof i==`string`?i:`Loading`})}):r===`spinner`?(0,n.jsxs)(`div`,{className:`oui-progress-dialog__spinner`,children:[(0,n.jsx)(q,{size:40,"aria-label":`Loading`}),i==null?null:(0,n.jsx)(`div`,{className:`oui-progress-dialog__message`,children:i})]}):(0,n.jsxs)(`div`,{className:`oui-progress-dialog__horizontal`,children:[i==null?null:(0,n.jsx)(`div`,{className:`oui-progress-dialog__message`,children:i}),(0,n.jsx)(`div`,{className:`oui-progress-dialog__bar-space`,children:(0,n.jsx)(J,{value:a})}),(0,n.jsxs)(`div`,{className:`oui-progress-dialog__footer`,children:[(0,n.jsx)(`span`,{children:o}),(0,n.jsx)(`span`,{children:typeof a==`number`?`${Math.round(a)}%`:``})]})]}),(0,n.jsx)(Z,{open:e,onClose:t,disableDismiss:c,maxWidth:u??(r===`circle`?300:360),className:p(`oui-progress-dialog`,`oui-progress-dialog--${r}`,l),"aria-label":d??(typeof i==`string`?i:`Loading`),children:f})}function de({open:e,onClose:t,items:r,columns:i=4,title:a,disableDismiss:o=!1,maxWidth:s,className:c,"aria-label":l}){return(0,n.jsx)(Z,{open:e,onClose:t,title:a,disableDismiss:o,maxWidth:s??400,className:p(`oui-grid-menu`,c),"aria-label":l??(typeof a==`string`?a:`Menu`),children:(0,n.jsx)(`div`,{className:`oui-grid-menu__grid`,style:{"--oui-grid-columns":i},role:`menu`,children:r.map(e=>(0,n.jsxs)(`button`,{type:`button`,role:`menuitem`,className:`oui-grid-menu__item oui-press`,disabled:e.disabled,onClick:()=>{e.onClick?.(),t?.()},children:[(0,n.jsxs)(`span`,{className:`oui-grid-menu__icon`,"aria-hidden":`true`,children:[e.icon,e.badge!=null&&e.badge!==``?(0,n.jsx)(`span`,{className:`oui-grid-menu__badge`,children:e.badge}):null]}),(0,n.jsx)(`span`,{className:`oui-grid-menu__label`,children:e.label})]},e.key))})})}function fe({title:e,links:t,onLinkClick:r,className:i}){let a=f();return(0,n.jsxs)(`section`,{className:p(`oui-related-card`,i),children:[(0,n.jsx)(`h3`,{className:`oui-related-card__title`,children:e??a.relatedDescription}),(0,n.jsx)(`div`,{className:`oui-related-card__links`,children:t.map((e,t)=>{let i=(0,n.jsx)(`span`,{className:`oui-related-card__label`,children:e.label}),a=()=>{r?.(e,t),e.onClick?.()};return e.href?(0,n.jsx)(`a`,{className:`oui-related-card__link oui-press`,href:e.href,onClick:a,children:i},e.key??`${e.label}-${t}`):(0,n.jsx)(`button`,{type:`button`,className:`oui-related-card__link oui-press`,onClick:a,children:i},e.key??`${e.label}-${t}`)})})]})}function pe({open:e,anchor:i,onClose:a,children:o,action:s,placement:c=`top`,disableDismiss:l=!1,className:u}){let d=(0,t.useRef)(null),[f,h]=(0,t.useState)(null);g(e&&!l,()=>a?.());let y=(0,t.useCallback)(()=>{let e=_(i),t=d.current;if(!e||!t)return;let n=t.getBoundingClientRect(),r=c,a=r===`top`?e.top-n.height-14:e.bottom+14;r===`top`&&e.top<n.height+28?(r=`bottom`,a=e.bottom+14):r===`bottom`&&e.bottom+n.height+28>window.innerHeight&&(r=`top`,a=e.top-n.height-14);let o=e.left+e.width/2,s=m(o-n.width/2,10,window.innerWidth-n.width-10),l=m(o-s,14,n.width-14);h({top:a,left:s,arrowX:l,place:r})},[i,c]);return(0,t.useLayoutEffect)(()=>{if(!e){h(null);return}y()},[e,y]),(0,t.useEffect)(()=>{if(!e)return;let t=()=>y();return window.addEventListener(`scroll`,t,!0),window.addEventListener(`resize`,t),()=>{window.removeEventListener(`scroll`,t,!0),window.removeEventListener(`resize`,t)}},[e,y]),(0,t.useEffect)(()=>{if(!e||l||!v)return;let t=e=>{let t=d.current;t&&!t.contains(e.target)&&a?.()};return document.addEventListener(`pointerdown`,t),()=>document.removeEventListener(`pointerdown`,t)},[e,l,a]),!e||!v?null:(0,r.createPortal)((0,n.jsxs)(`div`,{ref:d,className:p(`oui-tip`,u,f?`oui-tip--${f.place}`:void 0),role:`tooltip`,style:f?{top:f.top,left:f.left,"--oui-tip-arrow-x":`${f.arrowX}px`}:{top:-9999,left:-9999,visibility:`hidden`},children:[(0,n.jsx)(`div`,{className:`oui-tip__message`,children:o}),s?(0,n.jsx)(`button`,{type:`button`,className:`oui-tip__action oui-press`,onClick:()=>{s.onClick?.(),a?.()},children:s.label}):null,(0,n.jsx)(`span`,{className:`oui-tip__arrow`,"aria-hidden":`true`})]}),document.body)}function me({title:e,variant:t=`flat`,className:r,children:i}){return(0,n.jsxs)(`div`,{className:p(`oui-pref-group`,t===`card`&&`oui-pref-group--card`,r),children:[e!=null&&e!==``?(0,n.jsx)(`div`,{className:`oui-pref-group__subheader`,role:`presentation`,children:e}):null,(0,n.jsx)(`div`,{className:`oui-pref-group__items`,children:i})]})}function Q({icon:e,title:t,summary:r,end:i,onClick:a,disabled:o=!1,selected:s=!1,className:c,children:l}){let u=!!a&&!o;return(0,n.jsxs)(`div`,{className:p(`oui-pref`,u&&`oui-pref--interactive oui-press`,o&&`is-disabled`,s&&`is-selected`,e?`has-icon`:`no-icon`,c),role:u?`button`:void 0,tabIndex:u?0:void 0,"aria-disabled":o||void 0,onClick:u?e=>{a?.(e)}:void 0,onKeyDown:u?e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),a?.(e))}:void 0,children:[e==null?null:(0,n.jsx)(`div`,{className:`oui-pref__icon`,children:e}),(0,n.jsxs)(`div`,{className:`oui-pref__text`,children:[(0,n.jsx)(`div`,{className:`oui-pref__title`,children:t}),r!=null&&r!==``?(0,n.jsx)(`div`,{className:`oui-pref__summary`,children:r}):null,l]}),i==null?null:(0,n.jsx)(`div`,{className:`oui-pref__end`,children:i})]})}function he({checked:e,defaultChecked:t,onChange:r,disabled:i,title:a,...o}){return(0,n.jsx)(Q,{...o,title:a,disabled:i,onClick:i?void 0:()=>r?.(!e),className:[`oui-pref-switch`,o.className].filter(Boolean).join(` `),end:(0,n.jsx)(A,{checked:e,defaultChecked:t,onChange:r,disabled:i,label:typeof a==`string`?a:void 0,onClick:e=>e.stopPropagation()})})}function $({value:e,onChange:t,min:r,max:i,step:a,showValue:o=!0,units:s,formatValue:c,stepper:l=!1,ticks:u=!1,title:d,summary:f,disabled:p,className:m,...h}){return(0,n.jsx)(Q,{...h,className:[`oui-pref-slider`,m].filter(Boolean).join(` `),title:d,summary:f,disabled:p,children:(0,n.jsx)(`div`,{className:`oui-pref-slider__controls`,children:(0,n.jsx)(X,{value:e,onChange:t,min:r,max:i,step:a,disabled:p,ticks:u,stepper:l,showValue:o,units:s,formatValue:c,label:typeof d==`string`?d:void 0})})})}function ge({children:e,variant:t=`body`,className:r}){return(0,n.jsx)(`div`,{className:p(`oui-pref-description`,t===`subheader`&&`oui-pref-description--subheader`,r),children:e})}function _e({options:e,value:t,onChange:r,withImages:i=!1,label:a,className:o}){return(0,n.jsx)(`div`,{className:p(`oui-hradio`,i&&`oui-hradio--image`,o),role:`radiogroup`,"aria-label":a,children:e.map(e=>{let i=e.value===t;return(0,n.jsxs)(`button`,{type:`button`,role:`radio`,"aria-checked":i,disabled:e.disabled,className:p(`oui-hradio__item`,i&&`is-selected`),onClick:()=>r?.(e.value),children:[e.image?(0,n.jsx)(`span`,{className:`oui-hradio__image`,"aria-hidden":`true`,children:e.image}):null,(0,n.jsx)(`span`,{className:`oui-hradio__title`,children:e.label}),e.subtitle?(0,n.jsx)(`span`,{className:`oui-hradio__subtitle`,children:e.subtitle}):null,(0,n.jsx)(`span`,{className:`oui-hradio__radio`,"aria-hidden":`true`})]},e.value)})})}function ve({title:t,summary:r,children:i,actions:a,onClose:o,className:s}){return(0,n.jsxs)(`div`,{className:p(`oui-tips`,s),children:[t==null?null:(0,n.jsxs)(`div`,{className:`oui-tips__header`,children:[(0,n.jsx)(`h3`,{className:`oui-tips__title`,children:t}),o?(0,n.jsx)(`button`,{type:`button`,className:`oui-tips__close`,"aria-label":`Close`,onClick:o,children:(0,n.jsx)(e.o,{})}):null]}),r==null?null:(0,n.jsx)(`p`,{className:`oui-tips__summary`,children:r}),i?(0,n.jsx)(`div`,{className:`oui-tips__children`,children:i}):null,a&&a.length>0?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(`div`,{className:`oui-tips__spacer`}),(0,n.jsx)(`div`,{className:`oui-tips__actions`,children:a.map(e=>(0,n.jsx)(`button`,{type:`button`,className:`oui-tips__button`,onClick:e.onClick,children:e.label},e.label))})]}):(0,n.jsx)(`div`,{className:`oui-tips__spacer`})]})}var ye=[`#000000`,`#3a3a3a`,`#666666`,`#9e9e9e`,`#cfcfcf`,`#ffffff`,`#db332a`,`#ef5e16`,`#f4b400`,`#14a866`,`#0381fe`,`#3e91ff`,`#7e57c2`,`#d81b60`,`#8d6e63`,`#607d8b`];function be({value:e,onChange:t,swatches:r=ye,showAlpha:i=!1,alpha:a=1,onAlphaChange:o,title:s,summary:c,disabled:l,className:u,...d}){let f=e=>[`#ffffff`,`#cfcfcf`,`#f4b400`].includes(e.toLowerCase());return(0,n.jsx)(Q,{...d,className:p(`oui-color-picker-pref`,u),title:s,summary:c,disabled:l,children:(0,n.jsxs)(`div`,{className:`oui-color-picker`,children:[(0,n.jsx)(`div`,{className:`oui-color-picker__grid`,role:`radiogroup`,children:r.map(r=>(0,n.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":r===e,"aria-label":r,disabled:l,className:p(`oui-color-picker__swatch`,r===e&&`is-selected`,f(r)&&`is-light`),style:{"--swatch":r},onClick:()=>t?.(r)},r))}),i?(0,n.jsxs)(`div`,{className:`oui-color-picker__alpha`,children:[(0,n.jsx)(`input`,{type:`range`,min:0,max:100,value:Math.round(a*100),disabled:l,"aria-label":`Alpha`,onChange:e=>o?.(Number(e.target.value)/100)}),(0,n.jsxs)(`span`,{className:`oui-color-picker__alpha-value`,children:[Math.round(a*100),`%`]})]}):null]})})}exports.AppInfo=oe,exports.BottomNav=ne,exports.Button=k,exports.CircularProgress=q,exports.ColorPickerPreference=be,exports.DescriptionPreference=ge,exports.Dialog=Z,exports.DialogButton=le,exports.Drawer=re,exports.GridMenuDialog=de,exports.HorizontalRadioPreference=_e,exports.IconAdd=e.t,exports.IconAppInfo=e.n,exports.IconBack=e.r,exports.IconCheck=e.a,exports.IconClose=e.o,exports.IconFolder=e.s,exports.IconHome=e.c,exports.IconMenu=e.l,exports.IconMore=e.u,exports.IconPerson=e.d,exports.IconRemove=e.f,exports.IconSearch=e.p,exports.IconSettings=e.m,exports.LinearProgress=J,exports.OneUIProvider=l,exports.Page=te,exports.Preference=Q,exports.PreferenceGroup=me,exports.ProgressBar=ae,exports.ProgressDialog=ue,exports.ROUND_ALL=w,exports.ROUND_BOTTOM=E,exports.ROUND_BOTTOM_LEFT=S,exports.ROUND_BOTTOM_RIGHT=C,exports.ROUND_NONE=y,exports.ROUND_TOP=T,exports.ROUND_TOP_LEFT=b,exports.ROUND_TOP_RIGHT=x,exports.RelatedCard=fe,exports.RoundBox=O,exports.Separator=N,exports.Slider=X,exports.SliderPreference=$,exports.Splash=ie,exports.Switch=A,exports.SwitchBar=j,exports.SwitchBarAction=M,exports.SwitchPreference=he,exports.Tabs=se,exports.TipPopup=pe,exports.TipsCard=ve,exports.Toast=ee,exports.clamp=m,exports.clearToasts=G,exports.cx=p,exports.defaultStrings=a,exports.dismissToast=W,exports.mergeStrings=o,exports.toast=U,exports.useOneUI=u,exports.useStrings=f,exports.useTheme=d;
2
+ //# sourceMappingURL=oneui-react.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneui-react.cjs","names":[],"sources":["../src/strings.ts","../src/theme.tsx","../src/utils.ts","../src/components/RoundBox.tsx","../src/components/Button.tsx","../src/components/Switch.tsx","../src/components/SwitchBar.tsx","../src/components/Separator.tsx","../src/components/Toast.tsx","../src/components/Page.tsx","../src/components/BottomNav.tsx","../src/components/Drawer.tsx","../src/components/Splash.tsx","../src/components/ProgressBar.tsx","../src/components/AppInfo.tsx","../src/components/Tabs.tsx","../src/components/Slider.tsx","../src/components/Dialog.tsx","../src/components/ProgressDialog.tsx","../src/components/GridMenuDialog.tsx","../src/components/RelatedCard.tsx","../src/components/TipPopup.tsx","../src/components/PreferenceGroup.tsx","../src/components/Preference.tsx","../src/components/SwitchPreference.tsx","../src/components/SliderPreference.tsx","../src/components/DescriptionPreference.tsx","../src/components/HorizontalRadioPreference.tsx","../src/components/TipsCard.tsx","../src/components/ColorPickerPreference.tsx"],"sourcesContent":["/**\n * English strings, ported from\n * `lib/src/main/res/values/strings.xml` of OneUIProject/oneui-design.\n * Override any subset of them through `<OneUIProvider strings={…}>`.\n */\n\nexport type NumberFormat = (count: number) => string;\n\nexport interface OneUIStrings {\n /** RelatedCard default title — `oui_relative_description` */\n relatedDescription: string;\n /** \"N\" badge text — `oui_new_badge_text` */\n newBadge: string;\n /** Drawer content description — `oui_navigation_drawer` */\n navigationDrawer: string;\n /** Action mode */\n actionModeAll: string;\n actionModeSelected: NumberFormat;\n actionModeSelectItems: string;\n /** App info */\n appInfo: string;\n versionInfo: (version: string) => string;\n update: string;\n retry: string;\n newVersionIsAvailable: string;\n latestVersion: string;\n /** Start/End time picker */\n timeStart: string;\n timeEnd: string;\n /** Common dialog buttons */\n add: string;\n apply: string;\n yes: string;\n cancel: string;\n continue: string;\n disable: string;\n done: string;\n edit: string;\n close: string;\n /** TipPopup default hint — `sem_tip_popup_hint_string` */\n tipHint: string;\n}\n\nexport const defaultStrings: OneUIStrings = {\n relatedDescription: 'Looking for something else?',\n newBadge: 'N',\n navigationDrawer: 'Navigation drawer',\n actionModeAll: 'All',\n actionModeSelected: (count: number) => `${count} selected`,\n actionModeSelectItems: 'Select items',\n appInfo: 'App info',\n versionInfo: (version: string) => `Version ${version}`,\n update: 'Update',\n retry: 'Retry',\n newVersionIsAvailable: 'A new version is available.',\n latestVersion: 'The latest version is already installed.',\n timeStart: 'Start',\n timeEnd: 'End',\n add: 'Add',\n apply: 'Apply',\n yes: 'Yes',\n cancel: 'Cancel',\n continue: 'Continue',\n disable: 'Disable',\n done: 'Done',\n edit: 'Edit',\n close: 'Close',\n tipHint: 'Double tap this button to learn more.',\n};\n\nexport type PartialStrings = Partial<OneUIStrings>;\n\nexport function mergeStrings(\n partial: PartialStrings | undefined\n): OneUIStrings {\n return partial ? { ...defaultStrings, ...partial } : defaultStrings;\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport { mergeStrings, type OneUIStrings, type PartialStrings } from './strings';\n\nexport type Theme = 'light' | 'dark' | 'system';\n\nexport interface OneUIProviderProps {\n /** Color theme. `system` follows `prefers-color-scheme`. Default: `system`. */\n theme?: Theme;\n /** Called when the resolved theme changes. */\n onThemeChange?: (theme: Theme) => void;\n /** Override any subset of the built-in English strings. */\n strings?: PartialStrings;\n /**\n * Accent color. Sets `--oui-primary`; the pressed/dark accent is derived\n * automatically (or pass `{ primary, dark }`).\n */\n accent?: string | { primary: string; dark?: string };\n /** Override the main content corner radius (px). */\n radius?: number;\n /**\n * Where to apply the `data-oneui-theme` attribute.\n * `document` (default) also updates `<html>` so portaled dialogs/toasts inherit it.\n */\n scope?: 'document' | 'element';\n className?: string;\n style?: CSSProperties;\n children: ReactNode;\n}\n\nexport interface OneUIContextValue {\n /** Currently resolved theme (`light` | `dark`, never `system`). */\n theme: 'light' | 'dark';\n /** The requested theme preference. */\n preference: Theme;\n setTheme: (theme: Theme) => void;\n strings: OneUIStrings;\n}\n\nconst OneUIContext = createContext<OneUIContextValue | null>(null);\n\nfunction resolveTheme(preference: Theme): 'light' | 'dark' {\n if (preference !== 'system') return preference;\n if (typeof window === 'undefined' || !window.matchMedia) return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n}\n\nexport function OneUIProvider({\n theme = 'system',\n onThemeChange,\n strings,\n accent,\n radius,\n scope = 'document',\n className,\n style,\n children,\n}: OneUIProviderProps) {\n const preference = theme;\n\n const setTheme = (next: Theme) => onThemeChange?.(next);\n\n // Track the OS preference while in `system` mode.\n useEffect(() => {\n if (preference !== 'system') return;\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const media = window.matchMedia('(prefers-color-scheme: dark)');\n const onChange = () => onThemeChange?.('system'); // re-render to re-resolve\n media.addEventListener('change', onChange);\n return () => media.removeEventListener('change', onChange);\n }, [preference, onThemeChange]);\n\n const resolved = resolveTheme(preference);\n\n // Mirror the theme attribute onto <html> for portals.\n useEffect(() => {\n if (scope !== 'document' || typeof document === 'undefined') return;\n const root = document.documentElement;\n root.setAttribute('data-oneui-theme', resolved);\n return () => {\n if (root.getAttribute('data-oneui-theme') === resolved) {\n root.removeAttribute('data-oneui-theme');\n }\n };\n }, [resolved, scope]);\n\n const accentVars = useMemo<CSSProperties | undefined>(() => {\n if (!accent) return radius === undefined ? undefined : {};\n const primary = typeof accent === 'string' ? accent : accent.primary;\n const dark =\n typeof accent === 'string'\n ? `color-mix(in srgb, ${primary}, #000 20%)`\n : accent.dark ?? primary;\n return {\n ...({ '--oui-primary': primary, '--oui-primary-dark': dark } as CSSProperties),\n };\n }, [accent]);\n\n const styleWithRadius: CSSProperties | undefined =\n radius !== undefined\n ? ({ '--oui-radius-page': `${radius}px`, ...style } as CSSProperties)\n : style;\n\n const finalStyle = accentVars\n ? ({ ...accentVars, ...styleWithRadius } as CSSProperties)\n : styleWithRadius;\n\n const value = useMemo<OneUIContextValue>(\n () => ({\n theme: resolved,\n preference,\n setTheme,\n strings: mergeStrings(strings),\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [resolved, preference, strings]\n );\n\n return (\n <OneUIContext.Provider value={value}>\n <div\n className={className}\n data-oneui-theme={scope === 'element' ? resolved : undefined}\n data-oneui-root=\"\"\n style={finalStyle}\n >\n {children}\n </div>\n </OneUIContext.Provider>\n );\n}\n\n/** Access the active theme + localized strings. */\nexport function useOneUI(): OneUIContextValue {\n const ctx = useContext(OneUIContext);\n if (ctx) return ctx;\n // Standalone usage without a provider still gets sane defaults.\n return {\n theme: resolveTheme('system'),\n preference: 'system',\n setTheme: () => {},\n strings: mergeStrings(undefined),\n };\n}\n\nexport function useTheme() {\n const { theme, preference, setTheme } = useOneUI();\n return { theme, preference, setTheme };\n}\n\nexport function useStrings(): OneUIStrings {\n return useOneUI().strings;\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type MutableRefObject,\n type Ref,\n type RefObject,\n} from 'react';\n\n/** Join class names, skipping falsy values. */\nexport function cx(\n ...names: Array<string | false | null | undefined>\n): string {\n return names.filter(Boolean).join(' ');\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== 'undefined' ? useLayoutEffect : useEffect;\n\n/** Controlled / uncontrolled state helper. */\nexport function useControllableState<T>(\n controlled: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void\n): [T, (value: T) => void] {\n const isControlled = controlled !== undefined;\n const [internal, setInternal] = useState<T>(defaultValue);\n const value = isControlled ? controlled : internal;\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) setInternal(next);\n onChangeRef.current?.(next);\n },\n [isControlled]\n );\n\n return [value, setValue];\n}\n\n/** Call `handler` while `active` is true whenever Escape is pressed. */\nexport function useEscapeKey(active: boolean, handler: () => void): void {\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n if (!active || typeof window === 'undefined') return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') handlerRef.current();\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [active]);\n}\n\n/** Assign multiple refs to the same node. */\nexport function mergeRefs<T>(\n ...refs: Array<Ref<T> | undefined>\n): (node: T | null) => void {\n return (node) => {\n for (const ref of refs) {\n if (!ref) continue;\n if (typeof ref === 'function') ref(node);\n else (ref as MutableRefObject<T | null>).current = node;\n }\n };\n}\n\nexport type AnchorLike =\n | HTMLElement\n | RefObject<HTMLElement | null>\n | { current: HTMLElement | null }\n | (() => DOMRect | null)\n | DOMRect\n | null\n | undefined;\n\n/** Resolve an anchor reference into a viewport rect. */\nexport function getAnchorRect(anchor: AnchorLike): DOMRect | null {\n if (!anchor) return null;\n if (typeof anchor === 'function') return anchor();\n if (typeof HTMLElement !== 'undefined' && anchor instanceof HTMLElement)\n return anchor.getBoundingClientRect();\n if (typeof DOMRect !== 'undefined' && anchor instanceof DOMRect) return anchor;\n const el = (anchor as RefObject<HTMLElement | null>).current;\n return el ? el.getBoundingClientRect() : null;\n}\n\n/** True when the DOM is available (guards portals during SSR). */\nexport const canUseDOM =\n typeof window !== 'undefined' && typeof document !== 'undefined';\n","import { cx } from '../utils';\nimport './RoundBox.css';\n\n/** Corner bit flags, matching `roundedCorners` in attrs.xml. */\nexport const ROUND_NONE = 0x00;\nexport const ROUND_TOP_LEFT = 0x01;\nexport const ROUND_TOP_RIGHT = 0x02;\nexport const ROUND_BOTTOM_LEFT = 0x04;\nexport const ROUND_BOTTOM_RIGHT = 0x08;\nexport const ROUND_ALL = 0x0f;\nexport const ROUND_TOP = ROUND_TOP_LEFT | ROUND_TOP_RIGHT;\nexport const ROUND_BOTTOM = ROUND_BOTTOM_LEFT | ROUND_BOTTOM_RIGHT;\n\nexport type CornerFlags =\n | 'all'\n | 'none'\n | 'top'\n | 'bottom'\n | 'topLeft'\n | 'topRight'\n | 'bottomLeft'\n | 'bottomRight';\n\nexport interface RoundBoxProps\n extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Rounded corners as an Android-style bit mask\n * (`ROUND_ALL`, `ROUND_TOP`, …) or a friendly alias.\n * @default ROUND_ALL\n */\n roundedCorners?: number | CornerFlags;\n /** Corner radius in px (defaults to `--oui-radius-xl` = 26px). */\n radius?: number;\n /** Fill color; defaults to `--oui-bg` (the `roundedCornerColor` analogue). */\n color?: string;\n as?: 'div' | 'section' | 'aside' | 'main' | 'header' | 'footer' | 'article';\n children?: React.ReactNode;\n}\n\nfunction flagsOf(value: number | CornerFlags): number {\n if (typeof value === 'number') return value;\n switch (value) {\n case 'all':\n return ROUND_ALL;\n case 'none':\n return ROUND_NONE;\n case 'top':\n return ROUND_TOP;\n case 'bottom':\n return ROUND_BOTTOM;\n case 'topLeft':\n return ROUND_TOP_LEFT;\n case 'topRight':\n return ROUND_TOP_RIGHT;\n case 'bottomLeft':\n return ROUND_BOTTOM_LEFT;\n case 'bottomRight':\n return ROUND_BOTTOM_RIGHT;\n }\n}\n\n/**\n * Container with selective rounded corners — the web equivalent of\n * `RoundFrameLayout` / `RoundLinearLayout`.\n */\nexport function RoundBox({\n roundedCorners = ROUND_ALL,\n radius,\n color,\n as: Tag = 'div',\n className,\n style,\n children,\n ...props\n}: RoundBoxProps) {\n const flags = flagsOf(roundedCorners);\n const r = radius != null ? `${radius}px` : 'var(--oui-radius-xl)';\n const tl = flags & ROUND_TOP_LEFT ? r : '0';\n const tr = flags & ROUND_TOP_RIGHT ? r : '0';\n const bl = flags & ROUND_BOTTOM_LEFT ? r : '0';\n const br = flags & ROUND_BOTTOM_RIGHT ? r : '0';\n\n return (\n <Tag\n className={cx('oui-round', className)}\n style={{\n borderRadius: `${tl} ${tr} ${br} ${bl}`,\n ...(color != null ? { background: color } : null),\n ...style,\n }}\n {...props}\n >\n {children}\n </Tag>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../utils';\nimport './Button.css';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n /**\n * `colored` — filled accent button (`OneUI.ButtonStyleColored`)\n * `outline` — hairline outline button (`OneUI.ButtonStyleOutline`)\n * `transparent` — borderless text button (`OneUI.ButtonStyleTransparent`)\n * @default 'colored'\n */\n variant?: 'colored' | 'outline' | 'transparent';\n /** Stretch to the container width. */\n fullWidth?: boolean;\n children?: ReactNode;\n}\n\nexport function Button({\n variant = 'colored',\n fullWidth = false,\n className,\n children,\n type = 'button',\n ...props\n}: ButtonProps) {\n return (\n <button\n type={type}\n className={cx(\n 'oui-btn',\n `oui-btn--${variant}`,\n fullWidth && 'oui-btn--full',\n 'oui-press',\n className\n )}\n {...props}\n >\n <span className=\"oui-btn__label\">{children}</span>\n </button>\n );\n}\n","import { forwardRef, type ButtonHTMLAttributes } from 'react';\nimport { cx, useControllableState } from '../utils';\nimport './Switch.css';\n\nexport interface SwitchProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange' | 'value'> {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n /** Accessible label (falls back to the button's aria-label). */\n label?: string;\n}\n\n/**\n * One UI switch — ported from `SeslSwitch`\n * (sesl_switch_track/thumb colors from oneui-core).\n */\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n function Switch(\n {\n checked,\n defaultChecked = false,\n onChange,\n label,\n className,\n disabled,\n type = 'button',\n ...props\n },\n ref\n ) {\n const [isChecked, setChecked] = useControllableState(\n checked,\n defaultChecked,\n onChange\n );\n\n return (\n <button\n ref={ref}\n type={type}\n role=\"switch\"\n aria-checked={isChecked}\n aria-label={label}\n disabled={disabled}\n className={cx('oui-switch', className)}\n onClick={() => setChecked(!isChecked)}\n {...props}\n >\n <span className=\"oui-switch__track\" aria-hidden=\"true\">\n <span className=\"oui-switch__thumb\" />\n </span>\n </button>\n );\n }\n);\n","import type { ReactNode } from 'react';\nimport { cx } from '../utils';\nimport { RoundBox, ROUND_TOP } from './RoundBox';\nimport { Switch } from './Switch';\nimport { IconClose } from '../icons';\nimport './SwitchBar.css';\n\nexport interface SwitchBarProps {\n /** Whether the switch is on. */\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n /** Bar label. */\n label?: string;\n /** Show a small spinner next to the label while an operation is running. */\n loading?: boolean;\n /**\n * Render the page content under the bar inside a top-rounded container\n * (the `SwitchBarLayout` behaviour). Set `false` when embedding\n * the bar standalone.\n * @default true\n */\n wrapContent?: boolean;\n className?: string;\n contentClassName?: string;\n children?: ReactNode;\n}\n\n/**\n * Switch bar + rounded content area — port of `SwitchBarLayout`\n * (sesl_switchbar_height = 64dp, 20dp margin, top-rounded container).\n */\nexport function SwitchBar({\n checked,\n defaultChecked,\n onChange,\n label,\n loading = false,\n wrapContent = true,\n className,\n contentClassName,\n children,\n}: SwitchBarProps) {\n const body = (\n <>\n <div className={cx('oui-switchbar', className)} data-on={checked}>\n <span className=\"oui-switchbar__label\">{label}</span>\n {loading ? (\n <span className=\"oui-switchbar__spinner\" aria-hidden=\"true\" />\n ) : null}\n <Switch\n checked={checked}\n defaultChecked={defaultChecked}\n onChange={onChange}\n label={label}\n />\n </div>\n {wrapContent ? (\n <RoundBox\n roundedCorners={ROUND_TOP}\n className={cx('oui-switchbar__content', contentClassName)}\n >\n {children}\n </RoundBox>\n ) : (\n children\n )}\n </>\n );\n\n return <div className=\"oui-switchbar-layout\">{body}</div>;\n}\n\nexport interface SwitchBarActionProps {\n label?: string;\n onClick?: () => void;\n className?: string;\n}\n\n/** Convenience right-aligned text action shown inside the switch bar. */\nexport function SwitchBarAction({\n label,\n onClick,\n className,\n}: SwitchBarActionProps) {\n return (\n <button\n type=\"button\"\n className={cx('oui-switchbar__action', 'oui-press', className)}\n onClick={onClick}\n >\n {label}\n </button>\n );\n}\n\n/** Close icon re-export for switch-bar toolbars. */\nexport const SwitchBarCloseIcon = IconClose;\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../utils';\nimport './Separator.css';\n\nexport interface SeparatorProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * With text: renders a bold list-separator label\n * (`Widget.AppCompat.Light.TextView.ListSeparator`, 13sp bold,\n * `sesl_list_subheader_text_color`).\n * Without text: renders a hairline divider.\n */\n children?: ReactNode;\n}\n\nexport function Separator({\n children,\n className,\n ...props\n}: SeparatorProps) {\n const hasText = children != null && children !== '';\n return (\n <div\n role={hasText ? undefined : 'separator'}\n className={cx(\n 'oui-separator',\n hasText ? 'oui-separator--label' : 'oui-separator--line',\n className\n )}\n {...props}\n >\n {hasText ? <span className=\"oui-separator__text\">{children}</span> : null}\n </div>\n );\n}\n","import {\n useEffect,\n useState,\n useSyncExternalStore,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { canUseDOM, cx } from '../utils';\nimport './Toast.css';\n\nexport interface ToastOptions {\n /** Milliseconds before auto-dismiss. `0` keeps it until `dismissToast`. @default 2200 */\n duration?: number;\n /** @default 'bottom' */\n position?: 'bottom' | 'top' | 'center';\n}\n\ninterface ToastItem {\n id: number;\n message: ReactNode;\n position: NonNullable<ToastOptions['position']>;\n}\n\n/* ------------------------------------------------------------------ */\n/* Tiny module-level store + imperative API */\n/* ------------------------------------------------------------------ */\n\nlet seq = 0;\nlet toasts: ToastItem[] = [];\nconst listeners = new Set<() => void>();\nlet root: Root | null = null;\nlet host: HTMLElement | null = null;\n\nfunction emit() {\n for (const listener of listeners) listener();\n}\n\nfunction subscribe(listener: () => void) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nfunction getSnapshot() {\n return toasts;\n}\n\nfunction mountHost() {\n if (!canUseDOM) return;\n if (!host || !document.body.contains(host)) {\n host = document.createElement('div');\n host.className = 'oui-toast-host';\n document.body.appendChild(host);\n root = createRoot(host);\n root.render(<ToastViewport />);\n }\n}\n\n/**\n * Show a One UI toast (`Toast.makeText` analogue — translucent dark pill,\n * 22dp radius, 16sp text).\n *\n * ```ts\n * toast('Saved');\n * toast('Copied to clipboard', { duration: 1000 });\n * ```\n */\nexport function toast(message: ReactNode, options: ToastOptions = {}): number {\n if (!canUseDOM) return -1;\n const id = ++seq;\n const position = options.position ?? 'bottom';\n mountHost();\n toasts = [...toasts, { id, message, position }];\n emit();\n\n const duration = options.duration ?? 2200;\n if (duration > 0) {\n window.setTimeout(() => dismissToast(id), duration);\n }\n return id;\n}\n\nexport function dismissToast(id: number): void {\n toasts = toasts.filter((item) => item.id !== id);\n emit();\n}\n\nexport function clearToasts(): void {\n toasts = [];\n emit();\n}\n\n/* ------------------------------------------------------------------ */\n/* Viewport (mounted automatically by `toast()`) */\n/* ------------------------------------------------------------------ */\n\nfunction ToastViewport() {\n const items = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n const positions = ['bottom', 'top', 'center'] as const;\n\n return (\n <>\n {positions.map((position) => {\n const bucket = items.filter((item) => item.position === position);\n if (bucket.length === 0) return null;\n return (\n <div\n key={position}\n className={cx('oui-toast-viewport', `oui-toast-viewport--${position}`)}\n aria-live=\"polite\"\n >\n {bucket.map((item) => (\n <div key={item.id} className=\"oui-toast\" role=\"status\">\n <span className=\"oui-toast__text\">{item.message}</span>\n </div>\n ))}\n </div>\n );\n })}\n </>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Declarative toast */\n/* ------------------------------------------------------------------ */\n\nexport interface ToastProps extends ToastOptions {\n open: boolean;\n onClose?: () => void;\n children?: ReactNode;\n}\n\n/** Declarative alternative to `toast()`. */\nexport function Toast({\n open,\n onClose,\n duration = 2200,\n position = 'bottom',\n children,\n}: ToastProps) {\n const [visible, setVisible] = useState(open);\n\n useEffect(() => setVisible(open), [open]);\n\n useEffect(() => {\n if (!open || duration <= 0) return;\n const timer = window.setTimeout(() => {\n setVisible(false);\n onClose?.();\n }, duration);\n return () => window.clearTimeout(timer);\n }, [open, duration, onClose]);\n\n if (!visible || !canUseDOM) return null;\n\n return createPortal(\n <div\n className={cx('oui-toast-viewport', `oui-toast-viewport--${position}`)}\n aria-live=\"polite\"\n >\n <div className=\"oui-toast\" role=\"status\">\n <span className=\"oui-toast__text\">{children}</span>\n </div>\n </div>,\n document.body\n );\n}\n","import {\n useCallback,\n useEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport { clamp, cx } from '../utils';\nimport { useStrings } from '../theme';\nimport { IconBack, IconClose, IconMenu, IconSearch } from '../icons';\nimport './Page.css';\n\nexport interface PageActionMode {\n /** Number of selected items. */\n count: number;\n /** Close (cancel) the action mode. */\n onClose: () => void;\n /** Show the \"All\" checkbox. @default true */\n showAll?: boolean;\n allChecked?: boolean;\n onToggleAll?: (checked: boolean) => void;\n /** Extra toolbar items rendered on the right. */\n actions?: ReactNode;\n}\n\nexport interface PageProps {\n /** Toolbar (collapsed) title. */\n title: string;\n /** Large header title. Defaults to `title`. */\n expandedTitle?: string;\n subtitle?: string;\n expandedSubtitle?: string;\n\n /**\n * Navigation icon behaviour (left side of the toolbar).\n * Provide `onNavClick` alone for the default hamburger icon,\n * or pass a custom `navIcon`.\n */\n onNavClick?: () => void;\n navIcon?: ReactNode;\n navLabel?: string;\n /** \"N\" badge over the navigation icon (`setNavigationButtonBadge`). */\n navBadge?: number | string;\n /** Render the nav icon as a back arrow. */\n navAsBack?: boolean;\n\n /** Right-hand toolbar actions (48×48 icon buttons). */\n actions?: ReactNode;\n\n /** Collapse the big header on scroll. @default true */\n expandable?: boolean;\n /** Initial (uncontrolled) expansion state. @default true */\n expanded?: boolean;\n /** Called whenever the expansion state changes. */\n onExpandedChange?: (expanded: boolean) => void;\n\n /** Search mode replaces the toolbar content (`showSearchMode`). */\n searchMode?: boolean;\n searchQuery?: string;\n searchPlaceholder?: string;\n onSearchQueryChange?: (query: string) => void;\n onSearchClose?: () => void;\n /** Extra node rendered inside the search bar (e.g. a voice button). */\n searchTrailing?: ReactNode;\n\n /** Selection toolbar (`showActionMode`). */\n actionMode?: PageActionMode | null;\n\n /** Background of the header/toolbar area. Defaults to `--oui-bg`. */\n headerBackground?: string;\n\n /** Sticky footer, e.g. `<BottomNav …/>` (`toolbarlayout_footer`). */\n footer?: ReactNode;\n\n className?: string;\n style?: CSSProperties;\n children?: ReactNode;\n}\n\n/**\n * `ToolbarLayout` port — One UI collapsing header with a pinned toolbar,\n * big expanding title, search mode, action (selection) mode, rounded content\n * surface and footer slot.\n */\nexport function Page({\n title,\n expandedTitle,\n subtitle,\n expandedSubtitle,\n onNavClick,\n navIcon,\n navLabel,\n navBadge,\n navAsBack = false,\n actions,\n expandable = true,\n expanded = true,\n onExpandedChange,\n searchMode = false,\n searchQuery = '',\n searchPlaceholder = 'Search',\n onSearchQueryChange,\n onSearchClose,\n searchTrailing,\n actionMode = null,\n headerBackground,\n footer,\n className,\n style,\n children,\n}: PageProps) {\n const strings = useStrings();\n const scrollerRef = useRef<HTMLDivElement>(null);\n const titleBlockRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const [progress, setProgress] = useState(expanded ? 0 : 1);\n\n const collapseRange = useCallback(() => {\n const el = titleBlockRef.current;\n return Math.max(el?.offsetHeight ?? 0, 1);\n }, []);\n\n const handleScroll = useCallback(() => {\n if (!expandable) return;\n const el = scrollerRef.current;\n if (!el) return;\n const p = clamp(el.scrollTop / collapseRange(), 0, 1);\n setProgress(p);\n onExpandedChange?.(p < 0.5);\n }, [expandable, collapseRange, onExpandedChange]);\n\n // Apply the initial `expanded` state (without animation).\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n const target = expanded || !expandable ? 0 : collapseRange();\n if (Math.abs(el.scrollTop - target) > 1) {\n el.scrollTop = target;\n setProgress(expanded || !expandable ? 0 : 1);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Imperatively expand/collapse when `expanded` changes.\n const prevExpanded = useRef(expanded);\n useEffect(() => {\n if (prevExpanded.current === expanded) return;\n prevExpanded.current = expanded;\n const el = scrollerRef.current;\n if (!el || !expandable) return;\n const target = expanded ? 0 : collapseRange();\n el.scrollTo({ top: target, behavior: 'smooth' });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [expanded, expandable]);\n\n // Autofocus the search field when entering search mode.\n useEffect(() => {\n if (searchMode) inputRef.current?.focus();\n }, [searchMode]);\n\n const collapsedOpacity = clamp((progress - 0.55) / 0.35, 0, 1);\n const isCollapsed = progress > 0.6 || !expandable || searchMode || !!actionMode;\n\n const bigTitle = expandedTitle ?? title;\n const bigSubtitle = expandedSubtitle ?? subtitle;\n const showTitleBlock = expandable && !searchMode && !actionMode;\n\n const navButton =\n onNavClick || navIcon ? (\n <button\n type=\"button\"\n className=\"oui-page__nav oui-press\"\n aria-label={navLabel ?? strings.navigationDrawer}\n onClick={onNavClick}\n >\n {navIcon ?? (navAsBack ? <IconBack /> : <IconMenu />)}\n {navBadge != null && navBadge !== 0 && navBadge !== '' ? (\n <span className=\"oui-page__nav-badge\">\n {typeof navBadge === 'number' && navBadge > 99\n ? '99+'\n : navBadge}\n </span>\n ) : null}\n </button>\n ) : (\n <span className=\"oui-page__nav-spacer\" aria-hidden=\"true\" />\n );\n\n let toolbarContent: ReactNode;\n\n if (actionMode) {\n toolbarContent = (\n <div className=\"oui-page__action-mode\" role=\"toolbar\">\n <button\n type=\"button\"\n className=\"oui-page__nav oui-press\"\n aria-label={strings.close}\n onClick={actionMode.onClose}\n >\n <IconClose />\n </button>\n <span className=\"oui-page__action-count\">\n {actionMode.count > 0\n ? strings.actionModeSelected(actionMode.count)\n : strings.actionModeSelectItems}\n </span>\n <span className=\"oui-page__toolbar-spacer\" />\n {actionMode.showAll !== false && actionMode.onToggleAll ? (\n <label className=\"oui-page__action-all\">\n <input\n type=\"checkbox\"\n checked={!!actionMode.allChecked}\n onChange={(e) => actionMode.onToggleAll?.(e.target.checked)}\n />\n {strings.actionModeAll}\n </label>\n ) : null}\n {actionMode.actions}\n </div>\n );\n } else if (searchMode) {\n toolbarContent = (\n <div className=\"oui-page__search\" role=\"search\">\n <button\n type=\"button\"\n className=\"oui-page__nav oui-press\"\n aria-label={strings.close}\n onClick={onSearchClose}\n >\n <IconBack />\n </button>\n <input\n ref={inputRef}\n className=\"oui-page__search-input\"\n type=\"search\"\n value={searchQuery}\n placeholder={searchPlaceholder}\n aria-label={searchPlaceholder}\n onChange={(e) => onSearchQueryChange?.(e.target.value)}\n />\n {searchTrailing ?? (\n <span className=\"oui-page__search-icon\" aria-hidden=\"true\">\n <IconSearch size={20} />\n </span>\n )}\n </div>\n );\n } else {\n toolbarContent = (\n <>\n {navButton}\n <span\n className=\"oui-page__collapsed-title\"\n style={{ opacity: expandable ? collapsedOpacity : 1 }}\n aria-hidden={expandable ? collapsedOpacity < 0.5 : false}\n >\n {title}\n </span>\n <span className=\"oui-page__toolbar-spacer\" />\n {actions ? (\n <div className=\"oui-page__actions\">{actions}</div>\n ) : null}\n </>\n );\n }\n\n return (\n <div\n className={cx('oui-page', className)}\n data-collapsed={isCollapsed || undefined}\n style={\n headerBackground\n ? ({ '--oui-header-bg': headerBackground } as CSSProperties)\n : undefined\n }\n >\n <div\n ref={scrollerRef}\n className=\"oui-page__scroll\"\n onScroll={handleScroll}\n >\n <div className=\"oui-page__toolbar\" role=\"toolbar\" aria-label={title}>\n {toolbarContent}\n </div>\n\n {showTitleBlock ? (\n <div ref={titleBlockRef} className=\"oui-page__title-block\">\n <h1 className=\"oui-page__expanded-title\">{bigTitle}</h1>\n {bigSubtitle ? (\n <p className=\"oui-page__expanded-subtitle\">{bigSubtitle}</p>\n ) : null}\n </div>\n ) : null}\n\n <main className=\"oui-page__surface\" style={style}>\n {children}\n </main>\n </div>\n\n {footer ? <div className=\"oui-page__footer\">{footer}</div> : null}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../utils';\nimport './BottomNav.css';\n\nexport interface BottomNavItem {\n key: string;\n label: string;\n icon: ReactNode;\n /** Small count/\"N\" badge on the icon. */\n badge?: number | string;\n disabled?: boolean;\n}\n\nexport interface BottomNavProps {\n items: BottomNavItem[];\n value: string;\n onChange?: (key: string) => void;\n /** `fixed` shows all labels, `shifting` only the active one (Material). */\n variant?: 'fixed' | 'shifting';\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * Footer bottom navigation (`BottomNavigationView` in\n * `oui_layout_toolbar_layout_footer.xml`).\n */\nexport function BottomNav({\n items,\n value,\n onChange,\n variant = 'fixed',\n className,\n 'aria-label': ariaLabel,\n}: BottomNavProps) {\n return (\n <nav\n className={cx('oui-bottom-nav', `oui-bottom-nav--${variant}`, className)}\n aria-label={ariaLabel}\n >\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n type=\"button\"\n className={cx('oui-bottom-nav__item', active && 'is-active')}\n aria-current={active ? 'page' : undefined}\n disabled={item.disabled}\n onClick={() => onChange?.(item.key)}\n >\n <span className=\"oui-bottom-nav__icon\" aria-hidden=\"true\">\n {item.icon}\n {item.badge != null && item.badge !== 0 && item.badge !== '' ? (\n <span className=\"oui-bottom-nav__badge\">\n {typeof item.badge === 'number' && item.badge > 9\n ? '9+'\n : item.badge}\n </span>\n ) : null}\n </span>\n <span className=\"oui-bottom-nav__label\">{item.label}</span>\n </button>\n );\n })}\n </nav>\n );\n}\n","import { useEffect, useRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { canUseDOM, cx, useEscapeKey } from '../utils';\nimport { useStrings } from '../theme';\nimport './Drawer.css';\n\nexport interface DrawerProps {\n open: boolean;\n onClose?: () => void;\n /** Panel content. */\n children?: ReactNode;\n /** Optional header rendered above the drawer content. */\n header?: ReactNode;\n /** @default 320 */\n width?: number;\n /** Custom scrim color (defaults to `--oui-drawer-dim`). */\n dimColor?: string;\n /** Hide the scrim / disable outside-click closing. */\n disableScrim?: boolean;\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * Navigation drawer — port of `DrawerLayout`\n * (top margin 16dp, `oui_background_color` panel, dimmed scrim).\n */\nexport function Drawer({\n open,\n onClose,\n children,\n header,\n width = 320,\n dimColor,\n disableScrim = false,\n className,\n 'aria-label': ariaLabel,\n}: DrawerProps) {\n const strings = useStrings();\n const panelRef = useRef<HTMLDivElement>(null);\n const prevOpen = useRef(open);\n\n useEscapeKey(open, () => onClose?.());\n\n // Move focus into the drawer when opened.\n useEffect(() => {\n if (open && !prevOpen.current) {\n panelRef.current?.focus();\n }\n prevOpen.current = open;\n }, [open]);\n\n if (!canUseDOM) return null;\n\n return createPortal(\n <div className={cx('oui-drawer-root', open && 'is-open')} aria-hidden={!open}>\n <div\n className=\"oui-drawer__scrim\"\n style={dimColor ? { background: dimColor } : undefined}\n onClick={disableScrim ? undefined : onClose}\n aria-hidden=\"true\"\n />\n <div\n ref={panelRef}\n className={cx('oui-drawer', className)}\n style={{ width: `min(${width}px, 86vw)` }}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel ?? strings.navigationDrawer}\n tabIndex={-1}\n >\n {header ? <div className=\"oui-drawer__header\">{header}</div> : null}\n <div className=\"oui-drawer__content\">{children}</div>\n </div>\n </div>,\n document.body\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../utils';\nimport './Splash.css';\n\nexport interface SplashProps {\n /** Logo / illustration rendered at 80×80dp. */\n image?: ReactNode;\n /** App title under the logo (30dp, expanded-collapsing appearance). */\n title?: string;\n /**\n * Play the wiggle intro from `anim/oui_splash_animation.xml`\n * (rotate 0→25→−45→35→−25→10 ≈ 560ms).\n * @default false\n */\n animated?: boolean;\n /** Repeat the animation while the splash is visible. @default false */\n loop?: boolean;\n className?: string;\n style?: CSSProperties;\n}\n\n/** `SplashLayout` — centered logo + title splash screen. */\nexport function Splash({\n image,\n title,\n animated = false,\n loop = false,\n className,\n style,\n}: SplashProps) {\n return (\n <div className={cx('oui-splash', className)} style={style} role=\"presentation\">\n {image ? (\n <div\n className={cx(\n 'oui-splash__image',\n animated && 'oui-splash__image--animated',\n animated && loop && 'is-looping'\n )}\n >\n {image}\n </div>\n ) : null}\n {title ? <p className=\"oui-splash__title\">{title}</p> : null}\n </div>\n );\n}\n","import { cx } from '../utils';\nimport './ProgressBar.css';\n\nexport interface CircularProgressProps {\n /** Diameter in px. @default 40 (ProgressDialog uses ~56–60). */\n size?: number;\n /** Stroke width in px. @default 3.5 */\n strokeWidth?: number;\n /**\n * Determinate value 0–100. Omit for the indeterminate spinner\n * (`?android:attr/progressBarStyle`).\n */\n value?: number;\n /** Small centered message (e.g. \"45%\") — circle dialog behaviour. */\n message?: string;\n className?: string;\n 'aria-label'?: string;\n}\n\n/** SeslProgressBar circular indicator (indeterminate or determinate ring). */\nexport function CircularProgress({\n size = 40,\n strokeWidth = 3.5,\n value,\n message,\n className,\n 'aria-label': ariaLabel,\n}: CircularProgressProps) {\n const r = (size - strokeWidth) / 2;\n const c = 2 * Math.PI * r;\n const determinate = typeof value === 'number';\n const pct = determinate ? Math.min(100, Math.max(0, value)) : 0;\n\n return (\n <div\n className={cx(\n 'oui-progress-circle',\n !determinate && 'is-indeterminate',\n className\n )}\n style={{ width: size, height: size }}\n role=\"progressbar\"\n aria-valuemin={determinate ? 0 : undefined}\n aria-valuemax={determinate ? 100 : undefined}\n aria-valuenow={determinate ? Math.round(pct) : undefined}\n aria-label={ariaLabel ?? (determinate ? 'Progress' : 'Loading')}\n >\n <svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} aria-hidden=\"true\">\n <circle\n className=\"oui-progress-circle__track\"\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n strokeWidth={strokeWidth}\n />\n <circle\n className=\"oui-progress-circle__bar\"\n cx={size / 2}\n cy={size / 2}\n r={r}\n fill=\"none\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeDasharray={determinate ? `${(pct / 100) * c} ${c}` : undefined}\n strokeDashoffset={determinate ? c * 0.25 : undefined}\n transform={`rotate(-90 ${size / 2} ${size / 2})`}\n />\n </svg>\n {message ? <span className=\"oui-progress-circle__message\">{message}</span> : null}\n </div>\n );\n}\n\nexport interface LinearProgressProps {\n /** Determinate value 0–100. Omit for indeterminate. */\n value?: number;\n /** Row rendered under the bar: `{ number, percent }` (horizontal dialog). */\n numberText?: string;\n showPercent?: boolean;\n className?: string;\n 'aria-label'?: string;\n}\n\n/** SeslProgressBar horizontal indicator. */\nexport function LinearProgress({\n value,\n numberText,\n showPercent = false,\n className,\n 'aria-label': ariaLabel,\n}: LinearProgressProps) {\n const determinate = typeof value === 'number';\n const pct = determinate ? Math.min(100, Math.max(0, value)) : 0;\n const rounded = Math.round(pct);\n\n return (\n <div className={cx('oui-progress-linear-wrap', className)}>\n <div\n className={cx(\n 'oui-progress-linear',\n !determinate && 'is-indeterminate'\n )}\n role=\"progressbar\"\n aria-valuemin={determinate ? 0 : undefined}\n aria-valuemax={determinate ? 100 : undefined}\n aria-valuenow={determinate ? rounded : undefined}\n aria-label={ariaLabel ?? 'Loading'}\n >\n <div className=\"oui-progress-linear__bar\" style={{ width: `${pct}%` }} />\n </div>\n {numberText || showPercent ? (\n <div className=\"oui-progress-linear__footer\">\n <span className=\"oui-progress-linear__number\">{numberText}</span>\n <span className=\"oui-progress-linear__percent\">\n {showPercent ? `${rounded}%` : ''}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport interface ProgressBarProps extends CircularProgressProps {\n variant?: 'circular' | 'linear';\n}\n\n/** Convenience wrapper choosing the circular or horizontal indicator. */\nexport function ProgressBar({\n variant = 'circular',\n ...props\n}: ProgressBarProps) {\n return variant === 'circular' ? (\n <CircularProgress {...props} />\n ) : (\n <LinearProgress value={props.value} />\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../utils';\nimport { useStrings } from '../theme';\nimport { Button } from './Button';\nimport { CircularProgress } from './ProgressBar';\nimport './AppInfo.css';\n\nexport interface AppInfoAction {\n label: string;\n onClick?: () => void;\n /** `primary` = accent filled; `default` = grey pill (`OneUI.AppInfoButton`). */\n variant?: 'primary' | 'default';\n disabled?: boolean;\n}\n\nexport interface AppInfoProps {\n /** App name (38sp, centered). */\n name: string;\n /** Version text — shown as `Version x.y.z` by default. */\n version?: string;\n /** Custom version line (replaces `version`). */\n versionText?: string;\n /** Optional app logo above the name. */\n icon?: ReactNode;\n /** Update/progress notice (14sp muted). */\n notice?: string;\n /** Show the circular progress (while checking for updates). */\n loading?: boolean;\n /** Primary + secondary actions, e.g. Update / App info. */\n actions?: AppInfoAction[];\n /** Free-form content under the actions. */\n children?: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\n/**\n * `AppInfoLayout` — centered app name / version / update notice with\n * pill actions (radius 22dp, minHeight 44dp).\n */\nexport function AppInfo({\n name,\n version,\n versionText,\n icon,\n notice,\n loading = false,\n actions,\n children,\n className,\n style,\n}: AppInfoProps) {\n const strings = useStrings();\n const versionLine = versionText ?? (version ? strings.versionInfo(version) : null);\n\n return (\n <div className={cx('oui-app-info', className)} style={style}>\n <div className=\"oui-app-info__upper\">\n {icon ? <div className=\"oui-app-info__icon\">{icon}</div> : null}\n <h1 className=\"oui-app-info__name\">{name}</h1>\n {versionLine ? <p className=\"oui-app-info__version\">{versionLine}</p> : null}\n {loading ? (\n <div className=\"oui-app-info__progress\">\n <CircularProgress size={40} />\n </div>\n ) : null}\n {notice ? <p className=\"oui-app-info__notice\">{notice}</p> : null}\n {actions && actions.length > 0 ? (\n <div className=\"oui-app-info__actions\">\n {actions.map((action, index) => (\n <Button\n key={index}\n variant={action.variant === 'primary' ? 'colored' : 'outline'}\n className={cx(\n 'oui-app-info__button',\n action.variant !== 'primary' && 'oui-app-info__button--default'\n )}\n onClick={action.onClick}\n disabled={action.disabled}\n >\n {action.label}\n </Button>\n ))}\n </div>\n ) : null}\n {children ? <div className=\"oui-app-info__children\">{children}</div> : null}\n </div>\n </div>\n );\n}\n","import { useRef, type ReactNode } from 'react';\nimport { cx } from '../utils';\nimport './Tabs.css';\n\nexport interface TabItem {\n key: string;\n label: string;\n icon?: ReactNode;\n badge?: number | string;\n disabled?: boolean;\n}\n\nexport interface TabsProps {\n items: TabItem[];\n value: string;\n onChange?: (key: string) => void;\n /**\n * `underline` — Material/One UI scrolling tabs with an indicator\n * (MarginsTabLayout, 24dp side padding).\n * `pill` — segmented pill tabs (Start/End style).\n * @default 'underline'\n */\n variant?: 'underline' | 'pill';\n /** Horizontal padding around the tab strip. @default 24 */\n inset?: number;\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * Tab strip — port of `MarginsTabLayout`\n * (`oui_tab_layout_default_padding` = 24dp).\n */\nexport function Tabs({\n items,\n value,\n onChange,\n variant = 'underline',\n inset = 24,\n className,\n 'aria-label': ariaLabel,\n}: TabsProps) {\n const listRef = useRef<HTMLDivElement>(null);\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n const enabled = items.filter((item) => !item.disabled);\n const index = enabled.findIndex((item) => item.key === value);\n if (index < 0) return;\n event.preventDefault();\n const next =\n event.key === 'ArrowRight'\n ? enabled[(index + 1) % enabled.length]\n : enabled[(index - 1 + enabled.length) % enabled.length];\n onChange?.(next.key);\n const el = listRef.current?.querySelector<HTMLElement>(\n `[data-key=\"${CSS.escape(next.key)}\"]`\n );\n el?.focus();\n el?.scrollIntoView({ block: 'nearest', inline: 'nearest' });\n };\n\n return (\n <div\n ref={listRef}\n role=\"tablist\"\n aria-label={ariaLabel}\n className={cx('oui-tabs', `oui-tabs--${variant}`, className)}\n style={{ paddingInline: inset }}\n onKeyDown={onKeyDown}\n >\n {items.map((item) => {\n const active = item.key === value;\n return (\n <button\n key={item.key}\n data-key={item.key}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n disabled={item.disabled}\n className={cx('oui-tabs__tab', active && 'is-active')}\n onClick={() => onChange?.(item.key)}\n >\n {item.icon ? <span className=\"oui-tabs__icon\">{item.icon}</span> : null}\n <span className=\"oui-tabs__label\">{item.label}</span>\n {item.badge != null && item.badge !== '' ? (\n <span className=\"oui-tabs__badge\">{item.badge}</span>\n ) : null}\n {variant === 'underline' ? (\n <span className=\"oui-tabs__indicator\" aria-hidden=\"true\" />\n ) : null}\n </button>\n );\n })}\n </div>\n );\n}\n","import {\n useCallback,\n useRef,\n useState,\n type CSSProperties,\n type PointerEvent as ReactPointerEvent,\n} from 'react';\nimport { clamp, cx } from '../utils';\nimport { IconAdd, IconRemove } from '../icons';\nimport './Slider.css';\n\nexport type SliderValue = number | [number, number];\n\nexport interface SliderProps {\n /** Single value, or `[low, high]` for the dual/overlap mode. */\n value: SliderValue;\n onChange?: (value: SliderValue) => void;\n /** Called once at the end of an interaction. */\n onCommit?: (value: SliderValue) => void;\n min?: number;\n max?: number;\n /** @default 1 */\n step?: number;\n disabled?: boolean;\n /**\n * Show the discrete tick dots (`oui_seekbar_tick_mark`, 7dp ovals\n * in `oui_seekbar_circle_marker_color`).\n */\n ticks?: boolean;\n /** Show the −/+ stepper buttons (`SeekBarPreferencePro` adjustable mode). */\n stepper?: boolean;\n /** Centered value readout under the track (`seekbar_value`, colorPrimaryDark). */\n showValue?: boolean;\n /** Suffix appended to the readout, e.g. `%`. */\n units?: string;\n /** Custom readout formatter. */\n formatValue?: (value: number) => string;\n /** Accessible name. */\n label?: string;\n className?: string;\n style?: CSSProperties;\n}\n\nfunction percentOf(value: number, min: number, max: number) {\n if (max <= min) return 0;\n return ((value - min) / (max - min)) * 100;\n}\n\nfunction snap(value: number, min: number, max: number, step: number) {\n if (step <= 0) return clamp(value, min, max);\n const steps = Math.round((value - min) / step);\n return clamp(min + steps * step, min, max);\n}\n\n/**\n * Slider — port of `HapticSeekBar` / `SeekBarPreferencePro`.\n * Supports tick marks, ± steppers, value readout and the dual-thumb\n * overlap mode (orange `sesl_seekbar_overlap_color_activated`).\n */\nexport function Slider({\n value,\n onChange,\n onCommit,\n min = 0,\n max = 100,\n step = 1,\n disabled = false,\n ticks = false,\n stepper = false,\n showValue = false,\n units = '',\n formatValue,\n label,\n className,\n style,\n}: SliderProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n const [dragging, setDragging] = useState<0 | 1 | null>(null);\n\n const isRange = Array.isArray(value);\n const low = isRange ? value[0] : value;\n const high = isRange ? value[1] : value;\n\n const format = useCallback(\n (v: number) =>\n formatValue\n ? formatValue(v)\n : `${Math.round(v * 100) / 100}${units}`,\n [formatValue, units]\n );\n\n const valueFromPointer = useCallback(\n (clientX: number): number => {\n const track = trackRef.current;\n if (!track) return min;\n const rect = track.getBoundingClientRect();\n const ratio = rect.width > 0 ? (clientX - rect.left) / rect.width : 0;\n const raw = min + ratio * (max - min);\n return snap(raw, min, max, step);\n },\n [min, max, step]\n );\n\n const emit = useCallback(\n (next: number, thumb: 0 | 1) => {\n if (!isRange) {\n onChange?.(next);\n return;\n }\n let [lo, hi] = [low, high];\n if (thumb === 0) lo = Math.min(next, hi);\n else hi = Math.max(next, lo);\n onChange?.([lo, hi]);\n },\n [isRange, low, high, onChange]\n );\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled || !trackRef.current) return;\n event.preventDefault();\n trackRef.current.focus?.();\n const next = valueFromPointer(event.clientX);\n const thumb: 0 | 1 =\n isRange && Math.abs(next - high) < Math.abs(next - low) ? 1 : 0;\n setDragging(thumb);\n emit(next, thumb);\n (event.currentTarget as HTMLElement).setPointerCapture?.(event.pointerId);\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled || dragging === null) return;\n emit(valueFromPointer(event.clientX), dragging);\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (dragging === null) return;\n setDragging(null);\n (event.currentTarget as HTMLElement).releasePointerCapture?.(\n event.pointerId\n );\n onCommit?.(value);\n };\n\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return;\n const big = step * 10;\n let next: number | null = null;\n let thumb: 0 | 1 = isRange ? 1 : 0;\n const current = isRange ? high : value;\n\n switch (event.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n next = clamp(current + step, min, max);\n break;\n case 'ArrowLeft':\n case 'ArrowDown':\n next = clamp(current - step, min, max);\n break;\n case 'PageUp':\n next = clamp(current + big, min, max);\n break;\n case 'PageDown':\n next = clamp(current - big, min, max);\n break;\n case 'Home':\n next = min;\n if (isRange) thumb = 1;\n break;\n case 'End':\n next = max;\n break;\n default:\n return;\n }\n event.preventDefault();\n emit(next, thumb);\n onCommit?.(value);\n };\n\n const stepCount =\n ticks && step > 0 ? Math.round((max - min) / step) : 0;\n const showTicks = stepCount > 0 && stepCount <= 40;\n\n const lowPct = percentOf(low, min, max);\n const highPct = percentOf(high, min, max);\n const fillStart = isRange ? lowPct : 0;\n const fillEnd = isRange ? highPct : percentOf(value as number, min, max);\n\n const thumb = (which: 0 | 1) => {\n const v = which === 0 ? low : high;\n const pct = percentOf(v, min, max);\n return (\n <span\n key={which}\n className={cx(\n 'oui-slider__thumb',\n dragging === which && 'is-dragging'\n )}\n style={{ left: `${pct}%` }}\n aria-hidden=\"true\"\n />\n );\n };\n\n const singleValue = isRange ? high : (value as number);\n\n const control = (\n <div\n ref={trackRef}\n className={cx(\n 'oui-slider',\n disabled && 'is-disabled',\n isRange && 'is-range'\n )}\n style={\n {\n '--oui-slider-fill-start': `${fillStart}%`,\n '--oui-slider-fill-end': `${fillEnd}%`,\n } as CSSProperties\n }\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-label={label}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={singleValue}\n aria-valuetext={format(singleValue)}\n aria-disabled={disabled || undefined}\n aria-orientation=\"horizontal\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onKeyDown={onKeyDown}\n >\n <div className=\"oui-slider__rail\" aria-hidden=\"true\">\n <div className=\"oui-slider__fill\" />\n {showTicks ? (\n <div className=\"oui-slider__ticks\">\n {Array.from({ length: stepCount + 1 }, (_, i) => (\n <span\n key={i}\n className=\"oui-slider__tick\"\n style={{ left: `${(i / stepCount) * 100}%` }}\n />\n ))}\n </div>\n ) : null}\n </div>\n {thumb(0)}\n {isRange ? thumb(1) : null}\n {/* hidden real inputs for forms */}\n <input\n className=\"oui-slider__hidden-input\"\n type=\"hidden\"\n name={label}\n value={singleValue}\n readOnly\n />\n </div>\n );\n\n const readout = showValue ? (\n <div className=\"oui-slider__value\">{format(singleValue)}</div>\n ) : null;\n\n if (!stepper) {\n return (\n <div className={cx('oui-slider-wrap', className)} style={style}>\n {control}\n {readout}\n </div>\n );\n }\n\n return (\n <div className={cx('oui-slider-wrap', 'oui-slider-wrap--stepper', className)} style={style}>\n <button\n type=\"button\"\n className=\"oui-slider__stepper oui-slider__stepper--minus oui-press\"\n aria-label=\"Decrease\"\n disabled={disabled || singleValue <= min}\n onClick={() => {\n emit(clamp(singleValue - step, min, max), isRange ? 1 : 0);\n onCommit?.(value);\n }}\n >\n <IconRemove />\n </button>\n <div className=\"oui-slider-wrap__track\">{control}</div>\n <button\n type=\"button\"\n className=\"oui-slider__stepper oui-slider__stepper--plus oui-press\"\n aria-label=\"Increase\"\n disabled={disabled || singleValue >= max}\n onClick={() => {\n emit(clamp(singleValue + step, min, max), isRange ? 1 : 0);\n onCommit?.(value);\n }}\n >\n <IconAdd />\n </button>\n {readout ? <div className=\"oui-slider-wrap__readout\">{readout}</div> : null}\n </div>\n );\n}\n","import { useId, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { canUseDOM, cx, useEscapeKey } from '../utils';\nimport './Dialog.css';\n\nexport interface DialogProps {\n open: boolean;\n onClose?: () => void;\n /** Dialog title (sesl dialog title, 20sp). */\n title?: ReactNode;\n /** Dialog body. */\n children?: ReactNode;\n /**\n * Action buttons. They are laid out in the classic One UI footer:\n * a hairline-separated row of equal-width text buttons.\n */\n actions?: ReactNode;\n /** Disable scrim click / Escape closing. @default false */\n disableDismiss?: boolean;\n /** Max window width in px. @default 360 */\n maxWidth?: number;\n className?: string;\n 'aria-label'?: string;\n}\n\n/**\n * Base One UI alert dialog (rounded 28dp window, footer button bar).\n * Used directly, or as the shell for `ProgressDialog` / `GridMenuDialog`.\n */\nexport function Dialog({\n open,\n onClose,\n title,\n children,\n actions,\n disableDismiss = false,\n maxWidth = 360,\n className,\n 'aria-label': ariaLabel,\n}: DialogProps) {\n const titleId = useId();\n useEscapeKey(open && !disableDismiss, () => onClose?.());\n\n if (!open || !canUseDOM) return null;\n\n return createPortal(\n <div className=\"oui-dialog-root\">\n <div\n className=\"oui-dialog__scrim\"\n onClick={disableDismiss ? undefined : onClose}\n aria-hidden=\"true\"\n />\n <div\n className={cx('oui-dialog', className)}\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel ?? (title ? undefined : 'Dialog')}\n aria-labelledby={title ? titleId : undefined}\n style={{ maxWidth }}\n >\n {title ? (\n <h2 className=\"oui-dialog__title\" id={titleId}>\n {title}\n </h2>\n ) : null}\n {children != null ? (\n <div className=\"oui-dialog__body\">{children}</div>\n ) : null}\n {actions ? <div className=\"oui-dialog__actions\">{actions}</div> : null}\n </div>\n </div>,\n document.body\n );\n}\n\nexport interface DialogButtonProps {\n children?: ReactNode;\n onClick?: () => void;\n disabled?: boolean;\n /** Draw stronger emphasis (still uses the action color). */\n emphasis?: boolean;\n className?: string;\n autoFocus?: boolean;\n}\n\n/** Footer button styled like a sesl dialog action. */\nexport function DialogButton({\n children,\n onClick,\n disabled,\n emphasis,\n className,\n autoFocus,\n}: DialogButtonProps) {\n return (\n <button\n type=\"button\"\n className={cx('oui-dialog__button', emphasis && 'is-emphasis', className)}\n onClick={onClick}\n disabled={disabled}\n autoFocus={autoFocus}\n >\n {children}\n </button>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../utils';\nimport { Dialog, type DialogProps } from './Dialog';\nimport { CircularProgress, LinearProgress } from './ProgressBar';\nimport './ProgressDialog.css';\n\nexport interface ProgressDialogProps\n extends Omit<DialogProps, 'title' | 'actions' | 'children'> {\n /**\n * - `circle` — 55–60dp spinner with optional centered % (`oui_dialog_progress_dialog_circle`)\n * - `spinner` — horizontal spinner + message row (`oui_dialog_progress_dialog_spinner`)\n * - `horizontal` — message + determinate bar with number/percent\n * (`oui_dialog_progress_dialog_horizontal`)\n * @default 'circle'\n */\n variant?: 'circle' | 'spinner' | 'horizontal';\n message?: ReactNode;\n /** `horizontal` variant: determinate value 0–100. */\n value?: number;\n /** `horizontal` variant: left-side counter, e.g. \"34/100\". */\n numberText?: string;\n /** `circle` variant: show the value as a % inside the spinner. */\n percentText?: string;\n}\n\n/** ProgressDialog port (circle / spinner / horizontal layouts). */\nexport function ProgressDialog({\n open,\n onClose,\n variant = 'circle',\n message,\n value,\n numberText,\n percentText,\n disableDismiss = true,\n className,\n maxWidth,\n 'aria-label': ariaLabel,\n}: ProgressDialogProps) {\n let body: ReactNode = null;\n\n if (variant === 'circle') {\n body = (\n <div className=\"oui-progress-dialog__circle\">\n <CircularProgress\n size={56}\n strokeWidth={4}\n value={value}\n message={\n percentText ??\n (typeof value === 'number' ? `${Math.round(value)}%` : undefined)\n }\n aria-label={typeof message === 'string' ? message : 'Loading'}\n />\n </div>\n );\n } else if (variant === 'spinner') {\n body = (\n <div className=\"oui-progress-dialog__spinner\">\n <CircularProgress size={40} aria-label=\"Loading\" />\n {message != null ? (\n <div className=\"oui-progress-dialog__message\">{message}</div>\n ) : null}\n </div>\n );\n } else {\n body = (\n <div className=\"oui-progress-dialog__horizontal\">\n {message != null ? (\n <div className=\"oui-progress-dialog__message\">{message}</div>\n ) : null}\n <div className=\"oui-progress-dialog__bar-space\">\n <LinearProgress value={value} />\n </div>\n <div className=\"oui-progress-dialog__footer\">\n <span>{numberText}</span>\n <span>{typeof value === 'number' ? `${Math.round(value)}%` : ''}</span>\n </div>\n </div>\n );\n }\n\n return (\n <Dialog\n open={open}\n onClose={onClose}\n disableDismiss={disableDismiss}\n maxWidth={maxWidth ?? (variant === 'circle' ? 300 : 360)}\n className={cx('oui-progress-dialog', `oui-progress-dialog--${variant}`, className)}\n aria-label={ariaLabel ?? (typeof message === 'string' ? message : 'Loading')}\n >\n {body}\n </Dialog>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\nimport { cx } from '../utils';\nimport { Dialog, type DialogProps } from './Dialog';\nimport './GridMenuDialog.css';\n\nexport interface GridMenuItem {\n key: string;\n label: string;\n icon: ReactNode;\n onClick?: () => void;\n /** \"N\" new badge (or any short text) on the icon. */\n badge?: string | number;\n disabled?: boolean;\n}\n\nexport interface GridMenuDialogProps\n extends Omit<DialogProps, 'title' | 'actions' | 'children'> {\n items: GridMenuItem[];\n /**\n * Preferred number of columns (the RecyclerView auto-fits based on width).\n * @default 4\n */\n columns?: number;\n title?: ReactNode;\n}\n\n/**\n * GridMenuDialog — icon grid inside a One UI dialog\n * (padding 16/20dp, 8dp gap, 12dp item ripples, `N` badges).\n */\nexport function GridMenuDialog({\n open,\n onClose,\n items,\n columns = 4,\n title,\n disableDismiss = false,\n maxWidth,\n className,\n 'aria-label': ariaLabel,\n}: GridMenuDialogProps) {\n return (\n <Dialog\n open={open}\n onClose={onClose}\n title={title}\n disableDismiss={disableDismiss}\n maxWidth={maxWidth ?? 400}\n className={cx('oui-grid-menu', className)}\n aria-label={ariaLabel ?? (typeof title === 'string' ? title : 'Menu')}\n >\n <div\n className=\"oui-grid-menu__grid\"\n style={\n {\n '--oui-grid-columns': columns,\n } as CSSProperties\n }\n role=\"menu\"\n >\n {items.map((item) => (\n <button\n key={item.key}\n type=\"button\"\n role=\"menuitem\"\n className=\"oui-grid-menu__item oui-press\"\n disabled={item.disabled}\n onClick={() => {\n item.onClick?.();\n onClose?.();\n }}\n >\n <span className=\"oui-grid-menu__icon\" aria-hidden=\"true\">\n {item.icon}\n {item.badge != null && item.badge !== '' ? (\n <span className=\"oui-grid-menu__badge\">{item.badge}</span>\n ) : null}\n </span>\n <span className=\"oui-grid-menu__label\">{item.label}</span>\n </button>\n ))}\n </div>\n </Dialog>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../utils';\nimport { useStrings } from '../theme';\nimport './RelatedCard.css';\n\nexport interface RelatedLink {\n key?: string;\n label: string;\n onClick?: () => void;\n href?: string;\n}\n\nexport interface RelatedCardProps {\n /** Defaults to \"Looking for something else?\" (`oui_relative_description`). */\n title?: ReactNode;\n links: RelatedLink[];\n onLinkClick?: (link: RelatedLink, index: number) => void;\n className?: string;\n}\n\n/**\n * RelatedCard / \"Related links\" — `oui_view_relative_link.xml`:\n * tinted 26dp-radius card, 18sp bold title, stacked bold accent links\n * (16sp, padding 16/6, pressed ripple).\n */\nexport function RelatedCard({\n title,\n links,\n onLinkClick,\n className,\n}: RelatedCardProps) {\n const strings = useStrings();\n\n return (\n <section className={cx('oui-related-card', className)}>\n <h3 className=\"oui-related-card__title\">\n {title ?? strings.relatedDescription}\n </h3>\n <div className=\"oui-related-card__links\">\n {links.map((link, index) => {\n const content = <span className=\"oui-related-card__label\">{link.label}</span>;\n const handleClick = () => {\n onLinkClick?.(link, index);\n link.onClick?.();\n };\n\n if (link.href) {\n return (\n <a\n key={link.key ?? `${link.label}-${index}`}\n className=\"oui-related-card__link oui-press\"\n href={link.href}\n onClick={handleClick}\n >\n {content}\n </a>\n );\n }\n return (\n <button\n key={link.key ?? `${link.label}-${index}`}\n type=\"button\"\n className=\"oui-related-card__link oui-press\"\n onClick={handleClick}\n >\n {content}\n </button>\n );\n })}\n </div>\n </section>\n );\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { canUseDOM, clamp, cx, getAnchorRect, useEscapeKey, type AnchorLike } from '../utils';\nimport './TipPopup.css';\n\nexport interface TipPopupProps {\n open: boolean;\n /** Anchor element / ref / rect the balloon points at. */\n anchor: AnchorLike;\n onClose?: () => void;\n /** Balloon message (defaults to the `sem_tip_popup_hint_string`). */\n children?: ReactNode;\n /** Optional action button rendered under the message. */\n action?: { label: string; onClick?: () => void };\n /** @default 'top' */\n placement?: 'top' | 'bottom';\n /** Hide the default close-on-outside-click / Escape behaviour. */\n disableDismiss?: boolean;\n className?: string;\n}\n\n/**\n * TipPopup — dark balloon tooltip (`sem_tip_popup_*`: #474747 background,\n * 15sp message, optional 36dp-min action button, 16×12 arrow).\n */\nexport function TipPopup({\n open,\n anchor,\n onClose,\n children,\n action,\n placement = 'top',\n disableDismiss = false,\n className,\n}: TipPopupProps) {\n const balloonRef = useRef<HTMLDivElement>(null);\n const [pos, setPos] = useState<{ top: number; left: number; arrowX: number; place: 'top' | 'bottom' } | null>(null);\n\n useEscapeKey(open && !disableDismiss, () => onClose?.());\n\n const reposition = useCallback(() => {\n const rect = getAnchorRect(anchor);\n const balloon = balloonRef.current;\n if (!rect || !balloon) return;\n\n const b = balloon.getBoundingClientRect();\n const gap = 14;\n const margin = 10; /* sem_tip_popup_side_margin */\n\n let place = placement;\n let top =\n place === 'top'\n ? rect.top - b.height - gap\n : rect.bottom + gap;\n\n // Flip if there is not enough room.\n if (place === 'top' && rect.top < b.height + gap * 2) {\n place = 'bottom';\n top = rect.bottom + gap;\n } else if (place === 'bottom' && rect.bottom + b.height + gap * 2 > window.innerHeight) {\n place = 'top';\n top = rect.top - b.height - gap;\n }\n\n const center = rect.left + rect.width / 2;\n const left = clamp(center - b.width / 2, margin, window.innerWidth - b.width - margin);\n const arrowX = clamp(center - left, 14, b.width - 14);\n\n setPos({ top, left, arrowX, place });\n }, [anchor, placement]);\n\n useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n reposition();\n }, [open, reposition]);\n\n useEffect(() => {\n if (!open) return;\n const handler = () => reposition();\n window.addEventListener('scroll', handler, true);\n window.addEventListener('resize', handler);\n return () => {\n window.removeEventListener('scroll', handler, true);\n window.removeEventListener('resize', handler);\n };\n }, [open, reposition]);\n\n // Close on outside pointerdown.\n useEffect(() => {\n if (!open || disableDismiss || !canUseDOM) return;\n const onPointerDown = (event: PointerEvent) => {\n const balloon = balloonRef.current;\n if (balloon && !balloon.contains(event.target as Node)) onClose?.();\n };\n document.addEventListener('pointerdown', onPointerDown);\n return () => document.removeEventListener('pointerdown', onPointerDown);\n }, [open, disableDismiss, onClose]);\n\n if (!open || !canUseDOM) return null;\n\n return createPortal(\n <div\n ref={balloonRef}\n className={cx(\n 'oui-tip',\n className,\n pos ? `oui-tip--${pos.place}` : undefined\n )}\n role=\"tooltip\"\n style={\n pos\n ? { top: pos.top, left: pos.left, ['--oui-tip-arrow-x' as string]: `${pos.arrowX}px` }\n : { top: -9999, left: -9999, visibility: 'hidden' }\n }\n >\n <div className=\"oui-tip__message\">{children}</div>\n {action ? (\n <button\n type=\"button\"\n className=\"oui-tip__action oui-press\"\n onClick={() => {\n action.onClick?.();\n onClose?.();\n }}\n >\n {action.label}\n </button>\n ) : null}\n <span className=\"oui-tip__arrow\" aria-hidden=\"true\" />\n </div>,\n document.body\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../utils';\nimport './Preference.css';\n\nexport interface PreferenceGroupProps {\n /** Subheader above the group (13sp bold sesl subheader). */\n title?: ReactNode;\n /**\n * Render the group as an inset rounded card (One UI 4 `InsetPreferenceCategory`\n * look, radius 26). Default is the classic flat section.\n */\n variant?: 'flat' | 'card';\n className?: string;\n children?: ReactNode;\n}\n\n/**\n * Preference section — `InsetPreferenceCategory` / category subheader.\n * First/last children automatically receive the rounded corners\n * (`positionMode` first_item behaviour).\n */\nexport function PreferenceGroup({\n title,\n variant = 'flat',\n className,\n children,\n}: PreferenceGroupProps) {\n return (\n <div\n className={cx(\n 'oui-pref-group',\n variant === 'card' && 'oui-pref-group--card',\n className\n )}\n >\n {title != null && title !== '' ? (\n <div className=\"oui-pref-group__subheader\" role=\"presentation\">\n {title}\n </div>\n ) : null}\n <div className=\"oui-pref-group__items\">{children}</div>\n </div>\n );\n}\n","import type { MouseEvent, ReactNode } from 'react';\nimport { cx } from '../utils';\nimport './Preference.css';\n\nexport interface PreferenceProps {\n /** 24dp leading icon. */\n icon?: ReactNode;\n title: ReactNode;\n summary?: ReactNode;\n /** Trailing widget (value text, switch, radio…). */\n end?: ReactNode;\n /** Makes the row interactive. */\n onClick?: (event: MouseEvent<HTMLDivElement>) => void;\n disabled?: boolean;\n /** Visually emphasise as the selected option. */\n selected?: boolean;\n className?: string;\n children?: ReactNode;\n}\n\n/**\n * Single preference row — title 16sp + summary 14sp, 24dp horizontal\n * padding, inset dividers (`?attr/listPreferredItemHeight` family).\n */\nexport function Preference({\n icon,\n title,\n summary,\n end,\n onClick,\n disabled = false,\n selected = false,\n className,\n children,\n}: PreferenceProps) {\n const interactive = !!onClick && !disabled;\n\n return (\n <div\n className={cx(\n 'oui-pref',\n interactive && 'oui-pref--interactive oui-press',\n disabled && 'is-disabled',\n selected && 'is-selected',\n icon ? 'has-icon' : 'no-icon',\n className\n )}\n role={interactive ? 'button' : undefined}\n tabIndex={interactive ? 0 : undefined}\n aria-disabled={disabled || undefined}\n onClick={\n interactive\n ? (event) => {\n onClick?.(event);\n }\n : undefined\n }\n onKeyDown={\n interactive\n ? (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onClick?.(event as unknown as MouseEvent<HTMLDivElement>);\n }\n }\n : undefined\n }\n >\n {icon != null ? <div className=\"oui-pref__icon\">{icon}</div> : null}\n <div className=\"oui-pref__text\">\n <div className=\"oui-pref__title\">{title}</div>\n {summary != null && summary !== '' ? (\n <div className=\"oui-pref__summary\">{summary}</div>\n ) : null}\n {children}\n </div>\n {end != null ? <div className=\"oui-pref__end\">{end}</div> : null}\n </div>\n );\n}\n","import { Preference, type PreferenceProps } from './Preference';\nimport { Switch } from './Switch';\n\nexport interface SwitchPreferenceProps\n extends Omit<PreferenceProps, 'end' | 'onClick' | 'children'> {\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n}\n\n/** Preference row with a trailing One UI switch. */\nexport function SwitchPreference({\n checked,\n defaultChecked,\n onChange,\n disabled,\n title,\n ...rest\n}: SwitchPreferenceProps) {\n return (\n <Preference\n {...rest}\n title={title}\n disabled={disabled}\n onClick={disabled ? undefined : () => onChange?.(!checked)}\n className={['oui-pref-switch', rest.className].filter(Boolean).join(' ')}\n end={\n <Switch\n checked={checked}\n defaultChecked={defaultChecked}\n onChange={onChange}\n disabled={disabled}\n label={typeof title === 'string' ? title : undefined}\n onClick={(event) => event.stopPropagation()}\n />\n }\n />\n );\n}\n","import { Preference, type PreferenceProps } from './Preference';\nimport { Slider, type SliderValue } from './Slider';\n\nexport interface SliderPreferenceProps\n extends Omit<PreferenceProps, 'end' | 'onClick' | 'children'> {\n value: SliderValue;\n onChange?: (value: SliderValue) => void;\n min?: number;\n max?: number;\n step?: number;\n /** Show the centered value readout (colorPrimaryDark). @default true */\n showValue?: boolean;\n units?: string;\n formatValue?: (value: number) => string;\n /** Show the −/+ stepper buttons. */\n stepper?: boolean;\n ticks?: boolean;\n}\n\n/**\n * `SeekBarPreferencePro` — preference header with an inline slider,\n * optional value readout, units and steppers.\n */\nexport function SliderPreference({\n value,\n onChange,\n min,\n max,\n step,\n showValue = true,\n units,\n formatValue,\n stepper = false,\n ticks = false,\n title,\n summary,\n disabled,\n className,\n ...rest\n}: SliderPreferenceProps) {\n return (\n <Preference\n {...rest}\n className={['oui-pref-slider', className].filter(Boolean).join(' ')}\n title={title}\n summary={summary}\n disabled={disabled}\n >\n <div className=\"oui-pref-slider__controls\">\n <Slider\n value={value}\n onChange={onChange}\n min={min}\n max={max}\n step={step}\n disabled={disabled}\n ticks={ticks}\n stepper={stepper}\n showValue={showValue}\n units={units}\n formatValue={formatValue}\n label={typeof title === 'string' ? title : undefined}\n />\n </div>\n </Preference>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../utils';\nimport './Preference.css';\n\nexport interface DescriptionPreferenceProps {\n /** Body copy (unclickable preference text, 14sp, +4sp line spacing). */\n children?: ReactNode;\n /**\n * `subheader` renders the text as a category label instead of body copy.\n * @default 'body'\n */\n variant?: 'body' | 'subheader';\n className?: string;\n}\n\n/**\n * `DescriptionPreference` — non-interactive explanatory text\n * (`OneUI.UnclickablePreferenceTextStyle`).\n */\nexport function DescriptionPreference({\n children,\n variant = 'body',\n className,\n}: DescriptionPreferenceProps) {\n return (\n <div\n className={cx(\n 'oui-pref-description',\n variant === 'subheader' && 'oui-pref-description--subheader',\n className\n )}\n >\n {children}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../utils';\nimport './Preference.css';\n\nexport interface RadioOption {\n value: string;\n label: string;\n subtitle?: string;\n /** Image shown above the label (viewType=image). */\n image?: ReactNode;\n disabled?: boolean;\n}\n\nexport interface HorizontalRadioPreferenceProps {\n options: RadioOption[];\n value: string;\n onChange?: (value: string) => void;\n /** Render the image layout (`viewType=image`). */\n withImages?: boolean;\n /** Accessible name. */\n label?: string;\n className?: string;\n}\n\n/**\n * `HorizontalRadioPreference` — 2–3 equal columns with title (20sp),\n * subtitle (15sp) and a radio underneath; selected uses colorPrimaryDark.\n */\nexport function HorizontalRadioPreference({\n options,\n value,\n onChange,\n withImages = false,\n label,\n className,\n}: HorizontalRadioPreferenceProps) {\n return (\n <div\n className={cx(\n 'oui-hradio',\n withImages && 'oui-hradio--image',\n className\n )}\n role=\"radiogroup\"\n aria-label={label}\n >\n {options.map((option) => {\n const selected = option.value === value;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n disabled={option.disabled}\n className={cx('oui-hradio__item', selected && 'is-selected')}\n onClick={() => onChange?.(option.value)}\n >\n {option.image ? (\n <span className=\"oui-hradio__image\" aria-hidden=\"true\">\n {option.image}\n </span>\n ) : null}\n <span className=\"oui-hradio__title\">{option.label}</span>\n {option.subtitle ? (\n <span className=\"oui-hradio__subtitle\">{option.subtitle}</span>\n ) : null}\n <span className=\"oui-hradio__radio\" aria-hidden=\"true\" />\n </button>\n );\n })}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../utils';\nimport { IconClose } from '../icons';\nimport './Preference.css';\n\nexport interface TipsCardAction {\n label: string;\n onClick?: () => void;\n}\n\nexport interface TipsCardProps {\n /** 19sp bold title. */\n title?: ReactNode;\n /** 15sp summary (+4sp line spacing). */\n summary?: ReactNode;\n /** Extra content between summary and actions. */\n children?: ReactNode;\n /** Bottom text buttons (17sp bold pills). */\n actions?: TipsCardAction[];\n /** Show the 22dp close button; called when pressed. */\n onClose?: () => void;\n className?: string;\n}\n\n/**\n * `TipsCardPreference` — highlight card (bg #fcfcfc/#252525) with a title,\n * close button and bold pill text actions.\n */\nexport function TipsCard({\n title,\n summary,\n children,\n actions,\n onClose,\n className,\n}: TipsCardProps) {\n return (\n <div className={cx('oui-tips', className)}>\n {title != null ? (\n <div className=\"oui-tips__header\">\n <h3 className=\"oui-tips__title\">{title}</h3>\n {onClose ? (\n <button\n type=\"button\"\n className=\"oui-tips__close\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <IconClose />\n </button>\n ) : null}\n </div>\n ) : null}\n {summary != null ? (\n <p className=\"oui-tips__summary\">{summary}</p>\n ) : null}\n {children ? <div className=\"oui-tips__children\">{children}</div> : null}\n {actions && actions.length > 0 ? (\n <>\n <div className=\"oui-tips__spacer\" />\n <div className=\"oui-tips__actions\">\n {actions.map((action) => (\n <button\n key={action.label}\n type=\"button\"\n className=\"oui-tips__button\"\n onClick={action.onClick}\n >\n {action.label}\n </button>\n ))}\n </div>\n </>\n ) : (\n <div className=\"oui-tips__spacer\" />\n )}\n </div>\n );\n}\n","import { CSSProperties } from 'react';\nimport { cx } from '../utils';\nimport { Preference, type PreferenceProps } from './Preference';\nimport './Preference.css';\n\nexport interface ColorPickerPreferenceProps\n extends Omit<PreferenceProps, 'end' | 'onClick' | 'children'> {\n /** Selected color (any CSS color string). */\n value: string;\n onChange?: (value: string) => void;\n /** Swatch palette. Defaults to a Samsung-flavoured preset set. */\n swatches?: string[];\n /** Show the alpha slider (`showAlphaSlider` in attrs.xml). */\n showAlpha?: boolean;\n /** Alpha 0–1 (used with `showAlpha`). */\n alpha?: number;\n onAlphaChange?: (alpha: number) => void;\n}\n\nconst DEFAULT_SWATCHES = [\n '#000000',\n '#3a3a3a',\n '#666666',\n '#9e9e9e',\n '#cfcfcf',\n '#ffffff',\n '#db332a',\n '#ef5e16',\n '#f4b400',\n '#14a866',\n '#0381fe',\n '#3e91ff',\n '#7e57c2',\n '#d81b60',\n '#8d6e63',\n '#607d8b',\n];\n\n/**\n * `ColorPickerPreference` — swatch grid with optional alpha slider.\n */\nexport function ColorPickerPreference({\n value,\n onChange,\n swatches = DEFAULT_SWATCHES,\n showAlpha = false,\n alpha = 1,\n onAlphaChange,\n title,\n summary,\n disabled,\n className,\n ...rest\n}: ColorPickerPreferenceProps) {\n const isLight = (color: string) =>\n ['#ffffff', '#cfcfcf', '#f4b400'].includes(color.toLowerCase());\n\n return (\n <Preference\n {...rest}\n className={cx('oui-color-picker-pref', className)}\n title={title}\n summary={summary}\n disabled={disabled}\n >\n <div className=\"oui-color-picker\">\n <div className=\"oui-color-picker__grid\" role=\"radiogroup\">\n {swatches.map((swatch) => (\n <button\n key={swatch}\n type=\"button\"\n role=\"radio\"\n aria-checked={swatch === value}\n aria-label={swatch}\n disabled={disabled}\n className={cx(\n 'oui-color-picker__swatch',\n swatch === value && 'is-selected',\n isLight(swatch) && 'is-light'\n )}\n style={{ ['--swatch' as string]: swatch } as CSSProperties}\n onClick={() => onChange?.(swatch)}\n />\n ))}\n </div>\n {showAlpha ? (\n <div className=\"oui-color-picker__alpha\">\n <input\n type=\"range\"\n min={0}\n max={100}\n value={Math.round(alpha * 100)}\n disabled={disabled}\n aria-label=\"Alpha\"\n onChange={(event) => onAlphaChange?.(Number(event.target.value) / 100)}\n />\n <span className=\"oui-color-picker__alpha-value\">\n {Math.round(alpha * 100)}%\n </span>\n </div>\n ) : null}\n </div>\n </Preference>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ :root,[data-oneui-theme=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--oui-bg:#f6f6f6;--oui-surface:#fcfcfc;--oui-elevated:#fff;--oui-card:#fff;--oui-dialog-bg:#fafafa;--oui-tips-bg:#fcfcfc;--oui-text:#010101;--oui-text-strong:#252525;--oui-text-secondary:#858585;--oui-text-muted:#8c8c8c;--oui-subheader-text:#8c8c8c;--oui-divider:#00000014;--oui-hairline:#0000001f;--oui-primary:#0381fe;--oui-primary-dark:#0072de;--oui-green:#14a866;--oui-orange:#ef5e16;--oui-red:#db332a;--oui-badge:#ef5e16;--oui-btn-border:#25252566;--oui-btn-text:#666;--oui-appinfo-btn-bg:#ebebeb;--oui-appinfo-btn-text:#252525;--oui-link-bg:#0381fe0f;--oui-link-bg-pressed:#0381fe24;--oui-link-text:#0072de;--oui-toast-bg:#3a3a3ae6;--oui-toast-text:#fafafa;--oui-tip-bg:#474747;--oui-tip-text:#fafafa;--oui-slider-rail:#cacaca;--oui-slider-fill:var(--oui-primary);--oui-slider-overlap:#ef5e16;--oui-slider-thumb:#fafafa;--oui-slider-tick:#9c9c9c;--oui-switch-track-off:#999;--oui-switch-track-on:#0381fe;--oui-switch-thumb:#fafafa;--oui-switch-thumb-stroke:#8c8c8c;--oui-dialog-text:#252525;--oui-dialog-subtext:#505050;--oui-action:#0072de;--oui-grid-item-text:#252525;--oui-grid-ripple:#0000001a;--oui-desc-text:#252525;--oui-desc-link:#3b3b3b;--oui-radio-off:#858585;--oui-drawer-dim:#0003;--oui-overlay:#0006;--oui-shadow-1:0 1px 3px #0000001f, 0 1px 2px #00000014;--oui-shadow-2:0 6px 24px #00000029}[data-oneui-theme=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--oui-bg:#010101;--oui-surface:#171717;--oui-elevated:#252525;--oui-card:#1e1e1e;--oui-dialog-bg:#252525;--oui-tips-bg:#252525;--oui-text:#fafafa;--oui-text-strong:#fafafa;--oui-text-secondary:#a8a9a9;--oui-text-muted:#999;--oui-subheader-text:#999;--oui-divider:#ffffff26;--oui-hairline:#ffffff1f;--oui-primary:#0381fe;--oui-primary-dark:#3e91ff;--oui-green:#5ad69e;--oui-orange:#f6874f;--oui-red:#f76f68;--oui-badge:#ef5e16;--oui-btn-border:#fafafa;--oui-btn-text:#fafafa;--oui-appinfo-btn-bg:#1f1f1f;--oui-appinfo-btn-text:#fafafa;--oui-link-bg:#0381fe4d;--oui-link-bg-pressed:#0381fe6b;--oui-link-text:#3e91ff;--oui-toast-bg:#3a3a3ae6;--oui-toast-text:#fafafa;--oui-tip-bg:#474747;--oui-tip-text:#fafafa;--oui-slider-rail:#4f4f4f;--oui-slider-fill:var(--oui-primary);--oui-slider-overlap:#ff6021;--oui-slider-thumb:#fafafa;--oui-slider-tick:gray;--oui-switch-track-off:#666660;--oui-switch-track-on:#3e91ff;--oui-switch-thumb:#fafafa;--oui-switch-thumb-stroke:#8f8f8f;--oui-dialog-text:#e5e5e5;--oui-dialog-subtext:#b0b0b0;--oui-action:#3e91ff;--oui-grid-item-text:#fafafa;--oui-grid-ripple:#fff3;--oui-desc-text:#e5e5e5;--oui-desc-link:#fafafa;--oui-radio-off:#a8a9a9;--oui-drawer-dim:#000c;--oui-overlay:#000000a6;--oui-shadow-1:0 1px 3px #0006, 0 1px 2px #0000004d;--oui-shadow-2:0 6px 24px #0000008c}:root,[data-oneui-theme]{--oui-font:"SamsungOne", "Samsung Sharp Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--oui-font-title:"Samsung Sharp Sans", "SamsungOne", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--oui-radius-sm:12px;--oui-radius-md:18px;--oui-radius-lg:22px;--oui-radius-xl:26px;--oui-radius-dialog:28px;--oui-radius-page:26px;--oui-motion-fast:.15s;--oui-motion-medium:.25s;--oui-ease:cubic-bezier(.2, 0, 0, 1)}@media (prefers-color-scheme:dark){:root:not([data-oneui-theme]){--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--oui-bg:#010101;--oui-surface:#171717;--oui-elevated:#252525;--oui-card:#1e1e1e;--oui-dialog-bg:#252525;--oui-tips-bg:#252525;--oui-text:#fafafa;--oui-text-strong:#fafafa;--oui-text-secondary:#a8a9a9;--oui-text-muted:#999;--oui-subheader-text:#999;--oui-divider:#ffffff26;--oui-hairline:#ffffff1f;--oui-primary-dark:#3e91ff;--oui-green:#5ad69e;--oui-orange:#f6874f;--oui-red:#f76f68;--oui-btn-border:#fafafa;--oui-btn-text:#fafafa;--oui-appinfo-btn-bg:#1f1f1f;--oui-appinfo-btn-text:#fafafa;--oui-link-bg:#0381fe4d;--oui-link-bg-pressed:#0381fe6b;--oui-link-text:#3e91ff;--oui-slider-rail:#4f4f4f;--oui-slider-overlap:#ff6021;--oui-slider-tick:gray;--oui-switch-track-off:#666660;--oui-switch-track-on:#3e91ff;--oui-switch-thumb-stroke:#8f8f8f;--oui-dialog-text:#e5e5e5;--oui-dialog-subtext:#b0b0b0;--oui-action:#3e91ff;--oui-grid-item-text:#fafafa;--oui-grid-ripple:#fff3;--oui-desc-text:#e5e5e5;--oui-desc-link:#fafafa;--oui-radio-off:#a8a9a9;--oui-drawer-dim:#000c;--oui-overlay:#000000a6;--oui-shadow-1:0 1px 3px #0006, 0 1px 2px #0000004d;--oui-shadow-2:0 6px 24px #0000008c}}[data-oneui-theme]{font-family:var(--oui-font);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.oui-focusable:focus-visible{outline:2px solid var(--oui-primary);outline-offset:2px}button:focus-visible{outline:2px solid var(--oui-primary);outline-offset:2px}[role=button]:focus-visible{outline:2px solid var(--oui-primary);outline-offset:2px}[role=switch]:focus-visible{outline:2px solid var(--oui-primary);outline-offset:2px}[role=slider]:focus-visible{outline:2px solid var(--oui-primary);outline-offset:2px}a:focus-visible{outline:2px solid var(--oui-primary);outline-offset:2px}.oui-press{-webkit-tap-highlight-color:transparent;cursor:pointer;-webkit-user-select:none;user-select:none;position:relative;overflow:hidden}.oui-press:after{content:"";opacity:0;transition:opacity var(--oui-motion-fast) var(--oui-ease);pointer-events:none;background:currentColor;position:absolute;top:0;bottom:0;left:0;right:0}.oui-press:hover:after{opacity:.06}.oui-press:active:after{opacity:.12}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.oui-round{background:var(--oui-surface);overflow:hidden}.oui-btn{border-radius:var(--oui-radius-md);letter-spacing:.1px;cursor:pointer;min-height:36px;transition:background-color var(--oui-motion-fast) var(--oui-ease), opacity var(--oui-motion-fast) var(--oui-ease), transform var(--oui-motion-fast) var(--oui-ease);background:0 0;border:none;justify-content:center;align-items:center;gap:8px;padding:9px 16.5px;font-family:inherit;font-size:15px;font-weight:600;line-height:1.2;display:inline-flex}.oui-btn:active:not(:disabled){transform:scale(.97)}.oui-btn:disabled{opacity:.4;cursor:default;pointer-events:none}.oui-btn__label{z-index:1;text-overflow:ellipsis;white-space:nowrap;max-width:100%;position:relative;overflow:hidden}.oui-btn--colored{background:var(--oui-primary);color:#fafafa;min-width:64px}.oui-btn--colored:hover:not(:disabled){filter:brightness(1.06)}.oui-btn--outline{border:1px solid var(--oui-btn-border);color:var(--oui-btn-text);background:0 0;padding:8px 16.5px}.oui-btn--outline:hover:not(:disabled){background:#0381fe0f}.oui-btn--outline:active:not(:disabled){background:#0381fe1f}.oui-btn--transparent{color:var(--oui-text);background:0 0;padding:8px 16px}.oui-btn--transparent:hover:not(:disabled){background:#0381fe0f}.oui-btn--transparent:active:not(:disabled){background:#0381fe1f}.oui-btn--full{width:100%;display:flex}.oui-switch{cursor:pointer;-webkit-tap-highlight-color:transparent;background:0 0;border:none;justify-content:center;align-items:center;width:52px;height:44px;padding:0;display:inline-flex;position:relative}.oui-switch:disabled{opacity:.4;cursor:default;pointer-events:none}.oui-switch__track{background:var(--oui-switch-track-off);width:46px;height:26px;transition:background-color var(--oui-motion-medium) var(--oui-ease);border-radius:13px;display:block;position:relative}.oui-switch__thumb{background:var(--oui-switch-thumb);border:1px solid var(--oui-switch-thumb-stroke);box-sizing:border-box;width:22px;height:22px;transition:transform var(--oui-motion-medium) var(--oui-ease), width var(--oui-motion-medium) var(--oui-ease);border-radius:50%;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #00000040}.oui-switch:hover .oui-switch__thumb{transform:scale(1.05)}.oui-switch:active .oui-switch__thumb{width:26px}.oui-switch[aria-checked=true] .oui-switch__track{background:var(--oui-switch-track-on)}.oui-switch[aria-checked=true] .oui-switch__thumb{border-color:#0000;transform:translate(20px)}.oui-switch[aria-checked=true]:hover .oui-switch__thumb{transform:translate(20px)scale(1.05)}.oui-switch[aria-checked=true]:active .oui-switch__thumb{width:26px;transform:translate(16px)}.oui-switchbar-layout{flex-direction:column;height:100%;min-height:0;display:flex}.oui-switchbar{background:var(--oui-surface);height:64px;transition:background-color var(--oui-motion-medium) var(--oui-ease);flex:none;align-items:center;gap:12px;margin-bottom:20px;padding:0 16px;display:flex}.oui-switchbar[data-on=true]{background:#0000000d}[data-oneui-theme=dark] .oui-switchbar[data-on=true]{background:#ffffff26}.oui-switchbar__label{min-width:0;color:var(--oui-text);white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:17px;font-weight:600;overflow:hidden}.oui-switchbar__spinner{border:2px solid var(--oui-slider-rail);border-top-color:var(--oui-primary);border-radius:50%;flex:none;width:20px;height:20px;animation:.9s linear infinite oui-switchbar-spin}@keyframes oui-switchbar-spin{to{transform:rotate(360deg)}}.oui-switchbar__content{flex:1;min-height:0;overflow-y:auto}.oui-switchbar__action{color:var(--oui-primary-dark);border-radius:var(--oui-radius-lg);cursor:pointer;background:0 0;border:none;padding:8px 12px;font-family:inherit;font-size:15px;font-weight:600}.oui-separator--label{align-items:center;min-height:20px;padding:13px 24px 5px;display:flex}.oui-separator__text{color:var(--oui-subheader-text);white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:13px;font-weight:700;line-height:1.2;overflow:hidden}.oui-separator--line{background:var(--oui-divider);height:1px;margin:9.5px 0}.oui-toast-host{z-index:10000;pointer-events:none;position:fixed;top:0;bottom:0;left:0;right:0}.oui-toast-viewport{z-index:10000;pointer-events:none;flex-direction:column;align-items:center;gap:8px;max-width:min(520px,100vw - 32px);display:flex;position:fixed;left:50%;transform:translate(-50%)}.oui-toast-viewport--bottom{bottom:48px}.oui-toast-viewport--top{top:48px}.oui-toast-viewport--center{top:50%;transform:translate(-50%,-50%)}.oui-toast{background:var(--oui-toast-bg);min-height:44px;color:var(--oui-toast-text);box-shadow:var(--oui-shadow-2);animation:oui-toast-in var(--oui-motion-medium) var(--oui-ease) both;border-radius:22px;justify-content:center;align-items:center;padding:9px 20px;display:flex}.oui-toast__text{text-align:center;word-break:break-word;font-size:16px;line-height:1.3}@keyframes oui-toast-in{0%{opacity:0;transform:translateY(12px)scale(.96)}to{opacity:1;transform:translateY(0)scale(1)}}.oui-page{--oui-header-bg:var(--oui-bg);background:var(--oui-header-bg);height:100%;min-height:0;color:var(--oui-text);flex-direction:column;display:flex}.oui-page__scroll{overscroll-behavior:contain;flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden auto}.oui-page__toolbar{z-index:3;background:var(--oui-header-bg);flex:none;align-items:center;gap:4px;height:56px;padding:0 4px;display:flex;position:sticky;top:0}.oui-page__nav{width:48px;height:48px;color:var(--oui-primary-icon,var(--oui-text));cursor:pointer;background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.oui-page__nav-spacer{flex:none;width:8px}.oui-page__nav-badge{box-sizing:border-box;background:var(--oui-badge);color:#fff;border:2px solid var(--oui-header-bg);border-radius:9px;justify-content:center;align-items:center;min-width:17px;height:17px;padding:0 4px;font-size:11px;font-weight:700;line-height:1;display:inline-flex;position:absolute;top:4px;right:4px}.oui-page__collapsed-title{letter-spacing:.1px;white-space:nowrap;text-overflow:ellipsis;min-width:0;transition:opacity var(--oui-motion-fast) var(--oui-ease);flex:0 auto;font-size:18px;font-weight:700;overflow:hidden}.oui-page__toolbar>.oui-page__collapsed-title:first-child{margin-left:20px}.oui-page__toolbar-spacer{flex:1;min-width:8px}.oui-page__actions{align-items:center;display:flex}.oui-page__actions>*{flex:none}.oui-page__title-block{flex:none;padding:4px 24px 18px}.oui-page:not([data-collapsed]) .oui-page__title-block{padding-top:6px}.oui-page__expanded-title{font-family:var(--oui-font-title);letter-spacing:-.2px;color:var(--oui-text);overflow-wrap:anywhere;margin:0;font-size:30px;font-weight:700;line-height:1.2}.oui-page__expanded-subtitle{color:var(--oui-text-secondary);margin:6px 0 0;font-size:14px;font-weight:400;line-height:1.4}.oui-page__surface{background:var(--oui-surface);border-radius:var(--oui-radius-page) var(--oui-radius-page) 0 0;color:var(--oui-text);flex:1 0 auto;min-width:0}.oui-page__footer{background:var(--oui-header-bg);flex:none}.oui-page__search{align-items:center;gap:4px;width:100%;display:flex}.oui-page__search-input{border-radius:var(--oui-radius-xl);min-width:0;height:40px;color:var(--oui-text);-webkit-appearance:none;appearance:none;background:#0000000d;border:none;outline:none;flex:1;padding:0 8px;font-family:inherit;font-size:16px}[data-oneui-theme=dark] .oui-page__search-input{background:#ffffff14}.oui-page__search-input::placeholder{color:var(--oui-text-secondary)}.oui-page__search-input::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}.oui-page__search-icon{width:40px;height:40px;color:var(--oui-text-secondary);justify-content:center;align-items:center;display:inline-flex}.oui-page__action-mode{align-items:center;gap:4px;width:100%;display:flex}.oui-page__action-count{white-space:nowrap;text-overflow:ellipsis;font-size:18px;font-weight:700;overflow:hidden}.oui-page__action-all{cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;padding:8px 12px;font-size:15px;font-weight:600;display:inline-flex}.oui-page__action-all input{width:18px;height:18px;accent-color:var(--oui-primary);cursor:pointer}.oui-bottom-nav{width:100%;min-height:64px;padding:4px 0 max(4px, env(safe-area-inset-bottom));background:var(--oui-bg);align-items:stretch;display:flex}.oui-bottom-nav__item{min-width:0;color:var(--oui-text-secondary);cursor:pointer;transition:color var(--oui-motion-fast) var(--oui-ease);background:0 0;border:none;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:4px;padding:6px 4px;font-family:inherit;display:flex;position:relative}.oui-bottom-nav__item.is-active{color:var(--oui-primary)}.oui-bottom-nav__item:disabled{opacity:.4;cursor:default}.oui-bottom-nav__icon{justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex;position:relative}.oui-bottom-nav__icon svg{width:24px;height:24px}.oui-bottom-nav__badge{box-sizing:border-box;background:var(--oui-badge);color:#fff;border-radius:8px;justify-content:center;align-items:center;min-width:16px;height:16px;padding:0 4px;font-size:10px;font-weight:700;line-height:1;display:inline-flex;position:absolute;top:-4px;right:-8px}.oui-bottom-nav__label{white-space:nowrap;text-overflow:ellipsis;max-width:100%;font-size:12px;font-weight:600;overflow:hidden}.oui-bottom-nav--shifting .oui-bottom-nav__label{opacity:0;transition:opacity var(--oui-motion-fast) var(--oui-ease), transform var(--oui-motion-fast) var(--oui-ease);transform:translateY(4px)}.oui-bottom-nav--shifting .oui-bottom-nav__item.is-active .oui-bottom-nav__label{opacity:1;transform:translateY(0)}.oui-drawer-root{z-index:9000;pointer-events:none;position:fixed;top:0;bottom:0;left:0;right:0}.oui-drawer-root.is-open{pointer-events:auto}.oui-drawer__scrim{background:var(--oui-drawer-dim);opacity:0;transition:opacity var(--oui-motion-medium) var(--oui-ease);position:absolute;top:0;bottom:0;left:0;right:0}.oui-drawer-root.is-open .oui-drawer__scrim{opacity:1}.oui-drawer{background:var(--oui-surface);color:var(--oui-text);transition:transform var(--oui-motion-medium) var(--oui-ease);outline:none;flex-direction:column;display:flex;position:absolute;top:16px;bottom:0;left:0;overflow:hidden;transform:translate(-105%);box-shadow:4px 0 24px #0000002e}.oui-drawer-root.is-open .oui-drawer{transform:translate(0)}.oui-drawer__header{flex:none;padding:8px}.oui-drawer__content{flex:1;min-height:0;overflow-y:auto}.oui-splash{background:var(--oui-bg);width:100%;height:100%;min-height:240px;color:var(--oui-text);-webkit-user-select:none;user-select:none;flex-direction:column;justify-content:center;align-items:center;display:flex}.oui-splash__image{justify-content:center;align-items:center;width:80px;height:80px;display:flex}.oui-splash__image svg{width:80px;height:80px}.oui-splash__title{font-family:var(--oui-font-title);text-align:center;color:var(--oui-text);margin:5px 0 0;font-size:30px;font-weight:600}.oui-splash__image--animated{transform-origin:50% 40%;animation:.56s ease-out both oui-splash-wiggle}.oui-splash__image--animated.is-looping{animation:.56s ease-out infinite oui-splash-wiggle}@keyframes oui-splash-wiggle{0%{transform:rotate(0)}12.5%{transform:rotate(25deg)}37.5%{transform:rotate(-45deg)}62.5%{transform:rotate(35deg)}87.5%{transform:rotate(-25deg)}94%{transform:rotate(10deg)}to{transform:rotate(0)}}.oui-progress-circle{color:var(--oui-primary);justify-content:center;align-items:center;display:inline-flex;position:relative}.oui-progress-circle__track{stroke:var(--oui-slider-rail);opacity:.5}.oui-progress-circle__bar{stroke:currentColor}.oui-progress-circle.is-indeterminate .oui-progress-circle__bar{stroke-dasharray:.75 1;transform-origin:50%;animation:1.1s cubic-bezier(.4,0,.2,1) infinite oui-circle-spin}@keyframes oui-circle-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.oui-progress-circle__message{max-width:100%;color:var(--oui-dialog-text);white-space:nowrap;justify-content:center;align-items:center;font-size:14px;font-weight:600;display:flex;position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden}.oui-progress-linear-wrap{width:100%}.oui-progress-linear{background:var(--oui-slider-rail);border-radius:2px;width:100%;height:4px;position:relative;overflow:hidden}.oui-progress-linear__bar{background:var(--oui-primary);height:100%;transition:width var(--oui-motion-medium) var(--oui-ease);border-radius:2px}.oui-progress-linear.is-indeterminate .oui-progress-linear__bar{animation:1.4s ease-in-out infinite oui-linear-indeterminate;width:40%!important}@keyframes oui-linear-indeterminate{0%{transform:translate(-100%)}to{transform:translate(350%)}}.oui-progress-linear__footer{color:var(--oui-dialog-subtext);justify-content:space-between;gap:12px;margin-top:6px;font-size:14px;display:flex}.oui-app-info{background:var(--oui-surface);width:100%;min-height:100%;color:var(--oui-text);flex-direction:column;display:flex;overflow-y:auto}.oui-app-info__upper{flex-direction:column;flex:1;justify-content:center;align-items:center;width:100%;padding:32px 0;display:flex}.oui-app-info__icon{width:80px;height:80px;margin-bottom:16px}.oui-app-info__icon svg{width:100%;height:100%}.oui-app-info__name{font-family:var(--oui-font-title);text-align:center;color:var(--oui-text);overflow-wrap:anywhere;margin:0 24px 8px;font-size:38px;font-weight:600;line-height:1.15}.oui-app-info__version{text-align:center;color:var(--oui-text-muted);margin:0 24px 8px;padding-top:2px;font-size:14px}.oui-app-info__progress{margin:8px 0}.oui-app-info__notice{text-align:center;color:var(--oui-text-muted);margin:8px 24px;font-size:14px;line-height:1.4}.oui-app-info__actions{flex-wrap:wrap;justify-content:center;align-items:center;gap:12px;margin-top:15px;display:flex}.oui-app-info__button{border-radius:22px;min-height:44px;padding:8px 16px;font-size:17px;font-weight:700}.oui-app-info__button--default{background:var(--oui-appinfo-btn-bg);color:var(--oui-appinfo-btn-text);border:none}.oui-app-info__button--default:hover{filter:brightness(.97)}.oui-app-info__children{width:100%;margin-top:24px}.oui-tabs{scrollbar-width:none;align-items:stretch;gap:0;width:100%;min-height:48px;display:flex;overflow-x:auto}.oui-tabs::-webkit-scrollbar{display:none}.oui-tabs__tab{min-width:64px;min-height:48px;color:var(--oui-text-secondary);cursor:pointer;white-space:nowrap;transition:color var(--oui-motion-fast) var(--oui-ease);background:0 0;border:none;flex:1 0 auto;justify-content:center;align-items:center;gap:8px;padding:0 16px;font-family:inherit;font-size:14px;font-weight:600;display:inline-flex;position:relative}.oui-tabs__tab:disabled{opacity:.4;cursor:default}.oui-tabs__tab.is-active{color:var(--oui-primary)}.oui-tabs__icon{display:inline-flex}.oui-tabs__badge{box-sizing:border-box;background:var(--oui-badge);color:#fff;border-radius:8px;justify-content:center;align-items:center;min-width:16px;height:16px;padding:0 4px;font-size:10px;font-weight:700;display:inline-flex}.oui-tabs--underline{border-bottom:1px solid var(--oui-divider)}.oui-tabs__indicator{background:var(--oui-primary);transform-origin:50%;width:100%;max-width:64px;height:3px;transition:transform var(--oui-motion-medium) var(--oui-ease);border-radius:3px 3px 0 0;position:absolute;bottom:0;left:50%;transform:translate(-50%)scaleX(0)}.oui-tabs__tab.is-active .oui-tabs__indicator{transform:translate(-50%)scaleX(1)}.oui-tabs--pill{border-bottom:none;gap:8px;padding-block-start:6px;padding-block-end:6px}.oui-tabs--pill .oui-tabs__tab{border-radius:var(--oui-radius-xl);min-height:43px;color:var(--oui-text);flex:1 1 0;font-weight:600}.oui-tabs--pill .oui-tabs__tab.is-active{background:var(--oui-link-bg);color:var(--oui-link-text)}.oui-tabs--pill .oui-tabs__tab:hover:not(.is-active){background:#0000000a}.oui-slider-wrap{width:100%}.oui-slider-wrap--stepper{grid-template-columns:32px 1fr 32px;align-items:center;column-gap:8px;display:grid}.oui-slider-wrap__track{min-width:0}.oui-slider-wrap__readout{grid-column:1/-1}.oui-slider{cursor:pointer;touch-action:none;-webkit-tap-highlight-color:transparent;align-items:center;height:32px;min-height:32px;display:flex;position:relative}.oui-slider.is-disabled{opacity:.4;pointer-events:none;cursor:default}.oui-slider__rail{background:var(--oui-slider-rail);border-radius:2px;width:100%;height:4px;position:relative;overflow:visible}.oui-slider__fill{top:0;bottom:0;left:var(--oui-slider-fill-start,0%);width:calc(var(--oui-slider-fill-end,0%) - var(--oui-slider-fill-start,0%));background:var(--oui-slider-fill);min-width:4px;transition:background-color var(--oui-motion-fast) var(--oui-ease);border-radius:2px;position:absolute}.oui-slider.is-range .oui-slider__fill{background:var(--oui-slider-overlap)}.oui-slider__ticks{pointer-events:none;height:0;position:absolute;top:50%;left:0;right:0}.oui-slider__tick{background:var(--oui-slider-tick);border-radius:50%;width:7px;height:7px;position:absolute;top:50%;transform:translate(-50%,-50%)}.oui-slider__thumb{background:var(--oui-slider-thumb);width:18px;height:18px;transition:transform var(--oui-motion-fast) var(--oui-ease);pointer-events:none;border:1px solid #0000002e;border-radius:50%;margin-left:-9px;position:absolute;top:50%;transform:translateY(-50%);box-shadow:0 1px 3px #0000004d}.oui-slider:hover .oui-slider__thumb,.oui-slider__thumb.is-dragging{transform:translateY(-50%)scale(1.12)}.oui-slider:focus-visible .oui-slider__thumb{outline:2px solid var(--oui-primary);outline-offset:2px}.oui-slider__value{text-align:center;color:var(--oui-primary-dark);margin-top:4px;font-size:14px;font-weight:600}.oui-slider__hidden-input{display:none}.oui-slider__stepper{cursor:pointer;width:32px;height:32px;transition:background-color var(--oui-motion-fast) var(--oui-ease);background:#0000000d;border:none;border-radius:50%;justify-content:center;align-items:center;padding:0;display:inline-flex}[data-oneui-theme=dark] .oui-slider__stepper{background:#ffffff14}.oui-slider__stepper:hover:not(:disabled){background:#0000001a}.oui-slider__stepper:disabled{opacity:.35;cursor:default}.oui-slider__stepper--minus{color:var(--oui-red)}.oui-slider__stepper--plus{color:var(--oui-green)}.oui-dialog-root{z-index:9500;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.oui-dialog__scrim{background:var(--oui-overlay);animation:oui-fade-in var(--oui-motion-medium) var(--oui-ease) both;position:absolute;top:0;bottom:0;left:0;right:0}.oui-dialog{background:var(--oui-dialog-bg);width:100%;min-width:280px;max-height:min(720px,100vh - 48px);color:var(--oui-dialog-text);border-radius:var(--oui-radius-dialog);box-shadow:var(--oui-shadow-2);animation:oui-dialog-in var(--oui-motion-medium) var(--oui-ease) both;flex-direction:column;display:flex;position:relative;overflow:hidden}.oui-dialog__title{color:var(--oui-dialog-text);margin:0;padding:24px 24px 0;font-size:20px;font-weight:700;line-height:1.3}.oui-dialog__body{color:var(--oui-dialog-text);padding:16px 24px 24px;font-size:16px;line-height:24px;overflow-y:auto}.oui-dialog__title+.oui-dialog__body{padding-top:12px}.oui-dialog__body:first-child{padding-top:24px}.oui-dialog__actions{border-top:1px solid var(--oui-divider);align-items:stretch;display:flex}.oui-dialog__actions>*{flex:1 1 0;min-width:0}.oui-dialog__actions>*+*{border-left:1px solid var(--oui-divider)}.oui-dialog__button{min-height:52px;color:var(--oui-action);cursor:pointer;white-space:nowrap;text-overflow:ellipsis;transition:background-color var(--oui-motion-fast) var(--oui-ease);background:0 0;border:none;padding:8px 12px;font-family:inherit;font-size:16px;font-weight:600;overflow:hidden}.oui-dialog__button:hover:not(:disabled){background:#0381fe14}.oui-dialog__button:active:not(:disabled){background:#0381fe29}.oui-dialog__button:disabled{opacity:.4;cursor:default}.oui-dialog__button.is-emphasis{font-weight:700}@keyframes oui-dialog-in{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}@keyframes oui-fade-in{0%{opacity:0}to{opacity:1}}.oui-progress-dialog__circle{justify-content:center;align-items:center;min-height:70px;padding:8px 0;display:flex}.oui-progress-dialog--circle .oui-dialog__body{padding:24px}.oui-progress-dialog__spinner{align-items:center;gap:16px;padding:20px 24px;display:flex}.oui-progress-dialog__message{min-width:0;color:var(--oui-dialog-text);overflow-wrap:anywhere;flex:1;font-size:16px;line-height:1.5}.oui-progress-dialog__horizontal{padding:20px 24px}.oui-progress-dialog__horizontal .oui-progress-dialog__message{color:var(--oui-dialog-subtext);margin-bottom:4px;font-size:14px;display:block}.oui-progress-dialog__bar-space{padding:8px 0}.oui-progress-dialog__footer{color:var(--oui-dialog-subtext);justify-content:space-between;font-size:14px;display:flex}.oui-grid-menu .oui-dialog__body{padding:20px 16px}.oui-grid-menu__grid{grid-template-columns:repeat(var(--oui-grid-columns,4), minmax(0, 1fr));gap:8px;display:grid}@media (max-width:380px){.oui-grid-menu__grid{grid-template-columns:repeat(3,minmax(0,1fr))}}.oui-grid-menu__item{border-radius:var(--oui-radius-sm);min-width:0;min-height:84px;color:var(--oui-grid-item-text);cursor:pointer;background:0 0;border:none;flex-direction:column;align-items:center;gap:8px;padding:12px 4px;font-family:inherit;display:flex}.oui-grid-menu__item:disabled{opacity:.4;cursor:default}.oui-grid-menu__icon{width:40px;height:40px;color:var(--oui-grid-item-text);justify-content:center;align-items:center;display:inline-flex;position:relative}.oui-grid-menu__icon svg{width:26px;height:26px}.oui-grid-menu__badge{box-sizing:border-box;background:var(--oui-badge);color:#fff;border-radius:9px;justify-content:center;align-items:center;min-width:17px;height:17px;padding:0 4px;font-size:11px;font-weight:700;line-height:1;display:inline-flex;position:absolute;top:-4px;right:-10px}.oui-grid-menu__label{text-align:center;color:var(--oui-grid-item-text);overflow-wrap:anywhere;font-size:13px;font-weight:500;line-height:1.25}.oui-related-card{border-radius:var(--oui-radius-xl);background:var(--oui-link-bg);margin:20px 0;padding:20px 24px 20px 0}.oui-related-card__title{color:var(--oui-text-strong);margin:0 0 10px;padding-left:24px;font-size:18px;font-weight:700;line-height:1.3}.oui-related-card__links{flex-direction:column;align-items:flex-start;padding-left:32px;display:flex}.oui-related-card__link{border-radius:var(--oui-radius-xl);text-align:left;cursor:pointer;max-width:100%;transition:background-color var(--oui-motion-fast) var(--oui-ease);background:0 0;border:none;align-items:center;padding:6px 16px;font-family:inherit;text-decoration:none;display:inline-flex}.oui-related-card__link:hover{background:var(--oui-link-bg-pressed)}.oui-related-card__label{color:var(--oui-link-text);overflow-wrap:anywhere;font-size:16px;font-weight:700;line-height:1.4}.oui-tip{z-index:9800;background:var(--oui-tip-bg);max-width:min(320px,100vw - 24px);color:var(--oui-tip-text);box-shadow:var(--oui-shadow-2);animation:oui-tip-in var(--oui-motion-fast) var(--oui-ease) both;border-radius:14px;flex-direction:column;align-items:flex-start;padding:16px 18px;display:flex;position:fixed}.oui-tip__message{color:var(--oui-tip-text);font-size:15px;line-height:1.45}.oui-tip__action{min-height:36px;color:var(--oui-tip-text);cursor:pointer;background:0 0;border:none;border-radius:8px;margin-top:4px;padding:8px 9px;font-family:inherit;font-size:15px;font-weight:700}.oui-tip__action:hover{background:#ffffff14}.oui-tip__arrow{border:8px solid #0000;width:0;height:0;position:absolute}.oui-tip--top .oui-tip__arrow{bottom:-12px;left:var(--oui-tip-arrow-x,50%);border-top-color:var(--oui-tip-bg);border-width:6px 8px;border-bottom-style:none;border-bottom-color:currentColor;transform:translate(-50%)}.oui-tip--bottom .oui-tip__arrow{top:-12px;left:var(--oui-tip-arrow-x,50%);border-bottom-color:var(--oui-tip-bg);border-width:6px 8px;border-top-style:none;border-top-color:currentColor;transform:translate(-50%)}@keyframes oui-tip-in{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.oui-pref-group__subheader{min-height:20px;color:var(--oui-subheader-text);align-items:center;padding:13px 24px 5px;font-size:13px;font-weight:700;line-height:1.2;display:flex}.oui-pref-group--card{border-radius:var(--oui-radius-xl);background:var(--oui-card);margin:12px 16px;overflow:hidden}.oui-pref-group--card .oui-pref-group__subheader{padding-top:20px}.oui-pref-group__items{flex-direction:column;display:flex}.oui-pref-group:not(.oui-pref-group--card){position:relative}.oui-pref{min-height:56px;color:var(--oui-text);align-items:center;gap:16px;padding:12px 24px;display:flex;position:relative}.oui-pref.is-disabled{opacity:.4}.oui-pref--interactive{cursor:pointer;-webkit-tap-highlight-color:transparent}.oui-pref__icon{width:24px;height:24px;color:var(--oui-text);flex:none;justify-content:center;align-items:center;display:flex}.oui-pref__icon svg{width:24px;height:24px}.oui-pref__text{flex:1;min-width:0}.oui-pref__title{color:var(--oui-text);overflow-wrap:anywhere;font-size:16px;line-height:1.4}.oui-pref__summary{color:var(--oui-text-secondary);overflow-wrap:anywhere;margin-top:3px;font-size:14px;line-height:1.4}.oui-pref__end{color:var(--oui-text-secondary);flex:none;align-items:center;gap:8px;font-size:14px;display:flex}.oui-pref-group__items>.oui-pref+.oui-pref:before{content:"";background:var(--oui-divider);height:1px;position:absolute;top:0;left:64px;right:0}.oui-pref-group__items>.oui-pref.no-icon+.oui-pref:before{left:24px}.oui-pref-switch .oui-pref__end{margin-right:-10px}.oui-pref-slider{display:block}.oui-pref-slider__controls{margin-top:10px}.oui-pref-description{color:var(--oui-desc-text);padding:20px 24px;font-size:14px;line-height:18px}.oui-pref-description a{color:var(--oui-desc-link);text-decoration:underline}.oui-pref-description--subheader{color:var(--oui-subheader-text);padding-bottom:0;font-size:13px;font-weight:700}.oui-hradio{align-items:stretch;width:100%;display:flex}.oui-hradio__item{cursor:pointer;min-width:0;color:var(--oui-radio-off);-webkit-tap-highlight-color:transparent;background:0 0;border:none;flex-direction:column;flex:1 1 0;align-items:center;padding:18px 8px 14px;font-family:inherit;display:flex;position:relative}.oui-hradio__item:disabled{opacity:.4;cursor:default}.oui-hradio__image{justify-content:center;align-items:center;width:48px;height:48px;margin-bottom:6px;display:flex}.oui-hradio__image img,.oui-hradio__image svg{max-width:100%;max-height:100%}.oui-hradio__title{text-align:center;margin-bottom:7px;font-size:20px;line-height:1.2}.oui-hradio__subtitle{text-align:center;font-size:15px;line-height:1.3}.oui-hradio__item.is-selected{color:var(--oui-primary-dark)}.oui-hradio__radio{border:2px solid;border-radius:50%;justify-content:center;align-items:center;width:20px;height:20px;margin-top:14px;display:flex}.oui-hradio__radio:after{content:"";width:10px;height:10px;transition:transform var(--oui-motion-fast) var(--oui-ease);background:currentColor;border-radius:50%;transform:scale(0)}.oui-hradio__item.is-selected .oui-hradio__radio:after{transform:scale(1)}.oui-hradio--image .oui-hradio__radio{order:-1;margin-top:0;margin-bottom:8px}.oui-hradio--image .oui-hradio__title{margin-bottom:0;font-size:15px}.oui-hradio--image .oui-hradio__subtitle{display:none}.oui-tips{background:var(--oui-tips-bg);color:var(--oui-text);padding-top:24px;position:relative}.oui-pref-group:not(.oui-pref-group--card) .oui-tips{border-radius:var(--oui-radius-xl)}.oui-tips__header{align-items:flex-start;gap:12px;margin:0 20px 0 24px;padding-bottom:8px;display:flex}.oui-tips__title{min-width:0;color:var(--oui-text);flex:1;margin:0;padding-right:10px;font-size:19px;font-weight:700;line-height:1.3}.oui-tips__close{width:32px;height:32px;color:var(--oui-text);cursor:pointer;background:0 0;border:none;border-radius:50%;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.oui-tips__close:hover{background:#0000000f}.oui-tips__close svg{width:22px;height:22px}.oui-tips__summary{color:var(--oui-text);margin:0 24px 8px;font-size:15px;line-height:19px}.oui-tips__children{margin:0 24px}.oui-tips__spacer{height:16px}.oui-tips__actions{justify-content:flex-end;gap:4px;margin:0 12px 14px;padding-top:4px;display:flex}.oui-tips__button{border-radius:var(--oui-radius-xl);min-height:34px;color:var(--oui-text);cursor:pointer;transition:background-color var(--oui-motion-fast) var(--oui-ease);background:0 0;border:none;padding:4px 12px;font-family:inherit;font-size:17px;font-weight:700}.oui-tips__button:hover{background:#0000000f}.oui-tips__button:active{background:#0000001a}.oui-color-picker{padding-top:4px}.oui-color-picker__grid{grid-template-columns:repeat(auto-fill,minmax(36px,1fr));gap:10px;display:grid}.oui-color-picker__swatch{aspect-ratio:1;cursor:pointer;background:linear-gradient(#0000, #0000), var(--swatch);width:100%;transition:transform var(--oui-motion-fast) var(--oui-ease);border:none;border-radius:50%;padding:0;position:relative;box-shadow:inset 0 0 0 1px #0000001f}.oui-color-picker__swatch:hover{transform:scale(1.08)}.oui-color-picker__swatch.is-selected:after{content:"";border:2px solid var(--oui-primary);border-radius:50%;position:absolute;top:-4px;bottom:-4px;left:-4px;right:-4px}.oui-color-picker__swatch.is-light{box-shadow:inset 0 0 0 1px #00000040}.oui-color-picker__alpha{align-items:center;gap:12px;margin-top:16px;display:flex}.oui-color-picker__alpha input[type=range]{accent-color:var(--oui-primary);flex:1}.oui-color-picker__alpha-value{min-width:40px;color:var(--oui-text-secondary);text-align:right;font-size:13px}
2
+ /*$vite$:1*/