@sortsys/ui 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.jsx CHANGED
@@ -1,6 +1,6 @@
1
1
  function F(e){let t=()=>["ss_button",e.isIconOnly?"ss_button--icon":"",e.class??""].filter(Boolean).join(" ");return<button type={e.type??"button"}class={t()}disabled={e.disabled}aria-label={e.ariaLabel}form={e.form}onclick={e.onclick}>
2
2
  {e.children}
3
- </button>}function we(e){let{icon:t,color:l,class:i,style:r,children:o,...h}=e;return<div{...h}class={`ss_callout ss_callout--${l} ${i??""}`}style={r}>
3
+ </button>}function we(e){let{icon:t,color:l,class:i,style:r,children:o,...f}=e;return<div{...f}class={`ss_callout ss_callout--${l} ${i??""}`}style={r}>
4
4
  <span class="ss_callout__icon">
5
5
  {t}
6
6
  </span>
@@ -16,7 +16,7 @@ function F(e){let t=()=>["ss_button",e.isIconOnly?"ss_button--icon":"",e.class??
16
16
  </button>}
17
17
  </div>}import{createEffect as ye,createMemo as V,createResource as ke,createSignal as j,For as N}from"solid-js";function Me(e){let t=V(()=>e.render(e.row)),[l]=ke(async()=>{let i=t();return i&&typeof i.then=="function"?await i:null});return<div>
18
18
  {(()=>{let i=t();return i&&typeof i.then=="function"?l()??"":i})()}
19
- </div>}function Ee(e){let[t,l]=j(-1),[i,r]=j(null),[o,h]=j(1),c=()=>Math.max(1,e.pageSize??25),f=V(()=>{let k=t(),E=i();if(k<0||!E)return e.rows;let D=e.columns[k];if(!D?.sortKey)return e.rows;let u=e.rows.map((b,n)=>({row:b,idx:n,key:D.sortKey(b)}));return u.sort((b,n)=>b.key===n.key?b.idx-n.idx:b.key<n.key?E==="asc"?-1:1:E==="asc"?1:-1),u.map(b=>b.row)}),a=V(()=>Math.max(1,Math.ceil(f().length/c()))),d=V(()=>{let E=(Math.min(o(),a())-1)*c();return f().slice(E,E+c())});ye(()=>{o()>a()&&h(a())});let s=k=>{if(t()!==k){l(k),r("asc"),h(1);return}if(i()==="asc"){r("desc");return}if(i()==="desc"){l(-1),r(null),h(1);return}r("asc"),h(1)},v=k=>{let E=Math.min(Math.max(1,k),a());h(E)},_=()=>e.paginationPosition??"bottom",y=()=>`ss_table ${_()==="top"?"ss_table--pagination-top":""} ${e.class??""}`,M=()=><div class="ss_table__pagination">
19
+ </div>}function Ee(e){let[t,l]=j(-1),[i,r]=j(null),[o,f]=j(1),a=()=>Math.max(1,e.pageSize??25),h=V(()=>{let k=t(),E=i();if(k<0||!E)return e.rows;let D=e.columns[k];if(!D?.sortKey)return e.rows;let u=e.rows.map((b,n)=>({row:b,idx:n,key:D.sortKey(b)}));return u.sort((b,n)=>b.key===n.key?b.idx-n.idx:b.key<n.key?E==="asc"?-1:1:E==="asc"?1:-1),u.map(b=>b.row)}),c=V(()=>Math.max(1,Math.ceil(h().length/a()))),d=V(()=>{let E=(Math.min(o(),c())-1)*a();return h().slice(E,E+a())});ye(()=>{o()>c()&&f(c())});let s=k=>{if(t()!==k){l(k),r("asc"),f(1);return}if(i()==="asc"){r("desc");return}if(i()==="desc"){l(-1),r(null),f(1);return}r("asc"),f(1)},v=k=>{let E=Math.min(Math.max(1,k),c());f(E)},_=()=>e.paginationPosition??"bottom",y=()=>`ss_table ${_()==="top"?"ss_table--pagination-top":""} ${e.class??""}`,M=()=><div class="ss_table__pagination">
20
20
  <button type="button"class="ss_table__page_button"disabled={o()===1}aria-label="Erste Seite"onclick={()=>v(1)}>
21
21
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-left-pipe"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M7 6v12"/><path d="M18 6l-6 6l6 6"/></svg>
22
22
  </button>
@@ -24,12 +24,12 @@ function F(e){let t=()=>["ss_button",e.isIconOnly?"ss_button--icon":"",e.class??
24
24
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-left"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M15 6l-6 6l6 6"/></svg>
25
25
  </button>
26
26
  <span class="ss_table__page_info">
27
- Seite {o()} von {a()}
27
+ Seite {o()} von {c()}
28
28
  </span>
29
- <button type="button"class="ss_table__page_button"disabled={o()===a()}aria-label="Nächste Seite"onclick={()=>v(o()+1)}>
29
+ <button type="button"class="ss_table__page_button"disabled={o()===c()}aria-label="Nächste Seite"onclick={()=>v(o()+1)}>
30
30
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M9 6l6 6l-6 6"/></svg>
31
31
  </button>
32
- <button type="button"class="ss_table__page_button"disabled={o()===a()}aria-label="Letzte Seite"onclick={()=>v(a())}>
32
+ <button type="button"class="ss_table__page_button"disabled={o()===c()}aria-label="Letzte Seite"onclick={()=>v(c())}>
33
33
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right-pipe"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M6 6l6 6l-6 6"/><path d="M17 5v13"/></svg>
34
34
  </button>
35
35
  </div>;return<div class={y()}style={e.style}>
@@ -64,84 +64,84 @@ function F(e){let t=()=>["ss_button",e.isIconOnly?"ss_button--icon":"",e.class??
64
64
  </table>
65
65
  </div>
66
66
  {_()==="bottom"&&M()}
67
- </div>}import{createSignal as K,For as Te,onCleanup as Q,onMount as Pe,Show as Ce,createEffect as De}from"solid-js";function Fe(e){let[t,l]=K(!1),[i,r]=K(!1),[o,h]=K("closed"),c,f=()=>l(!1);return De(()=>{if(t()){r(!0),requestAnimationFrame(()=>h("open"));return}if(!i())return;h("closed");let a=window.setTimeout(()=>r(!1),160);Q(()=>window.clearTimeout(a))}),Pe(()=>{let a=s=>{let v=s.target;!c||!v||c.contains(v)||f()},d=s=>{s.key==="Escape"&&f()};document.addEventListener("mousedown",a),window.addEventListener("keydown",d),Q(()=>{document.removeEventListener("mousedown",a),window.removeEventListener("keydown",d)})}),<div class={`ss_dropdown ${e.class??""}`}style={e.style}ref={a=>c=a}>
68
- <button type="button"class="ss_dropdown__trigger ss_button ss_button--icon"aria-haspopup="menu"aria-expanded={t()}aria-label={e.ariaLabel??"Aktionen \xF6ffnen"}onclick={()=>l(a=>!a)}>
67
+ </div>}import{createSignal as K,For as Te,onCleanup as Q,onMount as Pe,Show as Ce,createEffect as De}from"solid-js";function Fe(e){let[t,l]=K(!1),[i,r]=K(!1),[o,f]=K("closed"),a,h=()=>l(!1);return De(()=>{if(t()){r(!0),requestAnimationFrame(()=>f("open"));return}if(!i())return;f("closed");let c=window.setTimeout(()=>r(!1),160);Q(()=>window.clearTimeout(c))}),Pe(()=>{let c=s=>{let v=s.target;!a||!v||a.contains(v)||h()},d=s=>{s.key==="Escape"&&h()};document.addEventListener("mousedown",c),window.addEventListener("keydown",d),Q(()=>{document.removeEventListener("mousedown",c),window.removeEventListener("keydown",d)})}),<div class={`ss_dropdown ${e.class??""}`}style={e.style}ref={c=>a=c}>
68
+ <button type="button"class="ss_dropdown__trigger ss_button ss_button--icon"aria-haspopup="menu"aria-expanded={t()}aria-label={e.ariaLabel??"Aktionen \xF6ffnen"}onclick={()=>l(c=>!c)}>
69
69
  {e.icon??<svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-dots-vertical"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M11 12a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"/><path d="M11 19a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"/><path d="M11 5a1 1 0 1 0 2 0a1 1 0 1 0 -2 0"/></svg>}
70
70
  </button>
71
71
 
72
72
  <Ce when={i()}>
73
73
  <div class="ss_dropdown__menu"role="menu"data-state={o()}>
74
74
  <Te each={e.items}>
75
- {a=><button type="button"class="ss_dropdown__item"role={a.checked?"menuitemcheckbox":"menuitem"}aria-checked={a.checked?"true":void 0}onclick={async()=>{f(),await a.onclick?.()}}>
76
- <span class="ss_dropdown__item_icon">{a.icon}</span>
77
- <span class="ss_dropdown__item_label">{a.label}</span>
78
- {a.checked&&<span class="ss_dropdown__item_check"aria-hidden="true">
75
+ {c=><button type="button"class="ss_dropdown__item"role={c.checked?"menuitemcheckbox":"menuitem"}aria-checked={c.checked?"true":void 0}onclick={async()=>{h(),await c.onclick?.()}}>
76
+ <span class="ss_dropdown__item_icon">{c.icon}</span>
77
+ <span class="ss_dropdown__item_label">{c.label}</span>
78
+ {c.checked&&<span class="ss_dropdown__item_check"aria-hidden="true">
79
79
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-check"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M5 12l5 5l10 -10"/></svg>
80
80
  </span>}
81
81
  </button>}
82
82
  </Te>
83
83
  </div>
84
84
  </Ce>
85
- </div>}import{createMemo as Le,createSignal as Ie,onCleanup as Je}from"solid-js";var ee=200;function Oe(e){let[t,l]=Ie(e.initiallyExpanded?"auto":0),i=Le(()=>t()!==0),r,o,h=()=>{o&&clearTimeout(o);let c=r?.scrollHeight??0;if(i()){l(c),o=window.setTimeout(()=>l(0),1);return}l(c),o=window.setTimeout(()=>l("auto"),ee)};return Je(()=>{o&&clearTimeout(o)}),<div class={`ss_expandable ${e.class??""}`}style={e.style}data-state={i()?"open":"closed"}>
86
- <div class="ss_expandable__header"role="button"tabindex="0"aria-expanded={i()}onclick={h}onkeydown={c=>{(c.key==="Enter"||c.key===" ")&&(c.preventDefault(),h())}}>
85
+ </div>}import{createMemo as Le,createSignal as Ie,onCleanup as Je}from"solid-js";var ee=200;function Oe(e){let[t,l]=Ie(e.initiallyExpanded?"auto":0),i=Le(()=>t()!==0),r,o,f=()=>{o&&clearTimeout(o);let a=r?.scrollHeight??0;if(i()){l(a),o=window.setTimeout(()=>l(0),1);return}l(a),o=window.setTimeout(()=>l("auto"),ee)};return Je(()=>{o&&clearTimeout(o)}),<div class={`ss_expandable ${e.class??""}`}style={e.style}data-state={i()?"open":"closed"}>
86
+ <div class="ss_expandable__header"role="button"tabindex="0"aria-expanded={i()}onclick={f}onkeydown={a=>{(a.key==="Enter"||a.key===" ")&&(a.preventDefault(),f())}}>
87
87
  <span class="ss_expandable__icon"aria-hidden="true">
88
88
  {i()?<svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-down"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M6 9l6 6l6 -6"/></svg>:<svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M9 6l6 6l-6 6"/></svg>}
89
89
  </span>
90
90
  <span class="ss_expandable__title">{e.title}</span>
91
91
  </div>
92
92
 
93
- <div ref={c=>r=c}class="ss_expandable__content"style={{height:typeof t()=="number"?`${t()}px`:t(),"transition-duration":`${ee}ms`}}>
93
+ <div ref={a=>r=a}class="ss_expandable__content"style={{height:typeof t()=="number"?`${t()}px`:t(),"transition-duration":`${ee}ms`}}>
94
94
  <div class='ss_expandable__divider_wrapper'>
95
95
  <div class="ss_expandable__divider"/>
96
96
  {e.children}
97
97
  </div>
98
98
  </div>
99
- </div>}import{createContext as He,createEffect as B,createMemo as Xe,createSignal as T,createUniqueId as X,For as Y,onCleanup as I,onMount as J,untrack as Re,useContext as H}from"solid-js";import{createSignal as Be}from"solid-js";function A(){let[e,t]=Be(!1);return[e,async l=>{if(!e())try{t(!0),await l()}finally{t(!1)}}]}var O=He(),C=function(e){let[t,l]=A(),i={},r={loading:t,process:o=>l(()=>o(r)),field:o=>i[o]??null,setField:(o,h)=>{i[o]=h},delField:o=>{delete i[o]},setValues:o=>Object.entries(o).forEach(([h,c])=>i[h]?.setValue(c)),getValues:()=>Object.fromEntries(Object.entries(i).map(([o,h])=>[o,h.getValue()])),validate:()=>Promise.all(Object.values(i).map(o=>o.validate())).then(),hasError:()=>Object.values(i).some(o=>o.hasError()),submit:()=>l(async()=>{await r.validate(),!r.hasError()&&await e.onsubmit?.(r)})};return<form class="ss_form"onsubmit={o=>{o.preventDefault(),r.submit()}}>
99
+ </div>}import{createContext as He,createEffect as B,createMemo as Xe,createSignal as T,createUniqueId as X,For as Y,onCleanup as I,onMount as J,untrack as Re,useContext as H}from"solid-js";import{createSignal as Be}from"solid-js";function A(){let[e,t]=Be(!1);return[e,async l=>{if(!e())try{t(!0),await l()}finally{t(!1)}}]}var O=He(),C=function(e){let[t,l]=A(),i={},r={loading:t,process:o=>l(()=>o(r)),field:o=>i[o]??null,setField:(o,f)=>{i[o]=f},delField:o=>{delete i[o]},setValues:o=>Object.entries(o).forEach(([f,a])=>i[f]?.setValue(a)),getValues:async()=>{let o=Object.entries(i),f=await Promise.all(o.map(([,a])=>a.getValue()));return Object.fromEntries(o.map(([a],h)=>[a,f[h]]))},validate:()=>Promise.all(Object.values(i).map(o=>o.validate())).then(),hasError:()=>Object.values(i).some(o=>o.hasError()),submit:()=>l(async()=>{await r.validate(),!r.hasError()&&await e.onsubmit?.(r)})};return<form class="ss_form"onsubmit={o=>{o.preventDefault(),r.submit()}}>
100
100
  <O.Provider value={r}>
101
101
  {e.children}
102
102
  </O.Provider>
103
- </form>};C.Input=function(e){let t=H(O),[l,i]=T(""),[r,o]=T(null),h={getValue:()=>{let u=l().trim();return u||null},setValue:u=>{if(typeof u=="number"){i(u.toLocaleString());return}i(`${u}`)},hasError:()=>!!r(),validate:async()=>{let u=[...e.rules??[]];e.required&&u.unshift(C.rules.required);let b=await h.getValue();for(let n of u){let g=await n(b);if(g){o(g);return}}o(null)}};if(e.name&&t){let u=e.name;J(()=>t.setField(u,h)),I(()=>t.delField(u))}let c=null,[f,a]=T([]),[d,s]=T(-1),v;if(e.suggestions){let u=e.suggestions,[b,n]=T(!u.prepare);u.prepare&&J(async()=>{u.prepare&&(c=await u.prepare(),n(!0))});let g;B(()=>{if(clearTimeout(g??void 0),!b())return;a([]);let x=l().trim().toLowerCase();x&&(g=setTimeout(async()=>{let w=await u.getItems({query:x,init:c});a(w)},250))}),I(()=>clearTimeout(g??void 0))}B(()=>{let u=f();if(!u.length){s(-1);return}d()>=u.length&&s(u.length-1)});let _=u=>{let b=v;if(!b||u<0)return;let n=b.querySelectorAll("li")[u];if(!n)return;let g=n.offsetTop,x=g+n.offsetHeight,w=b.scrollTop,m=w+b.clientHeight;g<w?b.scrollTop=g:x>m&&(b.scrollTop=x-b.clientHeight)},y=u=>{let b=f();if(!b.length)return;let n=Math.max(-1,Math.min(d()+u,b.length-1));s(n),_(n)},M=u=>{i(e.suggestions.stringify({item:u,init:c})),s(-1)},k=u=>{if(f().length)if(u.key==="ArrowDown")u.preventDefault(),y(1);else if(u.key==="ArrowUp")u.preventDefault(),y(-1);else if(u.key==="Enter"&&d()>=0){u.preventDefault();let b=f()[d()];b&&M(b)}else u.key==="Escape"&&s(-1)},E=u=>{i(u),s(-1)},D=X();return<div class="ss_form_input">
103
+ </form>};C.Input=function(e){let t=H(O),[l,i]=T(""),[r,o]=T(null),f={getValue:()=>{let u=l().trim();return u||null},setValue:u=>{if(typeof u=="number"){i(u.toLocaleString());return}i(`${u}`)},hasError:()=>!!r(),validate:async()=>{let u=[...e.rules??[]];e.required&&u.unshift(C.rules.required);let b=await f.getValue();for(let n of u){let g=await n(b);if(g){o(g);return}}o(null)}};if(e.name&&t){let u=e.name;J(()=>t.setField(u,f)),I(()=>t.delField(u))}let a=null,[h,c]=T([]),[d,s]=T(-1),v;if(e.suggestions){let u=e.suggestions,[b,n]=T(!u.prepare);u.prepare&&J(async()=>{u.prepare&&(a=await u.prepare(),n(!0))});let g;B(()=>{if(clearTimeout(g??void 0),!b())return;c([]);let x=l().trim().toLowerCase();x&&(g=setTimeout(async()=>{let w=await u.getItems({query:x,init:a});c(w)},250))}),I(()=>clearTimeout(g??void 0))}B(()=>{let u=h();if(!u.length){s(-1);return}d()>=u.length&&s(u.length-1)});let _=u=>{let b=v;if(!b||u<0)return;let n=b.querySelectorAll("li")[u];if(!n)return;let g=n.offsetTop,x=g+n.offsetHeight,w=b.scrollTop,m=w+b.clientHeight;g<w?b.scrollTop=g:x>m&&(b.scrollTop=x-b.clientHeight)},y=u=>{let b=h();if(!b.length)return;let n=Math.max(-1,Math.min(d()+u,b.length-1));s(n),_(n)},M=u=>{i(e.suggestions.stringify({item:u,init:a})),s(-1)},k=u=>{if(h().length)if(u.key==="ArrowDown")u.preventDefault(),y(1);else if(u.key==="ArrowUp")u.preventDefault(),y(-1);else if(u.key==="Enter"&&d()>=0){u.preventDefault();let b=h()[d()];b&&M(b)}else u.key==="Escape"&&s(-1)},E=u=>{i(u),s(-1)},D=X();return<div class="ss_form_input">
104
104
  <label for={e.id||D}>{e.label}</label>
105
105
 
106
106
  <div class="ss__wrapper">
107
107
  {e.textArea?<textarea id={e.id||D}value={l()}oninput={u=>E(u.target.value)}onkeydown={k}disabled={e.disabled||t?.loading()}/>:<input id={e.id||D}value={l()}oninput={u=>E(u.target.value)}onkeydown={k}disabled={e.disabled||t?.loading()}type={e.type}/>}
108
108
 
109
- {!!f().length&&<ul class="ss__suggestions"ref={u=>v=u}>
110
- <Y each={f()}>
109
+ {!!h().length&&<ul class="ss__suggestions"ref={u=>v=u}>
110
+ <Y each={h()}>
111
111
  {(u,b)=>{let n=()=>{let g=document.activeElement;g instanceof HTMLElement&&g.blur(),M(u)};return<li onpointerdown={g=>g.preventDefault()}onclick={n}classList={{ss__hovered:b()===d()}}>
112
- {e.suggestions.stringify({item:u,init:c})}
112
+ {e.suggestions.stringify({item:u,init:a})}
113
113
  </li>}}
114
114
  </Y>
115
115
  </ul>}
116
116
  </div>
117
117
 
118
118
  {!!r()&&<span role="alert">{r()}</span>}
119
- </div>};C.Date=function(e){let t=H(O),[l,i]=T(""),[r,o]=T(null),[h,c]=T(!1),[f,a]=T(new Date),d,s=n=>`${n}`.padStart(2,"0"),v=n=>{let g=s(n.getDate()),x=s(n.getMonth()+1),w=n.getFullYear();return`${g}.${x}.${w}`},_=n=>{let g=n.trim();if(!g)return null;let x=/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/.exec(g);if(!x)return null;let w=Number(x[1]),m=Number(x[2]),S=Number(x[3]);if(!w||!m)return null;let p=new Date(S,m-1,w);return p.getFullYear()!==S||p.getMonth()!==m-1||p.getDate()!==w?null:p};B(()=>{if(!h())return;let n=_(l());a(n??new Date)});let y={getValue:()=>{let n=l().trim();return n||null},setValue:n=>{if(n instanceof Date){i(v(n));return}i(`${n??""}`)},hasError:()=>!!r(),validate:async()=>{let n=[...e.rules??[]];e.required&&n.unshift(C.rules.required);let g=await y.getValue();for(let x of n){let w=await x(g);if(w){o(w);return}}if(g&&!_(g)){o("Ung\xFCltiges Datum");return}o(null)}};if(e.name&&t){let n=e.name;J(()=>t.setField(n,y)),I(()=>t.delField(n))}let M=X(),k=n=>{let g=_(l());return g?g.getFullYear()===f().getFullYear()&&g.getMonth()===f().getMonth()&&g.getDate()===n:!1},E=n=>{let g=new Date;return g.getFullYear()===f().getFullYear()&&g.getMonth()===f().getMonth()&&g.getDate()===n},D=()=>{let n=f(),g=n.getFullYear(),x=n.getMonth(),w=new Date(g,x,1),m=new Date(g,x+1,0).getDate(),S=(w.getDay()+6)%7,p=[];for(let P=0;P<S;P+=1)p.push(null);for(let P=1;P<=m;P+=1)p.push(P);for(;p.length%7!==0;)p.push(null);return p},u=()=>f().toLocaleDateString("de-DE",{month:"long",year:"numeric"}),b=n=>{let g=new Date(f().getFullYear(),f().getMonth(),n);i(v(g)),c(!1)};return J(()=>{let n=x=>{if(!h())return;let w=x.target;d&&w&&!d.contains(w)&&c(!1)},g=x=>{x.key==="Escape"&&c(!1)};document.addEventListener("mousedown",n),window.addEventListener("keydown",g),I(()=>{document.removeEventListener("mousedown",n),window.removeEventListener("keydown",g)})}),<div class="ss_form_date"ref={n=>d=n}>
119
+ </div>};C.Date=function(e){let t=H(O),[l,i]=T(""),[r,o]=T(null),[f,a]=T(!1),[h,c]=T(new Date),d,s=n=>`${n}`.padStart(2,"0"),v=n=>{let g=s(n.getDate()),x=s(n.getMonth()+1),w=n.getFullYear();return`${g}.${x}.${w}`},_=n=>{let g=n.trim();if(!g)return null;let x=/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/.exec(g);if(!x)return null;let w=Number(x[1]),m=Number(x[2]),S=Number(x[3]);if(!w||!m)return null;let p=new Date(S,m-1,w);return p.getFullYear()!==S||p.getMonth()!==m-1||p.getDate()!==w?null:p};B(()=>{if(!f())return;let n=_(l());c(n??new Date)});let y={getValue:()=>{let n=l().trim();return n||null},setValue:n=>{if(n instanceof Date){i(v(n));return}i(`${n??""}`)},hasError:()=>!!r(),validate:async()=>{let n=[...e.rules??[]];e.required&&n.unshift(C.rules.required);let g=await y.getValue();for(let x of n){let w=await x(g);if(w){o(w);return}}if(g&&!_(g)){o("Ung\xFCltiges Datum");return}o(null)}};if(e.name&&t){let n=e.name;J(()=>t.setField(n,y)),I(()=>t.delField(n))}let M=X(),k=n=>{let g=_(l());return g?g.getFullYear()===h().getFullYear()&&g.getMonth()===h().getMonth()&&g.getDate()===n:!1},E=n=>{let g=new Date;return g.getFullYear()===h().getFullYear()&&g.getMonth()===h().getMonth()&&g.getDate()===n},D=()=>{let n=h(),g=n.getFullYear(),x=n.getMonth(),w=new Date(g,x,1),m=new Date(g,x+1,0).getDate(),S=(w.getDay()+6)%7,p=[];for(let P=0;P<S;P+=1)p.push(null);for(let P=1;P<=m;P+=1)p.push(P);for(;p.length%7!==0;)p.push(null);return p},u=()=>h().toLocaleDateString("de-DE",{month:"long",year:"numeric"}),b=n=>{let g=new Date(h().getFullYear(),h().getMonth(),n);i(v(g)),a(!1)};return J(()=>{let n=x=>{if(!f())return;let w=x.target;d&&w&&!d.contains(w)&&a(!1)},g=x=>{x.key==="Escape"&&a(!1)};document.addEventListener("mousedown",n),window.addEventListener("keydown",g),I(()=>{document.removeEventListener("mousedown",n),window.removeEventListener("keydown",g)})}),<div class="ss_form_date"ref={n=>d=n}>
120
120
  <label for={e.id||M}>{e.label}</label>
121
121
 
122
122
  <div class="ss__wrapper">
123
- <input id={e.id||M}value={l()}oninput={n=>i(n.target.value)}onfocus={()=>c(!0)}disabled={e.disabled||t?.loading()}readonly={!e.editable}type="text"inputmode="numeric"autocomplete="off"placeholder="TT.MM.JJJJ"/>
124
- <button type="button"class="ss_form_date__icon"aria-label="Kalender öffnen"aria-haspopup="dialog"aria-expanded={h()}onclick={()=>c(n=>!n)}disabled={e.disabled||t?.loading()}>
123
+ <input id={e.id||M}value={l()}oninput={n=>i(n.target.value)}onfocus={()=>a(!0)}disabled={e.disabled||t?.loading()}readonly={!e.editable}type="text"inputmode="numeric"autocomplete="off"placeholder="TT.MM.JJJJ"/>
124
+ <button type="button"class="ss_form_date__icon"aria-label="Kalender öffnen"aria-haspopup="dialog"aria-expanded={f()}onclick={()=>a(n=>!n)}disabled={e.disabled||t?.loading()}>
125
125
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="currentColor"class="icon icon-tabler icons-tabler-filled icon-tabler-calendar-week"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M16 2c.183 0 .355 .05 .502 .135l.033 .02c.28 .177 .465 .49 .465 .845v1h1a3 3 0 0 1 2.995 2.824l.005 .176v12a3 3 0 0 1 -2.824 2.995l-.176 .005h-12a3 3 0 0 1 -2.995 -2.824l-.005 -.176v-12a3 3 0 0 1 2.824 -2.995l.176 -.005h1v-1a1 1 0 0 1 .514 -.874l.093 -.046l.066 -.025l.1 -.029l.107 -.019l.12 -.007q .083 0 .161 .013l.122 .029l.04 .012l.06 .023c.328 .135 .568 .44 .61 .806l.007 .117v1h6v-1a1 1 0 0 1 1 -1m3 7h-14v9.625c0 .705 .386 1.286 .883 1.366l.117 .009h12c.513 0 .936 -.53 .993 -1.215l.007 -.16z"/><path d="M9.015 13a1 1 0 0 1 -1 1a1.001 1.001 0 1 1 -.005 -2c.557 0 1.005 .448 1.005 1"/><path d="M13.015 13a1 1 0 0 1 -1 1a1.001 1.001 0 1 1 -.005 -2c.557 0 1.005 .448 1.005 1"/><path d="M17.02 13a1 1 0 0 1 -1 1a1.001 1.001 0 1 1 -.005 -2c.557 0 1.005 .448 1.005 1"/><path d="M12.02 15a1 1 0 0 1 0 2a1.001 1.001 0 1 1 -.005 -2z"/><path d="M9.015 16a1 1 0 0 1 -1 1a1.001 1.001 0 1 1 -.005 -2c.557 0 1.005 .448 1.005 1"/></svg>
126
126
  </button>
127
127
  </div>
128
128
 
129
- {h()&&<div class="ss_form_date__picker"role="dialog"aria-label="Datum auswählen">
129
+ {f()&&<div class="ss_form_date__picker"role="dialog"aria-label="Datum auswählen">
130
130
  <div class="ss_form_date__header">
131
131
  <div class="ss_form_date__nav_group">
132
- <button type="button"class="ss_form_date__nav"onclick={()=>{let n=f();a(new Date(n.getFullYear()-1,n.getMonth(),1))}}>
132
+ <button type="button"class="ss_form_date__nav"onclick={()=>{let n=h();c(new Date(n.getFullYear()-1,n.getMonth(),1))}}>
133
133
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-left-pipe"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M7 6v12"/><path d="M18 6l-6 6l6 6"/></svg>
134
134
  </button>
135
- <button type="button"class="ss_form_date__nav"onclick={()=>{let n=f();a(new Date(n.getFullYear(),n.getMonth()-1,1))}}>
135
+ <button type="button"class="ss_form_date__nav"onclick={()=>{let n=h();c(new Date(n.getFullYear(),n.getMonth()-1,1))}}>
136
136
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-left"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M15 6l-6 6l6 6"/></svg>
137
137
  </button>
138
138
  </div>
139
139
  <div class="ss_form_date__title">{u()}</div>
140
140
  <div class="ss_form_date__nav_group">
141
- <button type="button"class="ss_form_date__nav"onclick={()=>{let n=f();a(new Date(n.getFullYear(),n.getMonth()+1,1))}}>
141
+ <button type="button"class="ss_form_date__nav"onclick={()=>{let n=h();c(new Date(n.getFullYear(),n.getMonth()+1,1))}}>
142
142
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M9 6l6 6l-6 6"/></svg>
143
143
  </button>
144
- <button type="button"class="ss_form_date__nav"onclick={()=>{let n=f();a(new Date(n.getFullYear()+1,n.getMonth(),1))}}>
144
+ <button type="button"class="ss_form_date__nav"onclick={()=>{let n=h();c(new Date(n.getFullYear()+1,n.getMonth(),1))}}>
145
145
  <svg xmlns="http://www.w3.org/2000/svg"width="24"height="24"viewBox="0 0 24 24"fill="none"stroke="currentColor"stroke-width="2"stroke-linecap="round"stroke-linejoin="round"class="icon icon-tabler icons-tabler-outline icon-tabler-chevron-right-pipe"><path stroke="none"d="M0 0h24v24H0z"fill="none"/><path d="M6 6l6 6l-6 6"/><path d="M17 5v13"/></svg>
146
146
  </button>
147
147
  </div>
@@ -157,14 +157,14 @@ function F(e){let t=()=>["ss_button",e.isIconOnly?"ss_button--icon":"",e.class??
157
157
  </div>}
158
158
 
159
159
  {!!r()&&<span role="alert">{r()}</span>}
160
- </div>};C.Checkbox=function(e){let t=H(O),[l,i]=T(!1),[r,o]=T(null),h={getValue:()=>l(),setValue:f=>i(!!f),hasError:()=>!!r(),validate:async()=>{let f=[...e.rules??[]];e.required&&f.unshift(C.rules.required);let a=await h.getValue();for(let d of f){let s=await d(a);if(s){o(s);return}}o(null)}};if(e.name&&t){let f=e.name;J(()=>t.setField(f,h)),I(()=>t.delField(f))}let c=X();return<div class="ss_form_checkbox">
160
+ </div>};C.Checkbox=function(e){let t=H(O),[l,i]=T(!1),[r,o]=T(null),f={getValue:()=>l(),setValue:h=>i(!!h),hasError:()=>!!r(),validate:async()=>{let h=[...e.rules??[]];e.required&&h.unshift(C.rules.required);let c=await f.getValue();for(let d of h){let s=await d(c);if(s){o(s);return}}o(null)}};if(e.name&&t){let h=e.name;J(()=>t.setField(h,f)),I(()=>t.delField(h))}let a=X();return<div class="ss_form_checkbox">
161
161
  <div class="ss__wrapper">
162
- <input id={e.id||c}type="checkbox"checked={l()}onchange={f=>i(f.target.checked)}disabled={e.disabled||t?.loading()}/>
163
- <label for={e.id||c}>{e.label}</label>
162
+ <input id={e.id||a}type="checkbox"checked={l()}onchange={h=>i(h.target.checked)}disabled={e.disabled||t?.loading()}/>
163
+ <label for={e.id||a}>{e.label}</label>
164
164
  </div>
165
165
 
166
166
  {!!r()&&<span role="alert">{r()}</span>}
167
- </div>};C.useContext=function(){let e=H(O);if(!e)return null;let{setField:t,delField:l,...i}=e;return i};C.Select=function(e){let t=H(O),[l,i]=T([]),[r,o]=T(null),[h,c]=T(null),f=s=>{let v=s.map(_=>({id:_.id,label:e.buildOption(_)}));if(i(v),!s.length){o(null);return}r()&&v.some(_=>_.id===r())||o(v[0].id)};B(()=>{let s=e.getOptions();"then"in s&&typeof s.then=="function"||s instanceof Promise?s.then(f):f(s)});let a={getValue:()=>{let s=r();return l().some(_=>_.id===s)?s:null},setValue:s=>{let v=l();if(!v.length){o(null);return}let _=v[0].id;if(typeof s!="string"){o(_);return}let y=s.trim();if(!v.some(M=>M.id===y)){o(_);return}o(y)},hasError:()=>!!h(),validate:async()=>{let s=l(),v=await a.getValue();if(!v){c("Pflichtfeld");return}if(!s.some(_=>_.id===v)){c("Option nicht verf\xFCgbar");return}for(let _ of e.rules??[]){let y=await _(v);if(y){c(y);return}}c(null)}};if(a.setOptions=f,e.name&&t){let s=e.name;J(()=>t.setField(s,a)),I(()=>t.delField(s))}let d=X();return<div class="ss_form_select">
167
+ </div>};C.useContext=function(){let e=H(O);if(!e)return null;let{setField:t,delField:l,...i}=e;return i};C.Select=function(e){let t=H(O),[l,i]=T([]),[r,o]=T(null),[f,a]=T(null),h=s=>{let v=s.map(_=>({id:_.id,label:e.buildOption(_)}));if(i(v),!s.length){o(null);return}r()&&v.some(_=>_.id===r())||o(v[0].id)};B(()=>{let s=e.getOptions();"then"in s&&typeof s.then=="function"||s instanceof Promise?s.then(h):h(s)});let c={getValue:()=>{let s=r();return l().some(_=>_.id===s)?s:null},setValue:s=>{let v=l();if(!v.length){o(null);return}let _=v[0].id;if(typeof s!="string"){o(_);return}let y=s.trim();if(!v.some(M=>M.id===y)){o(_);return}o(y)},hasError:()=>!!f(),validate:async()=>{let s=l(),v=await c.getValue();if(!v){a("Pflichtfeld");return}if(!s.some(_=>_.id===v)){a("Option nicht verf\xFCgbar");return}for(let _ of e.rules??[]){let y=await _(v);if(y){a(y);return}}a(null)}};if(c.setOptions=h,e.name&&t){let s=e.name;J(()=>t.setField(s,c)),I(()=>t.delField(s))}let d=X();return<div class="ss_form_select">
168
168
  <label for={e.id||d}>{e.label}</label>
169
169
 
170
170
  <div class="ss_form_select__field">
@@ -178,13 +178,13 @@ function F(e){let t=()=>["ss_button",e.isIconOnly?"ss_button--icon":"",e.class??
178
178
  </span>
179
179
  </div>
180
180
 
181
- {!!h()&&<span role="alert">{h()}</span>}
182
- </div>};C.ACSelect=function(e){let t=H(O),[l,i]=T(""),[r,o]=T([]),[h,c]=T(null),f={getValue:()=>r(),setValue:m=>o(m),hasError:()=>!!h(),validate:async()=>{let m=await f.getValue(),S=e.minSelectedItems,p=e.maxSelectedItems;if(S&&m.length<S){c(`Mindestens ${S} ${S>1?"Elemente m\xFCssen":"Element muss"} ausgew\xE4hlt werden`);return}if(p&&m.length>p){c(`Maximal ${p} ${p>1?"Elemente d\xFCrfen":"Element darf"} ausgew\xE4hlt werden`);return}for(let P of e.rules??[]){let L=await P(m);if(L){c(L);return}}c(null)}};if(e.name&&t){let m=e.name;J(()=>t.setField(m,f)),I(()=>t.delField(m))}let a=null,[d,s]=T(!e.prepare);e.prepare&&J(async()=>{e.prepare&&(a=await e.prepare(),s(!0))});let[v,_]=T([]),[y,M]=T(-1),k,E;B(()=>{if(!d())return;clearTimeout(E);let m=l().trim().toLowerCase();if(!m){_(Re(()=>r()));return}_([]),E=setTimeout(async()=>{let S=await e.getOptions({query:m,init:a});_(S)},250)}),B(()=>{l().trim().toLowerCase()||v().length!==r().length&&_(r())}),I(()=>clearTimeout(E)),B(()=>{let m=v();if(!m.length){M(-1);return}y()>=m.length&&M(m.length-1)});let D=m=>{let S=k;if(!S||m<0)return;let p=S.querySelectorAll("li")[m];if(!p)return;let P=p.offsetTop,L=P+p.offsetHeight,G=S.scrollTop,Se=G+S.clientHeight;P<G?S.scrollTop=P:L>Se&&(S.scrollTop=L-S.clientHeight)},u=m=>{let S=v();if(!S.length)return;let p=Math.max(-1,Math.min(y()+m,S.length-1));M(p),D(p)},b=X(),n=Xe(()=>new Set(r().map(({id:m})=>m))),g=(m,S=!0)=>{let p=n().has(m.id);if(e.maxSelectedItems===1){o(p?[]:[m]),i(""),S&&M(-1);return}o(p?P=>P.filter(({id:L})=>L!==m.id):P=>[...P.filter(({id:L})=>L!==m.id),m]),S&&M(-1)},x=m=>{if(v().length)if(m.key==="ArrowDown")m.preventDefault(),u(1);else if(m.key==="ArrowUp")m.preventDefault(),u(-1);else if(m.key==="Enter"&&y()>=0){m.preventDefault();let S=v()[y()];S&&g(S,!1)}else m.key==="Escape"&&M(-1)},w=()=>e.disabled||t?.loading();return<div class="ss_form_ac_select">
181
+ {!!f()&&<span role="alert">{f()}</span>}
182
+ </div>};C.ACSelect=function(e){let t=H(O),[l,i]=T(""),[r,o]=T([]),[f,a]=T(null),h={getValue:()=>r(),setValue:m=>o(m),hasError:()=>!!f(),validate:async()=>{let m=await h.getValue(),S=e.minSelectedItems,p=e.maxSelectedItems;if(S&&m.length<S){a(`Mindestens ${S} ${S>1?"Elemente m\xFCssen":"Element muss"} ausgew\xE4hlt werden`);return}if(p&&m.length>p){a(`Maximal ${p} ${p>1?"Elemente d\xFCrfen":"Element darf"} ausgew\xE4hlt werden`);return}for(let P of e.rules??[]){let L=await P(m);if(L){a(L);return}}a(null)}};if(e.name&&t){let m=e.name;J(()=>t.setField(m,h)),I(()=>t.delField(m))}let c=null,[d,s]=T(!e.prepare);e.prepare&&J(async()=>{e.prepare&&(c=await e.prepare(),s(!0))});let[v,_]=T([]),[y,M]=T(-1),k,E;B(()=>{if(!d())return;clearTimeout(E);let m=l().trim().toLowerCase();if(!m){_(Re(()=>r()));return}_([]),E=setTimeout(async()=>{let S=await e.getOptions({query:m,init:c});_(S)},250)}),B(()=>{l().trim().toLowerCase()||v().length!==r().length&&_(r())}),I(()=>clearTimeout(E)),B(()=>{let m=v();if(!m.length){M(-1);return}y()>=m.length&&M(m.length-1)});let D=m=>{let S=k;if(!S||m<0)return;let p=S.querySelectorAll("li")[m];if(!p)return;let P=p.offsetTop,L=P+p.offsetHeight,G=S.scrollTop,Se=G+S.clientHeight;P<G?S.scrollTop=P:L>Se&&(S.scrollTop=L-S.clientHeight)},u=m=>{let S=v();if(!S.length)return;let p=Math.max(-1,Math.min(y()+m,S.length-1));M(p),D(p)},b=X(),n=Xe(()=>new Set(r().map(({id:m})=>m))),g=(m,S=!0)=>{let p=n().has(m.id);if(e.maxSelectedItems===1){o(p?[]:[m]),i(""),S&&M(-1);return}o(p?P=>P.filter(({id:L})=>L!==m.id):P=>[...P.filter(({id:L})=>L!==m.id),m]),S&&M(-1)},x=m=>{if(v().length)if(m.key==="ArrowDown")m.preventDefault(),u(1);else if(m.key==="ArrowUp")m.preventDefault(),u(-1);else if(m.key==="Enter"&&y()>=0){m.preventDefault();let S=v()[y()];S&&g(S,!1)}else m.key==="Escape"&&M(-1)},w=()=>e.disabled||t?.loading();return<div class="ss_form_ac_select">
183
183
  <label for={e.id||b}>{e.label}</label>
184
184
 
185
185
  {e.maxSelectedItems===1&&e.renderSelection&&r().length===1?<div class="ss__selection">
186
186
  <div class="ss__content">
187
- {e.renderSelection({item:r()[0],init:a})}
187
+ {e.renderSelection({item:r()[0],init:c})}
188
188
  </div>
189
189
  <button type="button"class="ss__clear"disabled={w()}aria-label="Auswahl entfernen"onclick={()=>{o([]),i(""),setTimeout(()=>document.getElementById(e.id||b)?.focus(),0)}}>
190
190
  ×
@@ -202,13 +202,13 @@ function F(e){let t=()=>["ss_button",e.isIconOnly?"ss_button--icon":"",e.class??
202
202
  {!!v().length&&<ul class="ss__suggestions"ref={m=>k=m}>
203
203
  <Y each={v()}>
204
204
  {(m,S)=>{let p=()=>{w()||(g(m),document.getElementById(e.id||b)?.focus())};return<li onpointerdown={P=>P.preventDefault()}onclick={p}classList={{ss__selected:n().has(m.id),ss__hovered:S()===y()}}>
205
- {e.renderItem({item:m,init:a})}
205
+ {e.renderItem({item:m,init:c})}
206
206
  </li>}}
207
207
  </Y>
208
208
  </ul>}
209
209
  </div>}
210
210
 
211
- {!!h()&&<span role="alert">{h()}</span>}
211
+ {!!f()&&<span role="alert">{f()}</span>}
212
212
  </div>};C.SubmitButton=function(e){let t=H(O);return<F type="submit"class="ss_form_submit"disabled={e.disabled||t?.loading()}>
213
213
  {e.children}
214
214
  </F>};C.rules={required:e=>e?null:"Pflichtfeld",minLength:e=>t=>{if(t===null&&(t=""),typeof t!="string")throw new Error(`invalid rule minLength(..) for non-string value ${t}`);return t.length<e?`Mindestens ${e} Zeichen`:null},maxLength:e=>t=>{if(t===null&&(t=""),typeof t!="string")throw new Error(`invalid rule maxLength(..) for non-string value ${t}`);return t.length<e?`Maximal ${e} Zeichen`:null},pattern:e=>t=>{if(t===null&&(t=""),typeof t!="string")throw new Error(`invalid rule pattern(..) for non-string value ${t}`);return e.test(t)?null:"Eingabe widerspricht erwartetem Muster"}};function Ve(e){return<div class={`ss_header ${e.class??""}`}style={e.style}>
@@ -217,11 +217,11 @@ function F(e){let t=()=>["ss_button",e.isIconOnly?"ss_button--icon":"",e.class??
217
217
  {e.subtitle&&<h5 class="ss_header__subtitle">{e.subtitle}</h5>}
218
218
  </div>
219
219
  <div class="ss_header__actions">{e.actions}</div>
220
- </div>}import{Show as U,createEffect as Ae,createSignal as te,createUniqueId as ze,onCleanup as W,onMount as $e}from"solid-js";import{Portal as Ne}from"solid-js/web";var Ke=180;function $(e){let[t,l]=te(e.open),[i,r]=te("closed"),o=ze(),h,c,f;Ae(()=>{h&&clearTimeout(h),c&&cancelAnimationFrame(c),e.open?(t()||l(!0),r("closed"),c=requestAnimationFrame(()=>r("open"))):(r("closed"),t()&&(h=window.setTimeout(()=>l(!1),Ke)))}),$e(()=>{if(!e.open)return;if(e.lockScroll!==!1){let s=document.body.style.overflowY;document.body.style.overflowY="hidden",W(()=>{document.body.style.overflowY=s})}c=requestAnimationFrame(()=>f?.focus());let d=s=>{s.key==="Escape"&&e.dismissible!==!1&&e.onClose?.()};window.addEventListener("keydown",d),W(()=>window.removeEventListener("keydown",d))}),W(()=>{h&&clearTimeout(h),c&&cancelAnimationFrame(c)});let a=()=>{e.dismissible!==!1&&e.onClose?.()};return<U when={t()}>
220
+ </div>}import{Show as U,createEffect as Ae,createSignal as te,createUniqueId as ze,onCleanup as W,onMount as $e}from"solid-js";import{Portal as Ne}from"solid-js/web";var Ke=180;function $(e){let[t,l]=te(e.open),[i,r]=te("closed"),o=ze(),f,a,h;Ae(()=>{f&&clearTimeout(f),a&&cancelAnimationFrame(a),e.open?(t()||l(!0),r("closed"),a=requestAnimationFrame(()=>r("open"))):(r("closed"),t()&&(f=window.setTimeout(()=>l(!1),Ke)))}),$e(()=>{if(!e.open)return;if(e.lockScroll!==!1){let s=document.body.style.overflowY;document.body.style.overflowY="hidden",W(()=>{document.body.style.overflowY=s})}a=requestAnimationFrame(()=>h?.focus());let d=s=>{s.key==="Escape"&&e.dismissible!==!1&&e.onClose?.()};window.addEventListener("keydown",d),W(()=>window.removeEventListener("keydown",d))}),W(()=>{f&&clearTimeout(f),a&&cancelAnimationFrame(a)});let c=()=>{e.dismissible!==!1&&e.onClose?.()};return<U when={t()}>
221
221
  <Ne>
222
222
  <div class="ss_modal"data-state={i()}aria-hidden={i()==="closed"}>
223
- <div class="ss_modal__backdrop"onclick={a}/>
224
- <div class="ss_modal__panel"classList={{"ss_modal__panel--sm":e.size==="sm","ss_modal__panel--lg":e.size==="lg","ss_modal__panel--fullscreen":e.fullscreen,"ss_modal__panel--no-fullscreen":e.disableResponsiveFullscreen}}ref={d=>f=d}role="dialog"aria-modal="true"aria-labelledby={e.title?o:void 0}tabindex="-1">
223
+ <div class="ss_modal__backdrop"onclick={c}/>
224
+ <div class="ss_modal__panel"classList={{"ss_modal__panel--sm":e.size==="sm","ss_modal__panel--lg":e.size==="lg","ss_modal__panel--fullscreen":e.fullscreen,"ss_modal__panel--no-fullscreen":e.disableResponsiveFullscreen}}ref={d=>h=d}role="dialog"aria-modal="true"aria-labelledby={e.title?o:void 0}tabindex="-1">
225
225
  {(e.title||e.onClose)&&<div class="ss_modal__header">
226
226
  {e.title&&<h2 id={o}class="ss_modal__title">
227
227
  {e.title}
@@ -243,33 +243,33 @@ function F(e){let t=()=>["ss_button",e.isIconOnly?"ss_button--icon":"",e.class??
243
243
  </div>
244
244
  </div>
245
245
  </Ne>
246
- </U>}import{createContext as Ye,createSignal as ne,For as Ue,onCleanup as We,useContext as Ze}from"solid-js";import{useLocation as oe,useNavigate as se}from"@solidjs/router";var ie=Ye(),Ge=0,Qe=()=>`ss-modal-${Ge++}`;function et(){let e=Ze(ie);if(!e)throw new Error("useSSModals must be used within SSModalsProvider");return e}function _t(e){let t=se(),l=oe(),[i,r]=A(),o=()=>e.config.modalProps?.({hide:e.hide})??{},{primaryButtonText:h,secondaryButtonText:c,hideSecondaryButton:f,danger:a,...d}=o();return<$ open={e.visible()}onClose={e.hide}{...d}footer={<>
247
- {!f&&<F class="secondary"onclick={e.hide}>
248
- {c??"Abbrechen"}
246
+ </U>}import{createContext as Ye,createSignal as ne,For as Ue,onCleanup as We,useContext as Ze}from"solid-js";import{useLocation as oe,useNavigate as se}from"@solidjs/router";var ie=Ye(),Ge=0,Qe=()=>`ss-modal-${Ge++}`;function et(){let e=Ze(ie);if(!e)throw new Error("useSSModals must be used within SSModalsProvider");return e}function _t(e){let t=se(),l=oe(),[i,r]=A(),o=()=>e.config.modalProps?.({hide:e.hide})??{},{primaryButtonText:f,secondaryButtonText:a,hideSecondaryButton:h,danger:c,...d}=o();return<$ open={e.visible()}onClose={e.hide}{...d}footer={<>
247
+ {!h&&<F class="secondary"onclick={e.hide}>
248
+ {a??"Abbrechen"}
249
249
  </F>}
250
- <F class={a?"danger":void 0}onclick={()=>r(()=>e.config.onPrimaryAction?.({hide:e.hide,navigate:t,pathname:l.pathname})??e.hide())}disabled={i()}>
251
- {h??"Weiter"}
250
+ <F class={c?"danger":void 0}onclick={()=>r(()=>e.config.onPrimaryAction?.({hide:e.hide,navigate:t,pathname:l.pathname})??e.hide())}disabled={i()}>
251
+ {f??"Weiter"}
252
252
  </F>
253
253
  </>}>
254
254
  {e.config.content({hide:e.hide})}
255
255
  </$>}function St(e){let t=se(),l=oe();return<C onsubmit={i=>e.config.onSubmit({hide:e.hide,context:i,navigate:t,pathname:l.pathname})}>
256
256
  <Mt visible={e.visible}hide={e.hide}config={e.config}/>
257
- </C>}function Mt(e){let t=C.useContext();if(!t)return null;let l=()=>e.config.modalProps?.({hide:e.hide,context:t})??{},{primaryButtonText:i,secondaryButtonText:r,hideSecondaryButton:o,danger:h,...c}=l();return<$ open={e.visible()}onClose={e.hide}{...c}footer={<>
257
+ </C>}function Mt(e){let t=C.useContext();if(!t)return null;let l=()=>e.config.modalProps?.({hide:e.hide,context:t})??{},{primaryButtonText:i,secondaryButtonText:r,hideSecondaryButton:o,danger:f,...a}=l();return<$ open={e.visible()}onClose={e.hide}{...a}footer={<>
258
258
  {!o&&<F class="secondary"onclick={e.hide}disabled={t.loading()}>
259
259
  {r??"Abbrechen"}
260
260
  </F>}
261
- <F class={h?"danger":void 0}onclick={()=>t.submit()}disabled={t.loading()}>
261
+ <F class={f?"danger":void 0}onclick={()=>t.submit()}disabled={t.loading()}>
262
262
  {i??"Speichern"}
263
263
  </F>
264
264
  </>}>
265
265
  {e.config.content({hide:e.hide,context:t})}
266
- </$>}function Et(e){let[t,l]=ne([]),i=new Map,r=new Map,o=220,h=d=>{let s=i.get(d);if(!s)return;s.setVisible(!1);let v=r.get(d);v&&window.clearTimeout(v);let _=window.setTimeout(()=>{l(y=>y.filter(M=>M.id!==d)),i.delete(d),r.delete(d)},o);r.set(d,_)},c=d=>{let s=Qe(),[v,_]=ne(!0),y={id:s,visible:v,setVisible:_,render:d};return i.set(s,y),l(M=>[...M,y]),s},f=d=>c(({hide:s,visible:v})=><_t visible={v}hide={s}config={d}/>),a=d=>c(({hide:s,visible:v})=><St visible={v}hide={s}config={d}/>);return We(()=>{r.forEach(d=>window.clearTimeout(d)),r.clear()}),<ie.Provider value={{show:c,showDefault:f,showForm:a,hide:h}}>
266
+ </$>}function Et(e){let[t,l]=ne([]),i=new Map,r=new Map,o=220,f=d=>{let s=i.get(d);if(!s)return;s.setVisible(!1);let v=r.get(d);v&&window.clearTimeout(v);let _=window.setTimeout(()=>{l(y=>y.filter(M=>M.id!==d)),i.delete(d),r.delete(d)},o);r.set(d,_)},a=d=>{let s=Qe(),[v,_]=ne(!0),y={id:s,visible:v,setVisible:_,render:d};return i.set(s,y),l(M=>[...M,y]),s},h=d=>a(({hide:s,visible:v})=><_t visible={v}hide={s}config={d}/>),c=d=>a(({hide:s,visible:v})=><St visible={v}hide={s}config={d}/>);return We(()=>{r.forEach(d=>window.clearTimeout(d)),r.clear()}),<ie.Provider value={{show:a,showDefault:h,showForm:c,hide:f}}>
267
267
  {e.children}
268
268
 
269
269
  <Ue each={t()}>
270
- {d=>{let s=()=>h(d.id);return d.render({id:d.id,hide:s,visible:d.visible})}}
270
+ {d=>{let s=()=>f(d.id);return d.render({id:d.id,hide:s,visible:d.visible})}}
271
271
  </Ue>
272
- </ie.Provider>}import{createContext as Tt,createMemo as Pt,createSignal as Ct,createUniqueId as Dt,onCleanup as Ft,onMount as Lt,useContext as le}from"solid-js";import{useLocation as It}from"@solidjs/router";var Z=Tt();function R(e){let t=Dt(),l=It(),[i,r]=Ct([]),o=()=>{let a=document.getElementById(t);a&&(a.checked=!1)},h=a=>{r(d=>d.includes(a)?d:[...d,a])},c=a=>{r(d=>d.filter(s=>s!==a))},f=Pt(()=>{let a=l.pathname,d=null;for(let s of i())a.startsWith(s)&&(!d||s.length>d.length)&&(d=s);return d});return<Z.Provider value={{closeDrawer:o,activeHref:f,registerHref:h,unregisterHref:c}}>
272
+ </ie.Provider>}import{createContext as Tt,createMemo as Pt,createSignal as Ct,createUniqueId as Dt,onCleanup as Ft,onMount as Lt,useContext as le}from"solid-js";import{useLocation as It}from"@solidjs/router";var Z=Tt();function R(e){let t=Dt(),l=It(),[i,r]=Ct([]),o=()=>{let c=document.getElementById(t);c&&(c.checked=!1)},f=c=>{r(d=>d.includes(c)?d:[...d,c])},a=c=>{r(d=>d.filter(s=>s!==c))},h=Pt(()=>{let c=l.pathname,d=null;for(let s of i())c.startsWith(s)&&(!d||s.length>d.length)&&(d=s);return d});return<Z.Provider value={{closeDrawer:o,activeHref:h,registerHref:f,unregisterHref:a}}>
273
273
  <div class={`ss_shell ${e.class??""}`}style={e.style}>
274
274
  <input id={t}type="checkbox"class="ss_shell__drawer_toggle_input"/>
275
275
 
@@ -1 +1 @@
1
- :root{font-family:system-ui,-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,sans-serif;--bg-page: #f5f5f7;--bg-surface: #ffffff;--bg-surface-subtle: #f3f4f6;--shell-bg: radial-gradient(circle at top left, #eef2ff 0, #f5f5f7 38%, #f3f4f6 100%);--shell-header-bg: rgba(255, 255, 255, .85);--shell-header-border: rgba(209, 213, 219, .8);--shell-nav-bg: rgba(255, 255, 255, .92);--shell-nav-border: rgba(209, 213, 219, .85);--fg-primary: #0f172a;--fg-secondary: #4b5563;--fg-muted: #6b7280;--fg-inverse: #ffffff;--border-subtle: #e5e7eb;--border-strong: #d1d5db;--card-accent: #2563eb;--input-bg: #ffffff;--input-fg: var(--fg-primary);--input-border: #d1d5db;--input-border-hover: #9ca3af;--input-border-disabled: #e5e7eb;--input-bg-disabled: #f3f4f6;--input-fg-disabled: #9ca3af;--input-bg-hover: #f9fafb;--input-bg-focus: #ffffff;--scrollbar-thumb: rgba(15, 23, 42, .24);--primary: #2563eb;--primary-soft: #e0ecff;--primary-soft-stronger: #d1e1ff;--on-primary: #ffffff;--error: #dc2626;--on-error: #ffffff;--error-strong: #b91c1c;--disabled: #9ca3af;--on-disabled: #f9fafb;--suggestion-bg: var(--bg-surface);--suggestion-hover-bg: #f3f4ff;--suggestion-focus-bg: #e0ebff;--suggestion-selected-bg: #e0ebff;--suggestion-indicator: #2563eb;--btn-primary-bg: var(--primary);--btn-primary-border: #1d4ed8;--btn-primary-bg-hover: #1d4ed8;--btn-primary-border-hover: #1e40af;--btn-secondary-bg: #eef1f7;--btn-secondary-border: #d1d5db;--btn-secondary-bg-hover: #e0e3ec;--btn-secondary-border-hover: #cbd0dd;--btn-tertiary-bg: transparent;--btn-tertiary-border: var(--border-subtle);--btn-tertiary-bg-hover: #e9effa;--btn-tertiary-border-hover: var(--border-strong);--clear-bg: #edeff4;--clear-border: #e2e4ec;--clear-bg-hover: #e1e4ee;--clear-border-hover: #cbd0dd;--clear-fg: #4b5563;--token-bg: #eef2ff;--token-fg: #1f2937;--radius-sm: .375rem;--radius-md: .5rem;--radius-lg: .75rem;--radius-pill: 999px;--focus-ring: 0 0 0 1px rgba(37, 99, 235, .75), 0 0 0 4px rgba(191, 219, 254, .9);--focus-ring-error: 0 0 0 1px rgba(220, 38, 38, .85), 0 0 0 4px rgba(254, 202, 202, .85);--shadow-soft: 0 10px 30px rgba(15, 23, 42, .06);--btn-shadow: 0 6px 18px rgba(15, 23, 42, .16);--btn-shadow-hover: 0 10px 30px rgba(15, 23, 42, .18)}@media (prefers-color-scheme: dark){:root{--bg-page: #0f1115;--bg-surface: #14171c;--bg-surface-subtle: #1a1e24;--fg-primary: #e7e9ee;--fg-secondary: #c7cbd4;--fg-muted: #9ca3af;--fg-inverse: #0f1115;--border-subtle: #2a2f36;--border-strong: #3a4048;--card-accent: #94a3b8;--input-bg: #14171c;--input-fg: var(--fg-primary);--input-border: #2a2f36;--input-border-hover: #3a4048;--input-border-disabled: #111827;--input-bg-disabled: #14171c;--input-fg-disabled: #6b7280;--input-bg-hover: #1a1e24;--input-bg-focus: #20252c;--scrollbar-thumb: rgba(156, 163, 175, .38);--primary: #3b82f6;--primary-soft: #172554;--primary-soft-stronger: #1d4ed8;--on-primary: #ffffff;--error: #fb7185;--on-error: #0f1115;--error-strong: #f43f5e;--suggestion-bg: #14171c;--suggestion-hover-bg: #1b2027;--suggestion-focus-bg: #21262e;--suggestion-selected-bg: #262c35;--suggestion-indicator: #94a3b8;--btn-primary-bg: var(--primary);--btn-primary-border: #1d4ed8;--btn-primary-bg-hover: #1d4ed8;--btn-primary-border-hover: #1e3a8a;--btn-secondary-bg: #1a1e24;--btn-secondary-border: #2f353e;--btn-secondary-bg-hover: #232831;--btn-secondary-border-hover: #3a4048;--btn-tertiary-bg: transparent;--btn-tertiary-border: #2f353e;--btn-tertiary-bg-hover: #232831;--btn-tertiary-border-hover: #3a4048;--clear-bg: #1a1e24;--clear-border: #2f353e;--clear-bg-hover: #232831;--clear-border-hover: #3a4048;--clear-fg: #e5e7eb;--token-bg: #232831;--token-fg: #e5e7eb;--shadow-soft: 0 18px 50px rgba(0, 0, 0, .75);--btn-shadow: 0 12px 30px rgba(0, 0, 0, .65);--btn-shadow-hover: 0 16px 40px rgba(0, 0, 0, .85);--shell-bg: radial-gradient(circle at top left, #1c2129 0, #0f1115 45%, #12161b 100%);--shell-header-bg: rgba(20, 23, 28, .92);--shell-header-border: rgba(58, 64, 72, .9);--shell-nav-bg: rgba(20, 23, 28, .96);--shell-nav-border: rgba(58, 64, 72, .92)}}@keyframes input-alert-appear{0%{opacity:0;transform:translateY(-1px)}to{opacity:1;transform:translateY(0)}}*,*:before,*:after{box-sizing:border-box}*{-webkit-tap-highlight-color:transparent}body{margin:0;font-family:inherit;color:var(--fg-primary);background-color:var(--bg-page);font-size:14px}html,body,#root{height:100%;position:relative}.ss_form{max-width:48rem;width:100%;margin:0 auto;display:flex;flex-direction:column;gap:1rem;padding:.5rem 0}.ss__suggestions{position:absolute;top:calc(100% + .35rem);left:0;right:0;z-index:10;display:flex;flex-direction:column;max-height:clamp(7rem,35vh,14rem);margin:0;padding:.25rem 0;list-style-type:none;background-color:var(--suggestion-bg);border-width:1px;border-style:solid;border-color:var(--border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-soft);overflow-y:auto;overflow-x:hidden;li{display:flex;align-items:flex-start;gap:.4rem;padding:.45rem .8rem;font-size:.9rem;line-height:1.45;color:var(--fg-primary);cursor:pointer;user-select:none;outline:none;+li{border-top:1px solid var(--border-subtle)}&:hover{background-color:var(--suggestion-hover-bg)}&:focus{background-color:var(--suggestion-focus-bg)}&.ss__hovered{background-color:var(--suggestion-focus-bg)}&.ss__selected{font-weight:500;background-color:var(--suggestion-selected-bg);box-shadow:inset 2px 0 0 var(--suggestion-indicator)}&.ss__selected.ss__hovered,&.ss__selected:hover{background-color:#2563eb14}.ss__title{font-weight:500}.ss__description{font-size:.8rem;color:var(--fg-muted)}}&::-webkit-scrollbar{width:6px}&::-webkit-scrollbar-track{background:transparent}&::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:999px}}.ss_form_input,.ss_form_date{display:flex;flex-direction:column;gap:.35rem;label{margin:0;font-size:.78rem;font-weight:600;letter-spacing:.01em;text-transform:none;color:var(--fg-muted)}.ss__wrapper{position:relative;display:inline-block;width:100%}input{display:block;width:100%;min-width:0;padding:.55rem .7rem;font-size:.95rem;line-height:1.4;color:var(--input-fg);background-color:var(--input-bg);border-width:1px;border-style:solid;border-color:var(--input-border);border-radius:var(--radius-md);outline:none;box-shadow:none;transition:border-color .12s ease,box-shadow .12s ease,background-color .12s ease,transform 80ms ease;&:hover:not([disabled]){border-color:var(--input-border-hover);background-color:var(--input-bg-hover)}&:focus-visible{border-color:var(--primary);box-shadow:var(--focus-ring);background-color:var(--input-bg-focus)}&[disabled]{cursor:not-allowed;color:var(--input-fg-disabled);background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled)}}.ss__suggestions{max-height:clamp(7rem,30vh,12rem)}&:not(:focus-within){.ss__suggestions{display:none}}&:has([role=alert]){input{border-color:var(--error);box-shadow:var(--focus-ring-error)}}[role=alert]{margin-top:.15rem;font-size:.8rem;line-height:1.4;color:var(--error);animation:.12s input-alert-appear ease-out}}.ss_form_date{position:relative;input{padding-right:2.1rem}input::-webkit-calendar-picker-indicator{opacity:0;display:none}}.ss_form_date__icon{position:absolute;right:.7rem;top:50%;width:1rem;height:1rem;transform:translateY(-50%);color:var(--fg-muted);padding:0;border:none;background:transparent;cursor:pointer;&:disabled{cursor:not-allowed;color:var(--input-fg-disabled)}svg{width:100%;height:100%;display:block}}.ss_form_date__picker{position:absolute;top:calc(100% + .35rem);left:0;z-index:10;width:min(18rem,100%);padding:.75rem;border-radius:var(--radius-md);border:1px solid var(--border-subtle);background:var(--bg-surface);box-shadow:var(--shadow-soft)}.ss_form_date__header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;margin-bottom:.6rem}.ss_form_date__nav_group{display:flex;align-items:center;gap:.35rem}.ss_form_date__title{font-size:.9rem;font-weight:600;color:var(--fg-primary);text-transform:capitalize}.ss_form_date__nav{width:1.8rem;height:1.8rem;border-radius:var(--radius-pill);border:1px solid var(--border-subtle);background:var(--bg-surface-subtle);color:var(--fg-primary);cursor:pointer;transition:background-color .12s ease,border-color .12s ease;&:hover{border-color:var(--border-strong)}}.ss_form_date__nav svg{width:1rem;height:1rem;display:block;margin:0 auto}.ss_form_date__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:.2rem;margin-bottom:.35rem;font-size:.75rem;color:var(--fg-muted);text-align:center}.ss_form_date__grid{display:grid;grid-template-columns:repeat(7,1fr);gap:.2rem}.ss_form_date__day{height:2rem;border-radius:var(--radius-md);border:1px solid transparent;background:transparent;color:var(--fg-primary);cursor:pointer;transition:background-color .12s ease,border-color .12s ease;&:hover{background:var(--bg-surface-subtle)}&.is-selected{background:var(--primary-soft);border-color:var(--primary);color:var(--fg-primary);font-weight:600}&.is-today:not(.is-selected){border-color:var(--border-strong);background:var(--bg-surface-subtle);color:var(--fg-primary);font-weight:500}}.ss_form_date__day.is-empty{border:none;background:transparent;cursor:default}.ss_form_checkbox{display:flex;flex-direction:column;gap:.3rem;width:100%;font-size:.9rem;color:var(--fg-secondary);.ss__wrapper{display:inline-flex;align-items:flex-start;gap:.55rem;padding:.15rem .05rem;font-size:.9rem;line-height:1.5;color:var(--fg-secondary);background-color:transparent;border:none;outline:none}input[type=checkbox]{margin-top:.12rem;width:1.05rem;height:1.05rem;flex-shrink:0;position:relative;appearance:none;-webkit-appearance:none;-moz-appearance:none;accent-color:initial;border-radius:calc(var(--radius-sm) * .9);border:1px solid var(--border-strong);background-color:var(--bg-surface);box-shadow:0 1px 1px #0f172a0f;cursor:pointer;outline:none;transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease,transform 80ms ease;&:hover:not(:disabled){border-color:var(--input-border-hover);background-color:var(--input-bg-hover)}&:active:not(:disabled){transform:translateY(1px)}&:after{content:"";position:absolute;inset:0;margin:auto;width:.55rem;height:.3rem;border-left:2px solid var(--on-primary);border-bottom:2px solid var(--on-primary);transform-origin:center;transform:translateY(-1px) rotate(-45deg) scale(.2);opacity:0;transition:transform .12s ease-out,opacity .12s ease-out}&:checked,&[aria-checked=true]{background-color:var(--primary)!important;border-color:var(--primary)!important;&:after{opacity:1;transform:translateY(-1px) rotate(-45deg) scale(1)}}&:checked[disabled],&[aria-checked=true][disabled]{background-color:color-mix(in srgb,var(--input-bg-disabled) 70%,var(--fg-primary))!important;border-color:var(--input-border-disabled)!important}&[disabled]{cursor:not-allowed;background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled);box-shadow:none;opacity:.75;&:after{border-color:#fff}}}&:has(input[type=checkbox]:focus-visible){input[type=checkbox]{outline:none;box-shadow:var(--focus-ring)}}label{margin:0;font-size:.9rem;line-height:1.5;color:var(--fg-primary);cursor:pointer;user-select:none}&:has(input[type=checkbox][disabled]){color:var(--input-fg-disabled);user-select:none;label{cursor:not-allowed;color:var(--input-fg-disabled)}}[role=alert]{font-size:.8rem;color:var(--error);animation:.12s input-alert-appear ease-out}}.ss_form_select{display:flex;flex-direction:column;gap:.35rem;width:100%;label{margin:0;font-size:.78rem;font-weight:600;letter-spacing:.01em;color:var(--fg-muted)}select{display:block;width:100%;padding:.55rem 2.1rem .55rem .7rem;font-size:.95rem;line-height:1.4;color:var(--input-fg);background-color:var(--input-bg);background-image:none;border-width:1px;border-style:solid;border-color:var(--input-border);border-radius:var(--radius-md);outline:none;appearance:none;box-shadow:none;transition:border-color .12s ease,box-shadow .12s ease,background-color .12s ease;&:hover:not([disabled]){border-color:var(--input-border-hover);background-color:var(--input-bg-hover)}&:focus-visible{border-color:var(--primary);box-shadow:var(--focus-ring);background-color:var(--input-bg-focus)}&:has(+[role=alert]){border-color:var(--error);box-shadow:var(--focus-ring-error)}&[disabled]{cursor:not-allowed;color:var(--input-fg-disabled);background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled)}}.ss_form_select__field{position:relative}.ss_form_select__icon{position:absolute;right:.7rem;top:50%;width:1rem;height:1rem;transform:translateY(-50%);color:var(--fg-muted);pointer-events:none}.ss_form_select__icon svg{width:100%;height:100%;display:block}[role=alert]{font-size:.8rem;color:var(--error);animation:.12s input-alert-appear ease-out}}.ss_form_ac_select{display:flex;flex-direction:column;gap:.35rem;label{margin:0;font-size:.78rem;font-weight:600;letter-spacing:.01em;color:var(--fg-muted)}.ss__wrapper{position:relative;display:inline-block;width:100%}.ss__input_row{display:flex;align-items:center;gap:.4rem;width:100%;min-width:0;padding:.5rem .65rem;font-size:.95rem;line-height:1.4;color:var(--input-fg);background-color:var(--input-bg);border-width:1px;border-style:solid;border-color:var(--input-border);border-radius:var(--radius-md);outline:none;box-shadow:none;transition:border-color .12s ease,box-shadow .12s ease,background-color .12s ease;&:hover:not(:has([disabled])){border-color:var(--input-border-hover);background-color:var(--input-bg-hover)}&:has([disabled]){cursor:not-allowed;color:var(--input-fg-disabled);background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled)}input{flex-grow:1;min-width:0;padding:0;font-size:inherit;line-height:inherit;color:inherit;background-color:transparent;border:none;outline:none}.ss__prefix{flex-shrink:0;padding:.2rem .6rem;font-size:.78rem;line-height:1.3;white-space:nowrap;color:var(--token-fg);background-color:var(--token-bg);border-radius:var(--radius-pill);cursor:pointer;user-select:none;border:1px solid rgba(37,99,235,.18);transition:background-color .1s ease,border-color .1s ease,transform 80ms ease,box-shadow .1s ease;&:hover{background-color:#2563eb0f;border-color:#2563eb59;box-shadow:0 0 0 1px #bfdbfecc}&:active{transform:translateY(1px)}}.ss__prefix[aria-disabled=true]{cursor:not-allowed;opacity:.6;pointer-events:none}.ss__suffix{flex-shrink:0}}.ss__selection{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0;padding:.5rem .65rem;font-size:.95rem;line-height:1.4;color:var(--input-fg);background-color:var(--input-bg);border-width:1px;border-style:solid;border-color:var(--input-border);border-radius:var(--radius-md);outline:none;box-shadow:none;transition:border-color .12s ease,box-shadow .12s ease,background-color .12s ease;&:has(.ss__clear[disabled]){cursor:not-allowed;color:var(--input-fg-disabled);background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled)}}.ss__content{flex:1;min-width:0}.ss__clear{flex-shrink:0;width:1.7rem;height:1.7rem;display:inline-flex;align-items:center;justify-content:center;font-size:.9rem;line-height:1;color:var(--clear-fg);background:var(--clear-bg);border-width:1px;border-style:solid;border-color:var(--clear-border);border-radius:var(--radius-pill);cursor:pointer;user-select:none;transition:background-color .1s ease,border-color .1s ease,transform 80ms ease;&:hover:not([disabled]){border-color:var(--clear-border-hover);background-color:var(--clear-bg-hover)}&:active:not([disabled]){transform:translateY(1px)}&[disabled]{cursor:not-allowed;opacity:.55}}.ss__suggestions{max-height:clamp(8rem,40vh,16rem);li{padding-inline:.85rem}}&:not(:focus-within){.ss__suggestions{display:none}}&:focus-within{.ss__input_row,.ss__selection{border-color:var(--primary);box-shadow:var(--focus-ring);background-color:var(--input-bg-focus)}}&:has([role=alert]){.ss__input_row,.ss__selection{border-color:var(--error);box-shadow:var(--focus-ring-error)}}[role=alert]{font-size:.8rem;color:var(--error);animation:.12s input-alert-appear ease-out}}.ss_button{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;padding:.55rem 1.05rem;font-size:.9rem;font-weight:600;text-transform:none;text-align:center;letter-spacing:.01em;color:var(--on-primary);background:var(--btn-primary-bg);border:1px solid var(--btn-primary-border);border-radius:var(--radius-pill);outline:none;cursor:pointer;user-select:none;transition:background-color .12s ease,border-color .12s ease,opacity 80ms ease,transform 80ms ease,color .1s ease;&.secondary{color:var(--fg-primary);background:var(--btn-secondary-bg);border-color:var(--btn-secondary-border);box-shadow:none}&.tertiary{color:var(--fg-secondary);background:var(--btn-tertiary-bg);border-color:var(--btn-tertiary-border);box-shadow:none}&.danger{color:var(--on-error);background:var(--error);border-color:var(--error)}&:hover:not([disabled]){background-color:var(--btn-primary-bg-hover);border-color:var(--btn-primary-border-hover);&.secondary{background-color:var(--btn-secondary-bg-hover);border-color:var(--btn-secondary-border-hover)}&.tertiary{background-color:var(--btn-tertiary-bg-hover);border-color:var(--btn-tertiary-border-hover)}&.danger{background-color:var(--error-strong);border-color:var(--error-strong)}}&:active:not([disabled]){transform:translateY(1px)}&:focus-visible{outline:none;box-shadow:var(--focus-ring)}&[disabled]{cursor:not-allowed;color:var(--on-disabled);background:var(--disabled);border-color:var(--disabled);opacity:.9}}.ss_button--icon{width:2.1rem;height:2.1rem;padding:0;font-size:1.1rem;line-height:1;color:var(--fg-primary);background:transparent;border-color:transparent;border-radius:var(--radius-pill);box-shadow:none;transition:background-color .1s ease,border-color .1s ease,transform 80ms ease;&:hover:not([disabled]){background-color:var(--btn-tertiary-bg-hover);border-color:var(--btn-tertiary-border-hover)}&:active:not([disabled]){transform:translateY(1px)}&[disabled]{opacity:.5}}.ss_callout{--ss-callout-accent: var(--primary);--ss-callout-accent-soft: color-mix(in srgb, var(--ss-callout-accent) 22%, transparent);position:relative;display:flex;align-items:center;gap:1rem;width:100%;padding:1.15rem 1.4rem;font-size:.95rem;line-height:1.55;color:var(--fg-secondary);background:radial-gradient(circle at top left,var(--ss-callout-accent-soft) 0%,color-mix(in srgb,var(--ss-callout-accent-soft) 80%,var(--bg-surface) 20%) 28%,color-mix(in srgb,var(--ss-callout-accent-soft) 40%,var(--bg-surface) 60%) 62%,color-mix(in srgb,var(--ss-callout-accent-soft) 12%,var(--bg-surface) 88%) 82%,var(--bg-surface-subtle) 100%),var(--bg-surface);border-radius:calc(var(--radius-md) * 1.2);border:1px solid color-mix(in srgb,var(--border-subtle) 60%,var(--ss-callout-accent) 40%);.ss_callout__icon{flex-shrink:0;color:var(--ss-callout-accent);svg{width:1.6rem;height:1.6rem;display:block}}.ss_callout__content{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center}.ss_callout__title{margin:0;font-size:1rem;font-weight:600;color:var(--fg-primary);line-height:1.45}.ss_callout__body{margin:.25rem 0 0;color:var(--fg-secondary)}.ss_callout__actions{margin-top:.65rem;display:inline-flex;gap:.65rem;font-size:.9rem;button,.ss_callout__link{padding:0;border:none;background:none;font:inherit;cursor:pointer;text-decoration:none;color:color-mix(in srgb,var(--ss-callout-accent) 80%,var(--fg-primary) 20%);&:hover{text-decoration:underline}}}&.ss_callout--subtle{box-shadow:none;border-color:var(--border-subtle);background:color-mix(in srgb,var(--bg-surface-subtle) 85%,var(--ss-callout-accent-soft) 15%)}}.ss_callout--red{--ss-callout-accent: #E53935}.ss_callout--pink{--ss-callout-accent: #D81B60}.ss_callout--purple{--ss-callout-accent: #8E24AA}.ss_callout--deep-purple{--ss-callout-accent: #5E35B1}.ss_callout--indigo{--ss-callout-accent: #3949AB}.ss_callout--blue{--ss-callout-accent: #1E88E5}.ss_callout--light-blue{--ss-callout-accent: #039BE5}.ss_callout--cyan{--ss-callout-accent: #00ACC1}.ss_callout--teal{--ss-callout-accent: #00897B}.ss_callout--green{--ss-callout-accent: #43A047}.ss_callout--light-green{--ss-callout-accent: #7CB342}.ss_callout--lime{--ss-callout-accent: #C0CA33}.ss_callout--yellow{--ss-callout-accent: #FDD835}.ss_callout--amber{--ss-callout-accent: #FFB300}.ss_callout--orange{--ss-callout-accent: #FB8C00}.ss_callout--deep-orange{--ss-callout-accent: #F4511E}.ss_callout--brown{--ss-callout-accent: #6D4C41}.ss_callout--grey{--ss-callout-accent: #757575}.ss_callout--blue-grey{--ss-callout-accent: #546E7A}.ss_dropdown{position:relative;display:inline-flex}.ss_dropdown__trigger{justify-content:center}.ss_dropdown__menu{position:absolute;top:calc(100% + .4rem);right:0;z-index:30;min-width:12rem;padding:.4rem;background:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-soft);opacity:0;transform:translateY(-6px) scale(.98);transition:opacity .14s ease,transform .16s ease;&[data-state=open]{opacity:1;transform:translateY(0) scale(1)}&[data-state=closed]{opacity:0;transform:translateY(-6px) scale(.98)}}.ss_dropdown__item{width:100%;display:flex;align-items:center;gap:.6rem;padding:.45rem .55rem;border-radius:var(--radius-md);border:none;background:transparent;color:var(--fg-primary);cursor:pointer;text-align:left;transition:background-color .12s ease,color .12s ease;&:hover{background:var(--bg-surface-subtle)}}.ss_dropdown__item_icon{display:inline-flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem;color:var(--fg-muted);svg{width:100%;height:100%}}.ss_dropdown__item_label{flex:1;min-width:0;font-size:.9rem}.ss_dropdown__item_check{display:inline-flex;align-items:center;justify-content:center;color:var(--primary);svg{width:1rem;height:1rem}}.ss_chip{--ss-chip-accent: var(--primary);--ss-chip-accent-soft: color-mix(in srgb, var(--ss-chip-accent) 16%, transparent);display:inline-flex;align-items:center;gap:.4rem;padding:.3rem .65rem;border-radius:var(--radius-pill);border:1px solid color-mix(in srgb,var(--ss-chip-accent) 45%,var(--border-subtle) 55%);background:color-mix(in srgb,var(--ss-chip-accent-soft) 60%,var(--bg-surface) 40%);color:var(--fg-primary);font-size:.82rem;line-height:1.3}.ss_chip--clickable{cursor:pointer;transition:background-color .12s ease,border-color .12s ease,transform 80ms ease;&:hover{border-color:color-mix(in srgb,var(--ss-chip-accent) 65%,var(--border-strong) 35%);background:color-mix(in srgb,var(--ss-chip-accent-soft) 75%,var(--bg-surface) 25%)}&:active{transform:translateY(1px)}}.ss_chip__label{white-space:nowrap}.ss_chip__dismiss{width:1.3rem;height:1.3rem;padding:0;border:none;background:transparent;color:var(--fg-muted);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;svg{width:.9rem;height:.9rem}&:hover{color:var(--fg-primary)}}.ss_chip--red{--ss-chip-accent: #E53935}.ss_chip--pink{--ss-chip-accent: #D81B60}.ss_chip--purple{--ss-chip-accent: #8E24AA}.ss_chip--deep-purple{--ss-chip-accent: #5E35B1}.ss_chip--indigo{--ss-chip-accent: #3949AB}.ss_chip--blue{--ss-chip-accent: #1E88E5}.ss_chip--light-blue{--ss-chip-accent: #039BE5}.ss_chip--cyan{--ss-chip-accent: #00ACC1}.ss_chip--teal{--ss-chip-accent: #00897B}.ss_chip--green{--ss-chip-accent: #43A047}.ss_chip--light-green{--ss-chip-accent: #7CB342}.ss_chip--lime{--ss-chip-accent: #C0CA33}.ss_chip--yellow{--ss-chip-accent: #FDD835}.ss_chip--amber{--ss-chip-accent: #FFB300}.ss_chip--orange{--ss-chip-accent: #FB8C00}.ss_chip--deep-orange{--ss-chip-accent: #F4511E}.ss_chip--brown{--ss-chip-accent: #6D4C41}.ss_chip--grey{--ss-chip-accent: #757575}.ss_chip--blue-grey{--ss-chip-accent: #546E7A}.ss_table{width:100%;border:1px solid var(--border-subtle);border-radius:var(--radius-lg);background:var(--bg-surface);box-shadow:var(--shadow-soft);overflow:hidden}.ss_table__scroll{overflow:auto}.ss_table table{width:100%;border-collapse:collapse;min-width:32rem}.ss_table th{text-align:left;font-size:.8rem;text-transform:uppercase;letter-spacing:.04em;color:var(--fg-muted);background:color-mix(in srgb,var(--bg-surface-subtle) 80%,var(--bg-surface) 20%);border-bottom:1px solid var(--border-subtle);padding:.75rem .9rem}.ss_table__header_label{display:inline-flex;align-items:center;gap:.35rem}.ss_table__sort_button{border:none;background:transparent;padding:0;font:inherit;color:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:.35rem}.ss_table__sort_icon{display:inline-flex;align-items:center;justify-content:center;color:currentColor;opacity:.7}.ss_table__sort_icon svg{width:1rem;height:1rem}.ss_table td{padding:.8rem .9rem;border-bottom:1px solid var(--border-subtle);color:var(--fg-primary);font-size:.9rem}.ss_table tbody tr:last-child td{border-bottom:none}.ss_table__pagination{display:flex;align-items:center;justify-content:center;gap:.75rem;padding:.75rem .9rem;border-top:1px solid var(--border-subtle);background:color-mix(in srgb,var(--bg-surface-subtle) 80%,var(--bg-surface) 20%)}.ss_table--pagination-top .ss_table__pagination{border-top:none;border-bottom:1px solid var(--border-subtle)}.ss_table__page_button{border:1px solid var(--border-subtle);background:var(--bg-surface);color:var(--fg-primary);border-radius:var(--radius-pill);width:2rem;height:2rem;padding:0;font-size:.85rem;cursor:pointer;transition:background-color .12s ease,border-color .12s ease;&:hover:not(:disabled){border-color:var(--border-strong);background:var(--bg-surface)}&:disabled{cursor:not-allowed;color:var(--fg-muted);border-color:var(--border-subtle);background:var(--bg-surface);opacity:.6}}.ss_table__page_info{font-size:.85rem;color:var(--fg-muted)}.ss_table__page_button svg{width:1rem;height:1rem;display:block;margin:0 auto}.ss_table td>div{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.ss_table tbody tr[data-clickable=true]{cursor:pointer;transition:background-color .12s ease}.ss_table tbody tr[data-clickable=true]:hover{background:var(--bg-surface-subtle)}.ss_expandable{width:100%;background:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-soft);overflow:hidden;.ss_expandable__header{width:100%;display:flex;align-items:center;gap:.6rem;padding:.9rem 1rem;text-align:left;background:var(--bg-surface);border:none;color:var(--fg-primary);cursor:pointer;user-select:none;transition:background-color .12s ease;&:hover{background:var(--bg-surface-subtle)}&:focus-visible{outline:none;box-shadow:var(--focus-ring)}}.ss_expandable__icon{display:inline-flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem;color:var(--fg-muted);svg{width:1.1rem;height:1.1rem}}.ss_expandable__title{font-size:.96rem;font-weight:600;color:inherit}.ss_expandable__content{overflow:hidden;padding:0;background:var(--bg-surface);transition-property:height}.ss_expandable__divider_wrapper{padding:0 1rem 1rem}.ss_expandable__divider{height:1px;margin:.75rem 0 .8rem;background:var(--border-subtle)}}.ss_divider{width:100%;height:1px;background:var(--border-subtle)}.ss_divider--vertical{width:1px;height:100%}.ss_surface{width:100%;padding:1rem 1.25rem;background:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);box-shadow:var(--shadow-soft)}.ss_tile{width:100%;padding:.9rem 1rem;background:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-soft)}.ss_tile__row{display:flex;align-items:center;gap:.5rem}.ss_tile__icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--fg-muted);svg{width:1.25rem;height:1.25rem}}.ss_tile__content{flex:1;min-width:0}.ss_tile__trailing{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--fg-muted);font-size:.8rem}.ss_tile__title{margin:0;font-size:.95rem;font-weight:600;color:var(--fg-primary)}.ss_tile__link,.ss_tile__text{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ss_tile__link{color:inherit;text-decoration:none;&:hover{text-decoration:underline}}.ss_tile__subtitle{margin-top:.2rem;font-size:.82rem;color:var(--fg-secondary)}.ss_header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.25rem}.ss_header__text{min-width:0}.ss_header__title{margin:0;font-size:1.8rem;font-weight:600;color:var(--fg-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ss_header__subtitle{margin:-.35rem 0 0;font-size:1rem;font-weight:500;color:var(--fg-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ss_header__actions{flex-shrink:0;display:inline-flex;align-items:center;gap:.5rem}.ss_shell{height:100%;overflow:hidden;display:flex;flex-direction:column;background:var(--shell-bg);color:var(--fg-primary);.ss_shell__drawer_toggle_input{position:absolute;opacity:0;pointer-events:none}.ss_shell__header{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.7rem .9rem;background:var(--shell-header-bg);backdrop-filter:blur(18px);border-bottom:1px solid var(--shell-header-border)}.ss_shell__header_left{display:flex;align-items:center;gap:.75rem}.ss_shell__drawer_toggle{display:none}.ss_shell__title{font-size:1rem;font-weight:700;letter-spacing:.02em;color:var(--fg-primary)}.ss_shell__actions{display:flex;align-items:center;gap:.4rem}.ss_shell__body{flex:1 1 auto;min-height:0;display:flex;position:relative;overflow:hidden}.ss_shell__nav{flex:0 0 16rem;max-width:16rem;background:var(--shell-nav-bg);backdrop-filter:blur(12px);border-right:1px solid var(--shell-nav-border);overflow:auto}.ss_shell__nav_inner{padding:.75rem .7rem 1rem}.ss_shell__main{flex:1 1 auto;min-width:0;overflow:auto;padding:1.25rem 1.3rem 1.6rem}.ss_shell__scrim{display:none}.ss_shell__nav_list{display:flex;flex-direction:column;gap:.25rem}.ss_shell__nav_item{display:flex;align-items:center;gap:.55rem;padding:.4rem .55rem;border-radius:var(--radius-md);color:var(--fg-primary);text-decoration:none;background:transparent;border:none;cursor:pointer;transition:background-color .12s ease,color .12s ease;&:hover{background:#2563eb0f}}.ss_shell__nav_item--active{background:#2563eb24;color:var(--fg-primary)}.ss_shell__nav_icon{display:inline-flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem;color:var(--fg-muted)}.ss_shell__nav_label{font-size:.9rem;color:inherit}.ss_shell__nav_group{border:none;>summary{list-style:none;&::-webkit-details-marker{display:none}}}.ss_shell__nav_group_header{display:flex;align-items:center;gap:.55rem;padding:.4rem .55rem;cursor:pointer;user-select:none;background:transparent;border-radius:var(--radius-md);transition:background-color .12s ease,color .12s ease;&:hover{background:#2563eb0f}}.ss_shell__nav_group_chevron{margin-left:auto;display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;color:var(--fg-muted)}.ss_shell__nav_group_chevron_svg{width:1rem;height:1rem}.ss_shell__nav_group[open]{.ss_shell__nav_group_chevron_svg{transform:rotate(90deg)}}.ss_shell__nav_group_items{padding-left:1.1rem;margin-top:.15rem;display:flex;flex-direction:column;gap:.2rem}@media (max-width: 55rem){.ss_shell__drawer_toggle{display:inline-flex}.ss_shell__nav{position:absolute;top:0;bottom:0;left:0;z-index:20;width:min(80vw,18rem);max-width:18rem;transform:translate(-100%);transition:transform .16s ease-out;box-shadow:var(--shadow-soft)}.ss_shell__main{padding:1.25rem}.ss_shell__scrim{display:block;position:absolute;inset:0;background:#02061766;opacity:0;pointer-events:none;transition:opacity .16s ease}.ss_shell__drawer_toggle_input:checked~.ss_shell__body{.ss_shell__nav{transform:translate(0)}.ss_shell__scrim{opacity:1;pointer-events:auto}}}}.ss_modal{position:fixed;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;padding:2rem 1rem;&[data-state=closed]{pointer-events:none}.ss_modal__backdrop{position:absolute;inset:0;background:#0206178c;opacity:0;transition:opacity .16s ease}.ss_modal__panel{position:relative;z-index:1;width:min(92vw,46rem);max-height:min(85vh,720px);display:flex;flex-direction:column;gap:0;padding:0;background-color:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);box-shadow:var(--shadow-soft);opacity:0;transform:translateY(10px) scale(.985);transition:transform .18s ease,opacity .16s ease;outline:none}.ss_modal__header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:1.3rem 1.5rem .75rem}.ss_modal__title{margin:0;font-size:1.08rem;font-weight:700;color:var(--fg-primary)}.ss_modal__close{flex-shrink:0;width:2rem;height:2rem;padding:0;display:inline-flex;align-items:center;justify-content:center;font-size:1.05rem;line-height:1;color:var(--clear-fg);background:var(--clear-bg);border:1px solid var(--clear-border);border-radius:var(--radius-pill);cursor:pointer;user-select:none;transition:background-color .1s ease,border-color .1s ease,transform 80ms ease;&:hover{background:var(--clear-bg-hover);border-color:var(--clear-border-hover)}&:focus-visible{outline:none;box-shadow:var(--focus-ring)}&:active{transform:translateY(1px)}}.ss_modal__body{color:var(--fg-secondary);line-height:1.6;overflow:auto}.ss_modal__body_inner{padding:0 1.5rem 1rem}.ss_modal__footer{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;padding:0 1.5rem 1.25rem}&[data-state=open]{.ss_modal__backdrop{opacity:1}.ss_modal__panel{opacity:1;transform:translateY(0) scale(1)}}@media (max-width: 40rem){padding:0;.ss_modal__panel:not(.ss_modal__panel--no-fullscreen){width:100vw;height:100vh;max-height:100vh;border-radius:0;border:none;.ss_modal__body{flex:1;min-height:0;overflow:auto}.ss_modal__footer{margin-top:auto;padding-top:.75rem;border-top:1px solid var(--border-subtle);background:var(--bg-surface)}}}}.ss_modal__panel--sm{width:min(90vw,26rem)}.ss_modal__panel--lg{width:min(92vw,48rem)}.ss_modal__panel--fullscreen{width:100vw;height:100vh;max-height:100vh;border-radius:0;border:none}.ss_modal__panel--fullscreen .ss_modal__body{flex:1;min-height:0;overflow:auto}.ss_modal__panel--fullscreen .ss_modal__footer{margin-top:auto;padding-top:.75rem;border-top:1px solid var(--border-subtle);background:var(--bg-surface)}@media (prefers-reduced-motion: reduce){*{animation-duration:0ms!important;transition-duration:0ms!important}}
1
+ :root{font-family:system-ui,-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,sans-serif;--bg-page: #f5f5f7;--bg-surface: #ffffff;--bg-surface-subtle: #f3f4f6;--shell-bg: radial-gradient(circle at top left, #eef2ff 0, #f5f5f7 38%, #f3f4f6 100%);--shell-header-bg: rgba(255, 255, 255, .85);--shell-header-border: rgba(209, 213, 219, .8);--shell-nav-bg: rgba(255, 255, 255, .92);--shell-nav-border: rgba(209, 213, 219, .85);--fg-primary: #0f172a;--fg-secondary: #4b5563;--fg-muted: #6b7280;--fg-inverse: #ffffff;--border-subtle: #e5e7eb;--border-strong: #d1d5db;--card-accent: #2563eb;--input-bg: #ffffff;--input-fg: var(--fg-primary);--input-border: #d1d5db;--input-border-hover: #9ca3af;--input-border-disabled: #e5e7eb;--input-bg-disabled: #f3f4f6;--input-fg-disabled: #9ca3af;--input-bg-hover: #f9fafb;--input-bg-focus: #ffffff;--scrollbar-thumb: rgba(15, 23, 42, .24);--primary: #2563eb;--primary-soft: #e0ecff;--primary-soft-stronger: #d1e1ff;--on-primary: #ffffff;--error: #dc2626;--on-error: #ffffff;--error-strong: #b91c1c;--disabled: #9ca3af;--on-disabled: #f9fafb;--suggestion-bg: var(--bg-surface);--suggestion-hover-bg: #f3f4ff;--suggestion-focus-bg: #e0ebff;--suggestion-selected-bg: #e0ebff;--suggestion-indicator: #2563eb;--btn-primary-bg: var(--primary);--btn-primary-border: #1d4ed8;--btn-primary-bg-hover: #1d4ed8;--btn-primary-border-hover: #1e40af;--btn-secondary-bg: #eef1f7;--btn-secondary-border: #d1d5db;--btn-secondary-bg-hover: #e0e3ec;--btn-secondary-border-hover: #cbd0dd;--btn-tertiary-bg: transparent;--btn-tertiary-border: var(--border-subtle);--btn-tertiary-bg-hover: #e9effa;--btn-tertiary-border-hover: var(--border-strong);--clear-bg: #edeff4;--clear-border: #e2e4ec;--clear-bg-hover: #e1e4ee;--clear-border-hover: #cbd0dd;--clear-fg: #4b5563;--token-bg: #eef2ff;--token-fg: #1f2937;--radius-sm: .375rem;--radius-md: .5rem;--radius-lg: .75rem;--radius-pill: 999px;--focus-ring: 0 0 0 1px rgba(37, 99, 235, .75), 0 0 0 4px rgba(191, 219, 254, .9);--focus-ring-error: 0 0 0 1px rgba(220, 38, 38, .85), 0 0 0 4px rgba(254, 202, 202, .85);--shadow-soft: 0 10px 30px rgba(15, 23, 42, .06);--btn-shadow: 0 6px 18px rgba(15, 23, 42, .16);--btn-shadow-hover: 0 10px 30px rgba(15, 23, 42, .18)}@media (prefers-color-scheme: dark){:root{--bg-page: #0f1115;--bg-surface: #14171c;--bg-surface-subtle: #1a1e24;--fg-primary: #e7e9ee;--fg-secondary: #c7cbd4;--fg-muted: #9ca3af;--fg-inverse: #0f1115;--border-subtle: #2a2f36;--border-strong: #3a4048;--card-accent: #94a3b8;--input-bg: #14171c;--input-fg: var(--fg-primary);--input-border: #2a2f36;--input-border-hover: #3a4048;--input-border-disabled: #111827;--input-bg-disabled: #14171c;--input-fg-disabled: #6b7280;--input-bg-hover: #1a1e24;--input-bg-focus: #20252c;--scrollbar-thumb: rgba(156, 163, 175, .38);--primary: #3b82f6;--primary-soft: #172554;--primary-soft-stronger: #1d4ed8;--on-primary: #ffffff;--error: #fb7185;--on-error: #0f1115;--error-strong: #f43f5e;--suggestion-bg: #14171c;--suggestion-hover-bg: #1b2027;--suggestion-focus-bg: #21262e;--suggestion-selected-bg: #262c35;--suggestion-indicator: #94a3b8;--btn-primary-bg: var(--primary);--btn-primary-border: #1d4ed8;--btn-primary-bg-hover: #1d4ed8;--btn-primary-border-hover: #1e3a8a;--btn-secondary-bg: #1a1e24;--btn-secondary-border: #2f353e;--btn-secondary-bg-hover: #232831;--btn-secondary-border-hover: #3a4048;--btn-tertiary-bg: transparent;--btn-tertiary-border: #2f353e;--btn-tertiary-bg-hover: #232831;--btn-tertiary-border-hover: #3a4048;--clear-bg: #1a1e24;--clear-border: #2f353e;--clear-bg-hover: #232831;--clear-border-hover: #3a4048;--clear-fg: #e5e7eb;--token-bg: #232831;--token-fg: #e5e7eb;--shadow-soft: 0 18px 50px rgba(0, 0, 0, .75);--btn-shadow: 0 12px 30px rgba(0, 0, 0, .65);--btn-shadow-hover: 0 16px 40px rgba(0, 0, 0, .85);--shell-bg: radial-gradient(circle at top left, #1c2129 0, #0f1115 45%, #12161b 100%);--shell-header-bg: rgba(20, 23, 28, .92);--shell-header-border: rgba(58, 64, 72, .9);--shell-nav-bg: rgba(20, 23, 28, .96);--shell-nav-border: rgba(58, 64, 72, .92)}}@keyframes input-alert-appear{0%{opacity:0;transform:translateY(-1px)}to{opacity:1;transform:translateY(0)}}*,*:before,*:after{box-sizing:border-box}*{-webkit-tap-highlight-color:transparent}body{margin:0;font-family:inherit;color:var(--fg-primary);background-color:var(--bg-page);font-size:14px}html,body,#root{position:relative;height:100%;width:100%;overflow:hidden}.ss_form{max-width:48rem;width:100%;margin:0 auto;display:flex;flex-direction:column;gap:1rem;padding:.5rem 0}.ss__suggestions{position:absolute;top:calc(100% + .35rem);left:0;right:0;z-index:10;display:flex;flex-direction:column;max-height:clamp(7rem,35vh,14rem);margin:0;padding:.25rem 0;list-style-type:none;background-color:var(--suggestion-bg);border-width:1px;border-style:solid;border-color:var(--border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-soft);overflow-y:auto;overflow-x:hidden;li{display:flex;align-items:flex-start;gap:.4rem;padding:.45rem .8rem;font-size:.9rem;line-height:1.45;color:var(--fg-primary);cursor:pointer;user-select:none;outline:none;+li{border-top:1px solid var(--border-subtle)}&:hover{background-color:var(--suggestion-hover-bg)}&:focus{background-color:var(--suggestion-focus-bg)}&.ss__hovered{background-color:var(--suggestion-focus-bg)}&.ss__selected{font-weight:500;background-color:var(--suggestion-selected-bg);box-shadow:inset 2px 0 0 var(--suggestion-indicator)}&.ss__selected.ss__hovered,&.ss__selected:hover{background-color:#2563eb14}.ss__title{font-weight:500}.ss__description{font-size:.8rem;color:var(--fg-muted)}}&::-webkit-scrollbar{width:6px}&::-webkit-scrollbar-track{background:transparent}&::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:999px}}.ss_form_input,.ss_form_date{display:flex;flex-direction:column;gap:.35rem;label{margin:0;font-size:.78rem;font-weight:600;letter-spacing:.01em;text-transform:none;color:var(--fg-muted)}.ss__wrapper{position:relative;display:inline-block;width:100%}input{display:block;width:100%;min-width:0;padding:.55rem .7rem;font-size:.95rem;line-height:1.4;color:var(--input-fg);background-color:var(--input-bg);border-width:1px;border-style:solid;border-color:var(--input-border);border-radius:var(--radius-md);outline:none;box-shadow:none;transition:border-color .12s ease,box-shadow .12s ease,background-color .12s ease,transform 80ms ease;&:hover:not([disabled]){border-color:var(--input-border-hover);background-color:var(--input-bg-hover)}&:focus-visible{border-color:var(--primary);box-shadow:var(--focus-ring);background-color:var(--input-bg-focus)}&[disabled]{cursor:not-allowed;color:var(--input-fg-disabled);background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled)}}.ss__suggestions{max-height:clamp(7rem,30vh,12rem)}&:not(:focus-within){.ss__suggestions{display:none}}&:has([role=alert]){input{border-color:var(--error);box-shadow:var(--focus-ring-error)}}[role=alert]{margin-top:.15rem;font-size:.8rem;line-height:1.4;color:var(--error);animation:.12s input-alert-appear ease-out}}.ss_form_date{position:relative;input{padding-right:2.1rem}input::-webkit-calendar-picker-indicator{opacity:0;display:none}}.ss_form_date__icon{position:absolute;right:.7rem;top:50%;width:1rem;height:1rem;transform:translateY(-50%);color:var(--fg-muted);padding:0;border:none;background:transparent;cursor:pointer;&:disabled{cursor:not-allowed;color:var(--input-fg-disabled)}svg{width:100%;height:100%;display:block}}.ss_form_date__picker{position:absolute;top:calc(100% + .35rem);left:0;z-index:10;width:min(18rem,100%);padding:.75rem;border-radius:var(--radius-md);border:1px solid var(--border-subtle);background:var(--bg-surface);box-shadow:var(--shadow-soft)}.ss_form_date__header{display:flex;align-items:center;justify-content:space-between;gap:.5rem;margin-bottom:.6rem}.ss_form_date__nav_group{display:flex;align-items:center;gap:.35rem}.ss_form_date__title{font-size:.9rem;font-weight:600;color:var(--fg-primary);text-transform:capitalize}.ss_form_date__nav{width:1.8rem;height:1.8rem;border-radius:var(--radius-pill);border:1px solid var(--border-subtle);background:var(--bg-surface-subtle);color:var(--fg-primary);cursor:pointer;transition:background-color .12s ease,border-color .12s ease;&:hover{border-color:var(--border-strong)}}.ss_form_date__nav svg{width:1rem;height:1rem;display:block;margin:0 auto}.ss_form_date__weekdays{display:grid;grid-template-columns:repeat(7,1fr);gap:.2rem;margin-bottom:.35rem;font-size:.75rem;color:var(--fg-muted);text-align:center}.ss_form_date__grid{display:grid;grid-template-columns:repeat(7,1fr);gap:.2rem}.ss_form_date__day{height:2rem;border-radius:var(--radius-md);border:1px solid transparent;background:transparent;color:var(--fg-primary);cursor:pointer;transition:background-color .12s ease,border-color .12s ease;&:hover{background:var(--bg-surface-subtle)}&.is-selected{background:var(--primary-soft);border-color:var(--primary);color:var(--fg-primary);font-weight:600}&.is-today:not(.is-selected){border-color:var(--border-strong);background:var(--bg-surface-subtle);color:var(--fg-primary);font-weight:500}}.ss_form_date__day.is-empty{border:none;background:transparent;cursor:default}.ss_form_checkbox{display:flex;flex-direction:column;gap:.3rem;width:100%;font-size:.9rem;color:var(--fg-secondary);.ss__wrapper{display:inline-flex;align-items:flex-start;gap:.55rem;padding:.15rem .05rem;font-size:.9rem;line-height:1.5;color:var(--fg-secondary);background-color:transparent;border:none;outline:none}input[type=checkbox]{margin-top:.12rem;width:1.05rem;height:1.05rem;flex-shrink:0;position:relative;appearance:none;-webkit-appearance:none;-moz-appearance:none;accent-color:initial;border-radius:calc(var(--radius-sm) * .9);border:1px solid var(--border-strong);background-color:var(--bg-surface);box-shadow:0 1px 1px #0f172a0f;cursor:pointer;outline:none;transition:background-color .12s ease,border-color .12s ease,box-shadow .12s ease,transform 80ms ease;&:hover:not(:disabled){border-color:var(--input-border-hover);background-color:var(--input-bg-hover)}&:active:not(:disabled){transform:translateY(1px)}&:after{content:"";position:absolute;inset:0;margin:auto;width:.55rem;height:.3rem;border-left:2px solid var(--on-primary);border-bottom:2px solid var(--on-primary);transform-origin:center;transform:translateY(-1px) rotate(-45deg) scale(.2);opacity:0;transition:transform .12s ease-out,opacity .12s ease-out}&:checked,&[aria-checked=true]{background-color:var(--primary)!important;border-color:var(--primary)!important;&:after{opacity:1;transform:translateY(-1px) rotate(-45deg) scale(1)}}&:checked[disabled],&[aria-checked=true][disabled]{background-color:color-mix(in srgb,var(--input-bg-disabled) 70%,var(--fg-primary))!important;border-color:var(--input-border-disabled)!important}&[disabled]{cursor:not-allowed;background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled);box-shadow:none;opacity:.75;&:after{border-color:#fff}}}&:has(input[type=checkbox]:focus-visible){input[type=checkbox]{outline:none;box-shadow:var(--focus-ring)}}label{margin:0;font-size:.9rem;line-height:1.5;color:var(--fg-primary);cursor:pointer;user-select:none}&:has(input[type=checkbox][disabled]){color:var(--input-fg-disabled);user-select:none;label{cursor:not-allowed;color:var(--input-fg-disabled)}}[role=alert]{font-size:.8rem;color:var(--error);animation:.12s input-alert-appear ease-out}}.ss_form_select{display:flex;flex-direction:column;gap:.35rem;width:100%;label{margin:0;font-size:.78rem;font-weight:600;letter-spacing:.01em;color:var(--fg-muted)}select{display:block;width:100%;padding:.55rem 2.1rem .55rem .7rem;font-size:.95rem;line-height:1.4;color:var(--input-fg);background-color:var(--input-bg);background-image:none;border-width:1px;border-style:solid;border-color:var(--input-border);border-radius:var(--radius-md);outline:none;appearance:none;box-shadow:none;transition:border-color .12s ease,box-shadow .12s ease,background-color .12s ease;&:hover:not([disabled]){border-color:var(--input-border-hover);background-color:var(--input-bg-hover)}&:focus-visible{border-color:var(--primary);box-shadow:var(--focus-ring);background-color:var(--input-bg-focus)}&:has(+[role=alert]){border-color:var(--error);box-shadow:var(--focus-ring-error)}&[disabled]{cursor:not-allowed;color:var(--input-fg-disabled);background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled)}}.ss_form_select__field{position:relative}.ss_form_select__icon{position:absolute;right:.7rem;top:50%;width:1rem;height:1rem;transform:translateY(-50%);color:var(--fg-muted);pointer-events:none}.ss_form_select__icon svg{width:100%;height:100%;display:block}[role=alert]{font-size:.8rem;color:var(--error);animation:.12s input-alert-appear ease-out}}.ss_form_ac_select{display:flex;flex-direction:column;gap:.35rem;label{margin:0;font-size:.78rem;font-weight:600;letter-spacing:.01em;color:var(--fg-muted)}.ss__wrapper{position:relative;display:inline-block;width:100%}.ss__input_row{display:flex;align-items:center;gap:.4rem;width:100%;min-width:0;padding:.5rem .65rem;font-size:.95rem;line-height:1.4;color:var(--input-fg);background-color:var(--input-bg);border-width:1px;border-style:solid;border-color:var(--input-border);border-radius:var(--radius-md);outline:none;box-shadow:none;transition:border-color .12s ease,box-shadow .12s ease,background-color .12s ease;&:hover:not(:has([disabled])){border-color:var(--input-border-hover);background-color:var(--input-bg-hover)}&:has([disabled]){cursor:not-allowed;color:var(--input-fg-disabled);background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled)}input{flex-grow:1;min-width:0;padding:0;font-size:inherit;line-height:inherit;color:inherit;background-color:transparent;border:none;outline:none}.ss__prefix{flex-shrink:0;padding:.2rem .6rem;font-size:.78rem;line-height:1.3;white-space:nowrap;color:var(--token-fg);background-color:var(--token-bg);border-radius:var(--radius-pill);cursor:pointer;user-select:none;border:1px solid rgba(37,99,235,.18);transition:background-color .1s ease,border-color .1s ease,transform 80ms ease,box-shadow .1s ease;&:hover{background-color:#2563eb0f;border-color:#2563eb59;box-shadow:0 0 0 1px #bfdbfecc}&:active{transform:translateY(1px)}}.ss__prefix[aria-disabled=true]{cursor:not-allowed;opacity:.6;pointer-events:none}.ss__suffix{flex-shrink:0}}.ss__selection{display:flex;align-items:center;gap:.5rem;width:100%;min-width:0;padding:.5rem .65rem;font-size:.95rem;line-height:1.4;color:var(--input-fg);background-color:var(--input-bg);border-width:1px;border-style:solid;border-color:var(--input-border);border-radius:var(--radius-md);outline:none;box-shadow:none;transition:border-color .12s ease,box-shadow .12s ease,background-color .12s ease;&:has(.ss__clear[disabled]){cursor:not-allowed;color:var(--input-fg-disabled);background-color:var(--input-bg-disabled);border-color:var(--input-border-disabled)}}.ss__content{flex:1;min-width:0}.ss__clear{flex-shrink:0;width:1.7rem;height:1.7rem;display:inline-flex;align-items:center;justify-content:center;font-size:.9rem;line-height:1;color:var(--clear-fg);background:var(--clear-bg);border-width:1px;border-style:solid;border-color:var(--clear-border);border-radius:var(--radius-pill);cursor:pointer;user-select:none;transition:background-color .1s ease,border-color .1s ease,transform 80ms ease;&:hover:not([disabled]){border-color:var(--clear-border-hover);background-color:var(--clear-bg-hover)}&:active:not([disabled]){transform:translateY(1px)}&[disabled]{cursor:not-allowed;opacity:.55}}.ss__suggestions{max-height:clamp(8rem,40vh,16rem);li{padding-inline:.85rem}}&:not(:focus-within){.ss__suggestions{display:none}}&:focus-within{.ss__input_row,.ss__selection{border-color:var(--primary);box-shadow:var(--focus-ring);background-color:var(--input-bg-focus)}}&:has([role=alert]){.ss__input_row,.ss__selection{border-color:var(--error);box-shadow:var(--focus-ring-error)}}[role=alert]{font-size:.8rem;color:var(--error);animation:.12s input-alert-appear ease-out}}.ss_button{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;padding:.55rem 1.05rem;font-size:.9rem;font-weight:600;text-transform:none;text-align:center;letter-spacing:.01em;color:var(--on-primary);background:var(--btn-primary-bg);border:1px solid var(--btn-primary-border);border-radius:var(--radius-pill);outline:none;cursor:pointer;user-select:none;transition:background-color .12s ease,border-color .12s ease,opacity 80ms ease,transform 80ms ease,color .1s ease;&.secondary{color:var(--fg-primary);background:var(--btn-secondary-bg);border-color:var(--btn-secondary-border);box-shadow:none}&.tertiary{color:var(--fg-secondary);background:var(--btn-tertiary-bg);border-color:var(--btn-tertiary-border);box-shadow:none}&.danger{color:var(--on-error);background:var(--error);border-color:var(--error)}&:hover:not([disabled]){background-color:var(--btn-primary-bg-hover);border-color:var(--btn-primary-border-hover);&.secondary{background-color:var(--btn-secondary-bg-hover);border-color:var(--btn-secondary-border-hover)}&.tertiary{background-color:var(--btn-tertiary-bg-hover);border-color:var(--btn-tertiary-border-hover)}&.danger{background-color:var(--error-strong);border-color:var(--error-strong)}}&:active:not([disabled]){transform:translateY(1px)}&:focus-visible{outline:none;box-shadow:var(--focus-ring)}&[disabled]{cursor:not-allowed;color:var(--on-disabled);background:var(--disabled);border-color:var(--disabled);opacity:.9}}.ss_button--icon{width:2.1rem;height:2.1rem;padding:0;font-size:1.1rem;line-height:1;color:var(--fg-primary);background:transparent;border-color:transparent;border-radius:var(--radius-pill);box-shadow:none;transition:background-color .1s ease,border-color .1s ease,transform 80ms ease;&:hover:not([disabled]){background-color:var(--btn-tertiary-bg-hover);border-color:var(--btn-tertiary-border-hover)}&:active:not([disabled]){transform:translateY(1px)}&[disabled]{opacity:.5}}.ss_callout{--ss-callout-accent: var(--primary);--ss-callout-accent-soft: color-mix(in srgb, var(--ss-callout-accent) 22%, transparent);position:relative;display:flex;align-items:center;gap:1rem;width:100%;padding:1.15rem 1.4rem;font-size:.95rem;line-height:1.55;color:var(--fg-secondary);background:radial-gradient(circle at top left,var(--ss-callout-accent-soft) 0%,color-mix(in srgb,var(--ss-callout-accent-soft) 80%,var(--bg-surface) 20%) 28%,color-mix(in srgb,var(--ss-callout-accent-soft) 40%,var(--bg-surface) 60%) 62%,color-mix(in srgb,var(--ss-callout-accent-soft) 12%,var(--bg-surface) 88%) 82%,var(--bg-surface-subtle) 100%),var(--bg-surface);border-radius:calc(var(--radius-md) * 1.2);border:1px solid color-mix(in srgb,var(--border-subtle) 60%,var(--ss-callout-accent) 40%);.ss_callout__icon{flex-shrink:0;color:var(--ss-callout-accent);svg{width:1.6rem;height:1.6rem;display:block}}.ss_callout__content{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center}.ss_callout__title{margin:0;font-size:1rem;font-weight:600;color:var(--fg-primary);line-height:1.45}.ss_callout__body{margin:.25rem 0 0;color:var(--fg-secondary)}.ss_callout__actions{margin-top:.65rem;display:inline-flex;gap:.65rem;font-size:.9rem;button,.ss_callout__link{padding:0;border:none;background:none;font:inherit;cursor:pointer;text-decoration:none;color:color-mix(in srgb,var(--ss-callout-accent) 80%,var(--fg-primary) 20%);&:hover{text-decoration:underline}}}&.ss_callout--subtle{box-shadow:none;border-color:var(--border-subtle);background:color-mix(in srgb,var(--bg-surface-subtle) 85%,var(--ss-callout-accent-soft) 15%)}}.ss_callout--red{--ss-callout-accent: #E53935}.ss_callout--pink{--ss-callout-accent: #D81B60}.ss_callout--purple{--ss-callout-accent: #8E24AA}.ss_callout--deep-purple{--ss-callout-accent: #5E35B1}.ss_callout--indigo{--ss-callout-accent: #3949AB}.ss_callout--blue{--ss-callout-accent: #1E88E5}.ss_callout--light-blue{--ss-callout-accent: #039BE5}.ss_callout--cyan{--ss-callout-accent: #00ACC1}.ss_callout--teal{--ss-callout-accent: #00897B}.ss_callout--green{--ss-callout-accent: #43A047}.ss_callout--light-green{--ss-callout-accent: #7CB342}.ss_callout--lime{--ss-callout-accent: #C0CA33}.ss_callout--yellow{--ss-callout-accent: #FDD835}.ss_callout--amber{--ss-callout-accent: #FFB300}.ss_callout--orange{--ss-callout-accent: #FB8C00}.ss_callout--deep-orange{--ss-callout-accent: #F4511E}.ss_callout--brown{--ss-callout-accent: #6D4C41}.ss_callout--grey{--ss-callout-accent: #757575}.ss_callout--blue-grey{--ss-callout-accent: #546E7A}.ss_dropdown{position:relative;display:inline-flex}.ss_dropdown__trigger{justify-content:center}.ss_dropdown__menu{position:absolute;top:calc(100% + .4rem);right:0;z-index:30;min-width:12rem;padding:.4rem;background:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-soft);opacity:0;transform:translateY(-6px) scale(.98);transition:opacity .14s ease,transform .16s ease;&[data-state=open]{opacity:1;transform:translateY(0) scale(1)}&[data-state=closed]{opacity:0;transform:translateY(-6px) scale(.98)}}.ss_dropdown__item{width:100%;display:flex;align-items:center;gap:.6rem;padding:.45rem .55rem;border-radius:var(--radius-md);border:none;background:transparent;color:var(--fg-primary);cursor:pointer;text-align:left;transition:background-color .12s ease,color .12s ease;&:hover{background:var(--bg-surface-subtle)}}.ss_dropdown__item_icon{display:inline-flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem;color:var(--fg-muted);svg{width:100%;height:100%}}.ss_dropdown__item_label{flex:1;min-width:0;font-size:.9rem}.ss_dropdown__item_check{display:inline-flex;align-items:center;justify-content:center;color:var(--primary);svg{width:1rem;height:1rem}}.ss_chip{--ss-chip-accent: var(--primary);--ss-chip-accent-soft: color-mix(in srgb, var(--ss-chip-accent) 16%, transparent);display:inline-flex;align-items:center;gap:.4rem;padding:.3rem .65rem;border-radius:var(--radius-pill);border:1px solid color-mix(in srgb,var(--ss-chip-accent) 45%,var(--border-subtle) 55%);background:color-mix(in srgb,var(--ss-chip-accent-soft) 60%,var(--bg-surface) 40%);color:var(--fg-primary);font-size:.82rem;line-height:1.3}.ss_chip--clickable{cursor:pointer;transition:background-color .12s ease,border-color .12s ease,transform 80ms ease;&:hover{border-color:color-mix(in srgb,var(--ss-chip-accent) 65%,var(--border-strong) 35%);background:color-mix(in srgb,var(--ss-chip-accent-soft) 75%,var(--bg-surface) 25%)}&:active{transform:translateY(1px)}}.ss_chip__label{white-space:nowrap}.ss_chip__dismiss{width:1.3rem;height:1.3rem;padding:0;border:none;background:transparent;color:var(--fg-muted);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;svg{width:.9rem;height:.9rem}&:hover{color:var(--fg-primary)}}.ss_chip--red{--ss-chip-accent: #E53935}.ss_chip--pink{--ss-chip-accent: #D81B60}.ss_chip--purple{--ss-chip-accent: #8E24AA}.ss_chip--deep-purple{--ss-chip-accent: #5E35B1}.ss_chip--indigo{--ss-chip-accent: #3949AB}.ss_chip--blue{--ss-chip-accent: #1E88E5}.ss_chip--light-blue{--ss-chip-accent: #039BE5}.ss_chip--cyan{--ss-chip-accent: #00ACC1}.ss_chip--teal{--ss-chip-accent: #00897B}.ss_chip--green{--ss-chip-accent: #43A047}.ss_chip--light-green{--ss-chip-accent: #7CB342}.ss_chip--lime{--ss-chip-accent: #C0CA33}.ss_chip--yellow{--ss-chip-accent: #FDD835}.ss_chip--amber{--ss-chip-accent: #FFB300}.ss_chip--orange{--ss-chip-accent: #FB8C00}.ss_chip--deep-orange{--ss-chip-accent: #F4511E}.ss_chip--brown{--ss-chip-accent: #6D4C41}.ss_chip--grey{--ss-chip-accent: #757575}.ss_chip--blue-grey{--ss-chip-accent: #546E7A}.ss_table{width:100%;border:1px solid var(--border-subtle);border-radius:var(--radius-lg);background:var(--bg-surface);box-shadow:var(--shadow-soft);overflow:hidden}.ss_table__scroll{overflow:auto}.ss_table table{width:100%;border-collapse:collapse;min-width:32rem}.ss_table th{text-align:left;font-size:.8rem;text-transform:uppercase;letter-spacing:.04em;color:var(--fg-muted);background:color-mix(in srgb,var(--bg-surface-subtle) 80%,var(--bg-surface) 20%);border-bottom:1px solid var(--border-subtle);padding:.75rem .9rem}.ss_table__header_label{display:inline-flex;align-items:center;gap:.35rem}.ss_table__sort_button{border:none;background:transparent;padding:0;font:inherit;color:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:.35rem}.ss_table__sort_icon{display:inline-flex;align-items:center;justify-content:center;color:currentColor;opacity:.7}.ss_table__sort_icon svg{width:1rem;height:1rem}.ss_table td{padding:.8rem .9rem;border-bottom:1px solid var(--border-subtle);color:var(--fg-primary);font-size:.9rem}.ss_table tbody tr:last-child td{border-bottom:none}.ss_table__pagination{display:flex;align-items:center;justify-content:center;gap:.75rem;padding:.75rem .9rem;border-top:1px solid var(--border-subtle);background:color-mix(in srgb,var(--bg-surface-subtle) 80%,var(--bg-surface) 20%)}.ss_table--pagination-top .ss_table__pagination{border-top:none;border-bottom:1px solid var(--border-subtle)}.ss_table__page_button{border:1px solid var(--border-subtle);background:var(--bg-surface);color:var(--fg-primary);border-radius:var(--radius-pill);width:2rem;height:2rem;padding:0;font-size:.85rem;cursor:pointer;transition:background-color .12s ease,border-color .12s ease;&:hover:not(:disabled){border-color:var(--border-strong);background:var(--bg-surface)}&:disabled{cursor:not-allowed;color:var(--fg-muted);border-color:var(--border-subtle);background:var(--bg-surface);opacity:.6}}.ss_table__page_info{font-size:.85rem;color:var(--fg-muted)}.ss_table__page_button svg{width:1rem;height:1rem;display:block;margin:0 auto}.ss_table td>div{display:inline-flex;align-items:center;gap:.4rem;min-width:0}.ss_table tbody tr[data-clickable=true]{cursor:pointer;transition:background-color .12s ease}.ss_table tbody tr[data-clickable=true]:hover{background:var(--bg-surface-subtle)}.ss_expandable{width:100%;background:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-soft);overflow:hidden;.ss_expandable__header{width:100%;display:flex;align-items:center;gap:.6rem;padding:.9rem 1rem;text-align:left;background:var(--bg-surface);border:none;color:var(--fg-primary);cursor:pointer;user-select:none;transition:background-color .12s ease;&:hover{background:var(--bg-surface-subtle)}&:focus-visible{outline:none;box-shadow:var(--focus-ring)}}.ss_expandable__icon{display:inline-flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem;color:var(--fg-muted);svg{width:1.1rem;height:1.1rem}}.ss_expandable__title{font-size:.96rem;font-weight:600;color:inherit}.ss_expandable__content{overflow:hidden;padding:0;background:var(--bg-surface);transition-property:height}.ss_expandable__divider_wrapper{padding:0 1rem 1rem}.ss_expandable__divider{height:1px;margin:.75rem 0 .8rem;background:var(--border-subtle)}}.ss_divider{width:100%;height:1px;background:var(--border-subtle)}.ss_divider--vertical{width:1px;height:100%}.ss_surface{width:100%;padding:1rem 1.25rem;background:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);box-shadow:var(--shadow-soft)}.ss_tile{width:100%;padding:.9rem 1rem;background:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-md);box-shadow:var(--shadow-soft)}.ss_tile__row{display:flex;align-items:center;gap:.5rem}.ss_tile__icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--fg-muted);svg{width:1.25rem;height:1.25rem}}.ss_tile__content{flex:1;min-width:0}.ss_tile__trailing{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--fg-muted);font-size:.8rem}.ss_tile__title{margin:0;font-size:.95rem;font-weight:600;color:var(--fg-primary)}.ss_tile__link,.ss_tile__text{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ss_tile__link{color:inherit;text-decoration:none;&:hover{text-decoration:underline}}.ss_tile__subtitle{margin-top:.2rem;font-size:.82rem;color:var(--fg-secondary)}.ss_header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.25rem}.ss_header__text{min-width:0}.ss_header__title{margin:0;font-size:1.8rem;font-weight:600;color:var(--fg-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ss_header__subtitle{margin:-.35rem 0 0;font-size:1rem;font-weight:500;color:var(--fg-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ss_header__actions{flex-shrink:0;display:inline-flex;align-items:center;gap:.5rem}.ss_shell{height:100%;overflow:hidden;display:flex;flex-direction:column;background:var(--shell-bg);color:var(--fg-primary);.ss_shell__drawer_toggle_input{position:absolute;opacity:0;pointer-events:none}.ss_shell__header{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.7rem .9rem;background:var(--shell-header-bg);backdrop-filter:blur(18px);border-bottom:1px solid var(--shell-header-border)}.ss_shell__header_left{display:flex;align-items:center;gap:.75rem}.ss_shell__drawer_toggle{display:none}.ss_shell__title{font-size:1rem;font-weight:700;letter-spacing:.02em;color:var(--fg-primary)}.ss_shell__actions{display:flex;align-items:center;gap:.4rem}.ss_shell__body{flex:1 1 auto;min-height:0;display:flex;position:relative;overflow:hidden}.ss_shell__nav{flex:0 0 16rem;max-width:16rem;background:var(--shell-nav-bg);backdrop-filter:blur(12px);border-right:1px solid var(--shell-nav-border);overflow:auto}.ss_shell__nav_inner{padding:.75rem .7rem 1rem}.ss_shell__main{flex:1 1 auto;min-width:0;overflow:auto;padding:1.25rem 1.3rem 1.6rem}.ss_shell__scrim{display:none}.ss_shell__nav_list{display:flex;flex-direction:column;gap:.25rem}.ss_shell__nav_item{display:flex;align-items:center;gap:.55rem;padding:.4rem .55rem;border-radius:var(--radius-md);color:var(--fg-primary);text-decoration:none;background:transparent;border:none;cursor:pointer;transition:background-color .12s ease,color .12s ease;&:hover{background:#2563eb0f}}.ss_shell__nav_item--active{background:#2563eb24;color:var(--fg-primary)}.ss_shell__nav_icon{display:inline-flex;align-items:center;justify-content:center;width:1.1rem;height:1.1rem;color:var(--fg-muted)}.ss_shell__nav_label{font-size:.9rem;color:inherit}.ss_shell__nav_group{border:none;>summary{list-style:none;&::-webkit-details-marker{display:none}}}.ss_shell__nav_group_header{display:flex;align-items:center;gap:.55rem;padding:.4rem .55rem;cursor:pointer;user-select:none;background:transparent;border-radius:var(--radius-md);transition:background-color .12s ease,color .12s ease;&:hover{background:#2563eb0f}}.ss_shell__nav_group_chevron{margin-left:auto;display:inline-flex;align-items:center;justify-content:center;width:1rem;height:1rem;color:var(--fg-muted)}.ss_shell__nav_group_chevron_svg{width:1rem;height:1rem}.ss_shell__nav_group[open]{.ss_shell__nav_group_chevron_svg{transform:rotate(90deg)}}.ss_shell__nav_group_items{padding-left:1.1rem;margin-top:.15rem;display:flex;flex-direction:column;gap:.2rem}@media (max-width: 55rem){.ss_shell__drawer_toggle{display:inline-flex}.ss_shell__nav{position:absolute;top:0;bottom:0;left:0;z-index:20;width:min(80vw,18rem);max-width:18rem;transform:translate(-100%);transition:transform .16s ease-out;box-shadow:var(--shadow-soft)}.ss_shell__main{padding:1.25rem}.ss_shell__scrim{display:block;position:absolute;inset:0;background:#02061766;opacity:0;pointer-events:none;transition:opacity .16s ease}.ss_shell__drawer_toggle_input:checked~.ss_shell__body{.ss_shell__nav{transform:translate(0)}.ss_shell__scrim{opacity:1;pointer-events:auto}}}}.ss_modal{position:fixed;inset:0;z-index:100;display:flex;align-items:center;justify-content:center;padding:2rem 1rem;&[data-state=closed]{pointer-events:none}.ss_modal__backdrop{position:absolute;inset:0;background:#0206178c;opacity:0;transition:opacity .16s ease}.ss_modal__panel{position:relative;z-index:1;width:min(92vw,46rem);max-height:min(85vh,720px);display:flex;flex-direction:column;gap:0;padding:0;background-color:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);box-shadow:var(--shadow-soft);opacity:0;transform:translateY(10px) scale(.985);transition:transform .18s ease,opacity .16s ease;outline:none}.ss_modal__header{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:1.3rem 1.5rem .75rem}.ss_modal__title{margin:0;font-size:1.08rem;font-weight:700;color:var(--fg-primary)}.ss_modal__close{flex-shrink:0;width:2rem;height:2rem;padding:0;display:inline-flex;align-items:center;justify-content:center;font-size:1.05rem;line-height:1;color:var(--clear-fg);background:var(--clear-bg);border:1px solid var(--clear-border);border-radius:var(--radius-pill);cursor:pointer;user-select:none;transition:background-color .1s ease,border-color .1s ease,transform 80ms ease;&:hover{background:var(--clear-bg-hover);border-color:var(--clear-border-hover)}&:focus-visible{outline:none;box-shadow:var(--focus-ring)}&:active{transform:translateY(1px)}}.ss_modal__body{color:var(--fg-secondary);line-height:1.6;overflow:auto}.ss_modal__body_inner{padding:0 1.5rem 1rem}.ss_modal__footer{display:flex;align-items:center;justify-content:flex-end;gap:.5rem;padding:0 1.5rem 1.25rem}&[data-state=open]{.ss_modal__backdrop{opacity:1}.ss_modal__panel{opacity:1;transform:translateY(0) scale(1)}}@media (max-width: 40rem){padding:0;.ss_modal__panel:not(.ss_modal__panel--no-fullscreen){width:100vw;height:100vh;max-height:100vh;border-radius:0;border:none;.ss_modal__body{flex:1;min-height:0;overflow:auto}.ss_modal__footer{margin-top:auto;padding-top:.75rem;border-top:1px solid var(--border-subtle);background:var(--bg-surface)}}}}.ss_modal__panel--sm{width:min(90vw,26rem)}.ss_modal__panel--lg{width:min(92vw,48rem)}.ss_modal__panel--fullscreen{width:100vw;height:100vh;max-height:100vh;border-radius:0;border:none}.ss_modal__panel--fullscreen .ss_modal__body{flex:1;min-height:0;overflow:auto}.ss_modal__panel--fullscreen .ss_modal__footer{margin-top:auto;padding-top:.75rem;border-top:1px solid var(--border-subtle);background:var(--bg-surface)}@media (prefers-reduced-motion: reduce){*{animation-duration:0ms!important;transition-duration:0ms!important}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sortsys/ui",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Simple and beautiful UI library for sortsys",
5
5
  "license": "MIT",
6
6
  "author": "Ludwig Lehnert",