@pineui/react 0.1.0 → 0.1.1
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/components/Avatar.d.ts +1 -1
- package/dist/components/Card.d.ts +4 -2
- package/dist/components/CollectionMap.d.ts +15 -0
- package/dist/components/ConditionalMap.d.ts +16 -0
- package/dist/components/Image.d.ts +1 -1
- package/dist/components/Input.d.ts +4 -1
- package/dist/pineui.es.js +524 -467
- package/dist/pineui.standalone.js +10 -10
- package/dist/pineui.umd.js +3 -3
- package/dist/style.css +1 -1
- package/package.json +2 -2
package/dist/pineui.umd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(A,m){typeof exports=="object"&&typeof module<"u"?m(exports,require("react"),require("react-dom")):typeof define=="function"&&define.amd?define(["exports","react","react-dom"],m):(A=typeof globalThis<"u"?globalThis:A||self,m(A.PineUI={},A.React,A.ReactDOM))})(this,function(A,m,re){"use strict";var U={},K=re;U.createRoot=K.createRoot,U.hydrateRoot=K.hydrateRoot;var Y={exports:{}},P={};/**
|
|
2
2
|
* @license React
|
|
3
3
|
* react-jsx-runtime.production.min.js
|
|
4
4
|
*
|
|
@@ -6,9 +6,9 @@
|
|
|
6
6
|
*
|
|
7
7
|
* This source code is licensed under the MIT license found in the
|
|
8
8
|
* LICENSE file in the root directory of this source tree.
|
|
9
|
-
*/var ie=m,ae=Symbol.for("react.element"),le=Symbol.for("react.fragment"),ce=Object.prototype.hasOwnProperty,de=ie.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,ue={key:!0,ref:!0,__self:!0,__source:!0};function Q(e,n,s){var t,o={},i=null,a=null;s!==void 0&&(i=""+s),n.key!==void 0&&(i=""+n.key),n.ref!==void 0&&(a=n.ref);for(t in n)ce.call(n,t)&&!ue.hasOwnProperty(t)&&(o[t]=n[t]);if(e&&e.defaultProps)for(t in n=e.defaultProps,n)o[t]===void 0&&(o[t]=n[t]);return{$$typeof:ae,type:e,key:i,ref:a,props:o,_owner:de.current}}F.Fragment=le,F.jsx=Q,F.jsxs=Q,K.exports=F;var r=K.exports;function M(e,n){if(typeof e=="string")return pe(e,n);if(Array.isArray(e))return e.map(s=>M(s,n));if(e&&typeof e=="object"){const s={};for(const t in e)s[t]=M(e[t],n);return s}return e}function pe(e,n){const s=e.match(/^\{\{(.+)\}\}$/);if(s){const t=s[1].trim();return(t==="item"||t.startsWith("item."))&&(!("item"in n)||n.item===void 0)?e:X(t,n)}return e.replace(/\{\{(.+?)\}\}/g,(t,o)=>{const i=X(o.trim(),n);return i!=null?String(i):""})}function X(e,n){try{return/^[\w.]+$/.test(e)?W(n,e):e.includes("!")||e.includes("==")||e.includes("!=")?fe(e,n):e.includes("|")?he(e,n):W(n,e)}catch(s){console.warn(`Failed to evaluate expression: ${e}`,s);return}}function W(e,n){const s=n.split(".");let t=e;for(const o of s){if(t==null)return;t=t[o]}return t}function fe(e,n){if(e.startsWith("!"))return!W(n,e.slice(1).trim());if(e.includes("!= null")){const s=e.split("!=")[0].trim();return W(n,s)!=null}if(e.includes("==")){const[s,t]=e.split("==").map(a=>a.trim()),o=W(n,s),i=t.startsWith("'")||t.startsWith('"')?t.slice(1,-1):W(n,t);return o==i}return!1}function he(e,n){const[s,t]=e.split("|").map(i=>i.trim()),o=W(n,s);return t==="timeAgo"?me(o):o}function me(e){if(!e)return"";const n=new Date(e);if(isNaN(n.getTime()))return e;const t=Math.floor((new Date().getTime()-n.getTime())/1e3);return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:t<2592e3?`${Math.floor(t/86400)}d`:t<31536e3?`${Math.floor(t/2592e3)}mo`:`${Math.floor(t/31536e3)}y`}function Z(e){var n,s,t="";if(typeof e=="string"||typeof e=="number")t+=e;else if(typeof e=="object")if(Array.isArray(e)){var o=e.length;for(n=0;n<o;n++)e[n]&&(s=Z(e[n]))&&(t&&(t+=" "),t+=s)}else for(s in e)e[s]&&(t&&(t+=" "),t+=s);return t}function D(){for(var e,n,s=0,t="",o=arguments.length;s<o;s++)(e=arguments[s])&&(n=Z(e))&&(t&&(t+=" "),t+=n);return t}const ve=({content:e,style:n="bodyMedium",color:s,fontWeight:t,maxLines:o})=>{const i=D("pineui-text",`pineui-text--${n}`,{"pineui-text--bold":t==="bold"}),a={color:s?`var(--md-sys-color-${s}, ${s})`:void 0,WebkitLineClamp:o??void 0,display:o?"-webkit-box":void 0,WebkitBoxOrient:o?"vertical":void 0,overflow:o?"hidden":void 0};return r.jsx("p",{className:i,style:a,children:e||"(empty)"})},J=({type:e,label:n,icon:s,enabled:t=!0,loading:o=!1,onPress:i,context:a,size:d="medium",color:c})=>{const u=async()=>{if(!t||o||!i||!a)return;const j=M(i,a);await a.executeAction(j)},y=D("pineui-button",`pineui-button--${e.split(".")[1]}`,{"pineui-button--disabled":!t,"pineui-button--loading":o,[`pineui-button--${d}`]:d}),g={color:c?`var(--md-sys-color-${c}, ${c})`:void 0};return r.jsxs("button",{className:y,onClick:u,disabled:!t||o,style:g,children:[o?r.jsx("span",{className:"pineui-button__spinner",children:"⏳"}):s?r.jsx("span",{className:"pineui-button__icon",children:s}):null,n&&r.jsx("span",{className:"pineui-button__label",children:n})]})},$=({type:e,children:n=[],spacing:s=0,padding:t=0,mainAxisAlignment:o="start",crossAxisAlignment:i="start",flex:a,width:d,height:c,maxWidth:u,overflow:y,backgroundColor:g,border:j,borderRadius:R,elevation:E,borderRight:A,borderLeft:C,borderTop:L,borderBottom:I,onPress:_,context:w,renderer:B})=>{if(!B||!w)return null;const V=async()=>{if(_&&w){const x=M(_,w);await w.executeAction(x)}},f=e==="layout.column",h=D("pineui-layout",{"pineui-layout--column":f,"pineui-layout--row":!f}),l={display:"flex",flexDirection:f?"column":"row",gap:`${s}px`,padding:`${t}px`,justifyContent:ye(o),alignItems:ge(i),flex:a,width:d!==void 0?typeof d=="number"?`${d}px`:d:void 0,height:c!==void 0?typeof c=="number"?`${c}px`:c:void 0,maxWidth:u!==void 0?typeof u=="number"?`${u}px`:u:void 0,overflow:y,backgroundColor:g,border:j,borderRadius:R!==void 0?`${R}px`:void 0,boxShadow:E?xe(E):void 0,borderRight:A,borderLeft:C,borderTop:L,borderBottom:I,minWidth:0,cursor:_?"pointer":void 0};return r.jsx("div",{className:h,style:l,onClick:_?V:void 0,children:n.map((x,p)=>r.jsx(B,{node:x,context:w},p))})};function ye(e){return{start:"flex-start",center:"center",end:"flex-end",spaceBetween:"space-between",spaceAround:"space-around"}[e]||"flex-start"}function ge(e){return{start:"flex-start",center:"center",end:"flex-end",stretch:"stretch"}[e]||"flex-start"}function xe(e){const n={1:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",2:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)",3:"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)",4:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)",5:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)"};return n[e]||n[1]}const be={text:ve,"button.filled":J,"button.text":J,"button.icon":J,"button.fab":J,"layout.column":$,"layout.row":$,"layout.scaffold":({appBar:e,body:n,floatingActionButton:s,bottomNavigationBar:t,context:o,renderer:i})=>!i||!o?null:r.jsxs("div",{className:"pineui-scaffold",children:[e&&r.jsx("header",{className:"pineui-scaffold__appbar",children:r.jsx(i,{node:e,context:o})}),r.jsx("main",{className:"pineui-scaffold__body",children:r.jsx(i,{node:n,context:o})}),s&&r.jsx("div",{className:"pineui-scaffold__fab",children:r.jsx(i,{node:s,context:o})}),t&&r.jsx("footer",{className:"pineui-scaffold__bottomnav",children:r.jsx(i,{node:t,context:o})})]}),"layout.appBar":({title:e,leading:n,actions:s=[],context:t,renderer:o})=>!o||!t?null:r.jsxs("div",{className:"pineui-appbar",children:[n&&r.jsx("div",{className:"pineui-appbar__leading",children:r.jsx(o,{node:n,context:t})}),e&&r.jsx("div",{className:"pineui-appbar__title",children:r.jsx(o,{node:e,context:t})}),s.length>0&&r.jsx("div",{className:"pineui-appbar__actions",children:s.map((i,a)=>r.jsx(o,{node:i,context:t},a))})]}),"layout.bottomNav":({items:e,currentIndex:n,onItemTap:s,context:t})=>{const o=async i=>{if(!t)return;const a=JSON.parse(JSON.stringify(s).replace(/\{\{item\.(\w+)\}\}/g,(d,c)=>{const u=i[c];return u!=null?String(u):""}));await t.executeAction(a)};return r.jsx("nav",{className:"pineui-bottomnav",children:e.map((i,a)=>r.jsxs("button",{className:`pineui-bottomnav__item ${a===n?"pineui-bottomnav__item--active":""}`,onClick:()=>o(i),children:[r.jsxs("div",{className:"pineui-bottomnav__icon-container",children:[r.jsx("span",{className:"pineui-bottomnav__icon",children:i.icon}),i.badge&&i.badge>0&&r.jsx("span",{className:"pineui-bottomnav__badge",children:i.badge})]}),r.jsx("span",{className:"pineui-bottomnav__label",children:i.label})]},a))})},card:({child:e,elevation:n=1,padding:s=16,onTap:t,context:o,renderer:i})=>{if(!i||!o)return null;const a=async()=>{if(t&&o){const u=M(t,o);await o.executeAction(u)}},d=D("pineui-card",`pineui-card--elevation-${n}`,{"pineui-card--clickable":!!t}),c={padding:`${s}px`};return r.jsx("div",{className:d,style:c,onClick:t?a:void 0,children:r.jsx(i,{node:e,context:o})})},image:({src:e,alt:n="",aspectRatio:s,borderRadius:t=0,loading:o="lazy",onTap:i,context:a})=>{const d=async()=>{i&&a&&await a.executeAction(i)},c={width:"100%",aspectRatio:s,borderRadius:`${t}px`,objectFit:"cover",cursor:i?"pointer":void 0};return r.jsx("img",{className:"pineui-image",src:e,alt:n,loading:o,style:c,onClick:i?d:void 0})},avatar:({src:e,size:n=40,onTap:s,context:t})=>{const o=async()=>{s&&t&&await t.executeAction(s)},i={width:`${n}px`,height:`${n}px`,borderRadius:"50%",objectFit:"cover",cursor:s?"pointer":void 0};return r.jsx("img",{className:"pineui-avatar",src:e,alt:"Avatar",style:i,onClick:s?o:void 0})},icon:({name:e,size:n=24,color:s,visible:t=!0})=>{if(!t)return null;const o={fontSize:`${n}px`,color:s?`var(--md-sys-color-${s}, ${s})`:void 0},i={verified:"✓",favorite:"❤️",favoriteBorder:"🤍",chatBubbleOutline:"💬",repeat:"🔁",bookmark:"🔖",bookmarkBorder:"🔖",iosShare:"↗️",moreVert:"⋮"};return r.jsx("span",{className:"pineui-icon",style:o,children:i[e]||e})},collection:({id:e,layout:n="list",columns:s=3,spacing:t=16,data:o,itemTemplate:i,loadingState:a,emptyState:d,errorState:c,refreshable:u=!1,context:y,renderer:g})=>{const[j,R]=m.useState([]),[E,A]=m.useState(!0),[C,L]=m.useState(!1),[I,_]=m.useState(null),[w,B]=m.useState(!0),[V,f]=m.useState(null);m.useEffect(()=>{h()},[y==null?void 0:y.state]);const h=async(x=!1)=>{if(y)try{if(x?L(!0):A(!0),_(null),o.type==="action.http"){let p=o.url;p.includes("{{state.")&&(p=p.replace(/\{\{state\.([^}]+)\}\}/g,(N,T)=>{const P=T.split(".");let O=y.state;for(const U of P){if(O==null)return"";O=O[U]}return O!=null?String(O):""})),x&&V&&(p+=`${p.includes("?")?"&":"?"}after=${V}`);const b=await(await fetch(p)).json(),S=b.data||b;R(N=>x?[...N,...S]:S),b.pagination?(B(b.pagination.hasMore),f(b.pagination.cursor)):B(!1)}}catch(p){_(p)}finally{A(!1),L(!1)}},l=()=>{!C&&w&&h(!0)};return!g||!y?null:E&&a?r.jsx(g,{node:a,context:y}):I&&c?r.jsx(g,{node:c,context:y}):j.length===0&&d?r.jsx(g,{node:d,context:y}):r.jsxs("div",{className:"pineui-collection","data-collection-id":e,children:[u&&r.jsx("div",{className:"pineui-collection__refresh",children:r.jsx("button",{onClick:()=>h(!1),children:"Refresh"})}),r.jsx("div",{className:`pineui-collection__${n}`,style:n==="grid"?{display:"grid",gridTemplateColumns:`repeat(${s}, 1fr)`,gap:`${t}px`}:void 0,children:j.map((x,p)=>{var b,S,N,T,P,O,U,ne,se,re;let v=i;return(b=i.type)!=null&&b.startsWith("pattern.")&&((S=i.props)==null?void 0:S.post)==="{{item}}"?v={...i,props:{...i.props,post:x}}:(N=i.type)!=null&&N.startsWith("pattern.")&&((T=i.props)==null?void 0:T.course)==="{{item}}"?v={...i,props:{...i.props,course:x}}:(P=i.type)!=null&&P.startsWith("pattern.")&&((O=i.props)==null?void 0:O.conversation)==="{{item}}"?v={...i,props:{...i.props,conversation:x}}:(U=i.type)!=null&&U.startsWith("pattern.")&&((ne=i.props)==null?void 0:ne.message)==="{{item}}"?v={...i,props:{...i.props,message:x}}:(se=i.type)!=null&&se.startsWith("pattern.")&&((re=i.props)==null?void 0:re.profile)==="{{item}}"&&(v={...i,props:{...i.props,profile:x}}),r.jsx("div",{className:`pineui-collection__item ${n==="grid"?"pineui-collection__item--grid":""}`,children:r.jsx(g,{node:v,context:y,parentData:x})},x.id||p)})}),w&&!E&&r.jsx("div",{className:"pineui-collection__load-more",style:{padding:"16px",textAlign:"center"},children:r.jsx("button",{onClick:l,disabled:C,style:{padding:"12px 24px",fontSize:"14px",fontWeight:500,cursor:C?"not-allowed":"pointer",opacity:C?.6:1},children:C?"Carregando...":"Carregar mais"})})]})},"input.text":({id:e,placeholder:n="",value:s="",multiline:t=!1,maxLines:o=1,maxLength:i,autofocus:a=!1,onChanged:d,context:c})=>{const y={id:e,placeholder:n,defaultValue:s,maxLength:i,autoFocus:a,onChange:async g=>{if(!d||!c)return;const j=JSON.parse(JSON.stringify(d).replace(/\{\{value\}\}/g,g.target.value));await c.executeAction(j)},className:"pineui-input"};return t?r.jsx("textarea",{...y,rows:o,style:{resize:"none",minHeight:`${o*24}px`}}):r.jsx("input",{...y,type:"text"})},divider:({thickness:e=1,color:n="surfaceVariant"})=>{const s={height:`${e}px`,backgroundColor:`var(--md-sys-color-${n}, #e0e0e0)`,border:"none",margin:0};return r.jsx("hr",{className:"pineui-divider",style:s})},conditionalRender:({conditions:e,context:n,renderer:s})=>{if(!s||!n)return null;for(const t of e){const o=M({when:t.when},n);if(o.when===!0||o.when==="true")return r.jsx(s,{node:t.render,context:n})}return null},tabs:({tabs:e,defaultTab:n,context:s,renderer:t})=>{var d;const[o,i]=m.useState(n||((d=e[0])==null?void 0:d.id));if(!t||!s)return null;const a=e.find(c=>c.id===o);return r.jsxs("div",{className:"pineui-tabs",children:[r.jsx("div",{className:"pineui-tabs__header",children:e.map(c=>r.jsxs("button",{className:`pineui-tabs__tab ${o===c.id?"pineui-tabs__tab--active":""}`,onClick:()=>i(c.id),children:[c.icon&&r.jsx("span",{className:"pineui-tabs__icon",children:c.icon}),r.jsx("span",{className:"pineui-tabs__label",children:c.label}),c.badge!==void 0&&c.badge>0&&r.jsx("span",{className:"pineui-tabs__badge",children:c.badge})]},c.id))}),r.jsx("div",{className:"pineui-tabs__content",children:a&&r.jsx(t,{node:a.content,context:s})})]})},badge:({label:e,variant:n="default",size:s="medium"})=>{const t=D("pineui-badge",`pineui-badge--${n}`,`pineui-badge--${s}`);return r.jsx("span",{className:t,children:e})},chip:({label:e,icon:n,selected:s=!1,onPress:t,context:o})=>{const i=async()=>{t&&o&&await o.executeAction(t)},a=D("pineui-chip",{"pineui-chip--selected":s});return r.jsxs("button",{className:a,onClick:i,children:[n&&r.jsx("span",{className:"pineui-chip__icon",children:n}),r.jsx("span",{className:"pineui-chip__label",children:e})]})},grid:({children:e,columns:n=3,spacing:s=16,context:t,renderer:o})=>{if(!o||!t)return null;const i={display:"grid",gridTemplateColumns:`repeat(${n}, 1fr)`,gap:`${s}px`};return r.jsx("div",{className:"pineui-grid",style:i,children:e.map((a,d)=>r.jsx(o,{node:a,context:t},d))})},progress:({value:e,label:n,showPercentage:s=!1,color:t="primary"})=>{const o=Math.min(100,Math.max(0,e));return r.jsxs("div",{className:"pineui-progress",children:[(n||s)&&r.jsxs("div",{className:"pineui-progress__header",children:[n&&r.jsx("span",{className:"pineui-progress__label",children:n}),s&&r.jsxs("span",{className:"pineui-progress__percentage",children:[o,"%"]})]}),r.jsx("div",{className:"pineui-progress__track",children:r.jsx("div",{className:`pineui-progress__fill pineui-progress__fill--${t}`,style:{width:`${o}%`}})})]})},table:({columns:e,data:n,context:s,renderer:t})=>{const[o,i]=m.useState([]),[a,d]=m.useState(!0);m.useEffect(()=>{c()},[]);const c=async()=>{if(s){if(Array.isArray(n)){i(n),d(!1);return}if(n.type==="action.http")try{const u=n,g=await(await fetch(u.url,{method:u.method||"GET",headers:{"Content-Type":"application/json"},body:u.body?JSON.stringify(u.body):void 0})).json();i(g.data||g),d(!1)}catch(u){console.error("Table data fetch error:",u),d(!1)}}};return!t||!s?null:a?r.jsx("div",{className:"pineui-table",children:r.jsx("p",{style:{padding:"16px",textAlign:"center"},children:"Loading..."})}):r.jsx("div",{className:"pineui-table",children:r.jsxs("table",{children:[r.jsx("thead",{children:r.jsx("tr",{children:e.map(u=>r.jsx("th",{style:{width:u.width},className:"pineui-table__header",children:u.label},u.key))})}),r.jsx("tbody",{children:o.map((u,y)=>r.jsx("tr",{className:"pineui-table__row",children:e.map(g=>r.jsx("td",{className:"pineui-table__cell",children:g.template?r.jsx(t,{node:g.template,context:s,parentData:u}):r.jsx("span",{children:u[g.key]})},g.key))},y))})]})})},view:({name:e,context:n,renderer:s,flex:t,width:o,height:i})=>{var c;const a=(c=n==null?void 0:n.views)==null?void 0:c[e];if(!a)return console.warn(`View not found: ${e}`),null;const d={};return t&&(d.flex=t),o&&(d.width=o),i&&(d.height=i),r.jsx("div",{className:"pineui-view",style:d,children:r.jsx(s,{node:a.screen,context:n})})}},z=({node:e,context:n,parentData:s})=>{if(!e||!e.type)return null;const t=s!==void 0?Object.assign({},n,{item:s}):n,i=e.type!=="collection"?M(e,t):e;if(i.type.startsWith("component.")){const d=i.type,c=n.components[d];if(!c)return console.warn(`Component not found: ${d}`),null;const u={...t,props:i.props};return r.jsx(z,{node:c.definition,context:u,parentData:s})}const a=be[i.type];return a?r.jsx(a,{...i,context:n,renderer:z}):(console.warn(`Unknown component type: ${i.type}`),null)},je=({messages:e,onDismiss:n})=>r.jsx("div",{className:"pineui-snackbar-container",children:e.map(s=>r.jsx(_e,{message:s,onDismiss:n},s.id))}),_e=({message:e,onDismiss:n})=>{const[s,t]=m.useState(!1);return m.useEffect(()=>{setTimeout(()=>t(!0),10);const o=setTimeout(()=>{t(!1),setTimeout(()=>n(e.id),300)},e.duration||3e3);return()=>clearTimeout(o)},[e,n]),r.jsxs("div",{className:`pineui-snackbar ${s?"pineui-snackbar--visible":""}`,children:[r.jsx("span",{className:"pineui-snackbar__message",children:e.message}),e.action&&r.jsx("button",{className:"pineui-snackbar__action",onClick:e.action.onPress,children:e.action.label})]})},we=({presentation:e="modal",dismissible:n=!0,child:s,onClose:t,context:o,renderer:i})=>{if(m.useEffect(()=>(document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}),[]),!i||!o)return null;const a=u=>{n&&u.target===u.currentTarget&&t()},d=u=>{n&&u.key==="Escape"&&t()};m.useEffect(()=>(window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)),[n]);const c=e==="bottomSheet"?"pineui-modal-backdrop pineui-modal-backdrop--bottomSheet":"pineui-modal-backdrop";return r.jsx("div",{className:c,onClick:a,children:r.jsx("div",{className:`pineui-modal pineui-modal--${e}`,children:r.jsx(i,{node:s,context:o})})})},Ne=({overlays:e,onClose:n,context:s,renderer:t})=>r.jsx(r.Fragment,{children:Object.entries(e).map(([o,{visible:i,config:a}])=>i?r.jsx(we,{id:o,...a,onClose:()=>n(o),context:s,renderer:t},o):null)});function G(e,n){if(n.startsWith("http://")||n.startsWith("https://"))return n;try{const s=new URL(e,window.location.href);return new URL(n,s).href}catch{const s=n.replace(/^\.\//,"");return`${e.endsWith("/")?e.slice(0,-1):e}/${s}`}}async function q(e,n){if(!e.imports)return e;const s={...e};if(e.imports.components)for(const t of e.imports.components)try{const o=G(n,t),a=await(await fetch(o)).json();s.components={...s.components,...a}}catch(o){console.error(`❌ Failed to load component from ${t}:`,o),console.error(` Resolved URL: ${G(n,t)}`)}if(e.imports.views)for(const t of e.imports.views)try{const o=G(n,t),a=await(await fetch(o)).json();s.views={...s.views,...a}}catch(o){console.error(`Failed to load view from ${t}:`,o)}return s}class ke extends m.Component{constructor(n){super(n),this.state={hasError:!1,error:null}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,s){console.error("🚨 PineUI Error:",n),console.error("Component Stack:",s.componentStack)}render(){var n;return this.state.hasError?this.props.fallback?this.props.fallback:r.jsxs("div",{className:"pineui-error",style:{padding:"24px",textAlign:"center"},children:[r.jsx("div",{style:{fontSize:"48px",marginBottom:"16px"},children:"⚠️"}),r.jsx("h3",{style:{marginBottom:"8px",fontSize:"18px",fontWeight:600},children:"Something went wrong"}),r.jsx("p",{style:{color:"#79747E",fontSize:"14px",marginBottom:"16px"},children:((n=this.state.error)==null?void 0:n.message)||"An unexpected error occurred"}),r.jsx("button",{onClick:()=>window.location.reload(),style:{padding:"10px 20px",background:"#6750A4",color:"white",border:"none",borderRadius:"20px",cursor:"pointer",fontSize:"14px",fontWeight:500},children:"Reload Page"})]}):this.props.children}}function Ce(e,n){const s=n.split(".");let t=e;for(const o of s){if(t==null)return;t=t[o]}return t}const ee=({schema:e,schemaUrl:n,baseUrl:s=""})=>{const[t,o]=m.useState(null),[i,a]=m.useState(!0),[d,c]=m.useState(null),[u,y]=m.useState([]),[g,j]=m.useState({}),R=(e==null?void 0:e.state)||{currentUser:{id:"user_current",username:"currentuser",displayName:"Current User",avatar:"https://i.pravatar.cc/150?img=1"},composer:{text:"",media:null,posting:!1},testInput:""},[E,A]=m.useState(R);m.useEffect(()=>{n&&!e?L():e&&C()},[n,e,s]);const C=async()=>{try{a(!0);let f=e;f.imports&&s&&(console.log("Loading imports for initial schema...",f.imports),f=await q(f,s),console.log("Imports loaded! Components:",Object.keys(f.components||{}))),o(f),f.state&&A(h=>({...h,...f.state}))}catch(f){c(f)}finally{a(!1)}},L=async()=>{try{a(!0);let h=await(await fetch(n)).json();h.imports&&s&&(h=await q(h,s)),o(h),h.state&&A(l=>({...l,...h.state}))}catch(f){c(f)}finally{a(!1)}},I=async(f,h)=>{var x;console.log("Executing action:",f,"with params:",h);let l=f;if(h){const v=JSON.stringify(f).replace(/\{\{([^}]+)\}\}/g,(b,S)=>{const N=S.trim();return h[N]!==void 0?String(h[N]):""});l=JSON.parse(v)}if(l.intent){const p=l.intent,v={...h,...l};return delete v.intent,_(p,v)}if(l.type&&l.type.startsWith("intent.")){const p=l.type.substring(7),v={...h,...l};return delete v.type,_(p,v)}switch(l.type){case"action.http":{try{const p=l.url.startsWith("http")?l.url:`${s}${l.url}`,b=await(await fetch(p,{method:l.method||"GET",headers:{"Content-Type":"application/json"},body:l.body?JSON.stringify(l.body):void 0})).json();console.log("HTTP action result:",b)}catch(p){console.error("HTTP action error:",p)}break}case"action.state.patch":{A(p=>{const v={...p};return Se(v,l.path,l.value),v});break}case"action.overlay.open":{const p=(x=t==null?void 0:t.overlays)==null?void 0:x[l.overlayId];p?j(v=>({...v,[l.overlayId]:{visible:!0,config:p}})):console.warn("Overlay not found:",l.overlayId);break}case"action.overlay.close":{j(p=>({...p,[l.overlayId]:{...p[l.overlayId],visible:!1}}));break}case"action.collection.refresh":{console.log("Refresh collection:",l.collectionId);break}case"action.snackbar.show":{const p=typeof l.message=="string"&&l.message.includes("{{")?l.message.replace(/\{\{(.+?)\}\}/g,(b,S)=>{const N=S.trim();if(N.startsWith("state.")){const T=N.substring(6),P=Ce(E,T);return P!=null?String(P):""}return""}):l.message,v={id:`snackbar-${Date.now()}`,message:p,duration:l.duration||3e3,action:l.action?{label:l.action.label,onPress:()=>I(l.action.onPress)}:void 0};y(b=>[...b,v]);break}case"action.delay":{const p=l.duration||1e3;await new Promise(v=>setTimeout(v,p));break}default:console.warn("Unknown action type:",l.type)}},_=async(f,h)=>{if(console.log("Executing intent:",f,h),!(t!=null&&t.intents))return;const l=t.intents[f];if(!l){console.warn("Intent not found:",f);return}if(Array.isArray(l.handler))for(const x of l.handler)await I(x,h);else await I(l.handler,h)},w={state:E,data:{},components:(t==null?void 0:t.components)||{},views:(t==null?void 0:t.views)||{},intents:(t==null?void 0:t.intents)||{},schema:t,executeAction:I,executeIntent:_};if(i)return r.jsxs("div",{className:"pineui-loading",style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",minHeight:"400px",gap:"16px",color:"#79747E"},children:[r.jsx("div",{style:{width:"40px",height:"40px",border:"4px solid #E7E0EC",borderTop:"4px solid #6750A4",borderRadius:"50%",animation:"pineui-spin 1s linear infinite"}}),r.jsx("p",{style:{margin:0,fontSize:"14px",fontWeight:500},children:"Loading application..."}),r.jsx("style",{dangerouslySetInnerHTML:{__html:`
|
|
9
|
+
*/var ie=m,oe=Symbol.for("react.element"),ae=Symbol.for("react.fragment"),le=Object.prototype.hasOwnProperty,ce=ie.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,ue={key:!0,ref:!0,__self:!0,__source:!0};function Z(e,n,s){var t,r={},o=null,a=null;s!==void 0&&(o=""+s),n.key!==void 0&&(o=""+n.key),n.ref!==void 0&&(a=n.ref);for(t in n)le.call(n,t)&&!ue.hasOwnProperty(t)&&(r[t]=n[t]);if(e&&e.defaultProps)for(t in n=e.defaultProps,n)r[t]===void 0&&(r[t]=n[t]);return{$$typeof:oe,type:e,key:o,ref:a,props:r,_owner:ce.current}}P.Fragment=ae,P.jsx=Z,P.jsxs=Z,Y.exports=P;var i=Y.exports;function E(e,n){if(typeof e=="string")return de(e,n);if(Array.isArray(e))return e.map(s=>E(s,n));if(e&&typeof e=="object"){const s={};for(const t in e)s[t]=E(e[t],n);return s}return e}function de(e,n){const s=e.indexOf("}}");if(e.startsWith("{{")&&e.endsWith("}}")&&s===e.length-2){const r=e.slice(2,-2).trim();return(r==="item"||r.startsWith("item."))&&(!("item"in n)||n.item===void 0)||(r==="props"||r.startsWith("props."))&&(!("props"in n)||n.props===void 0)||(r==="response"||r.startsWith("response."))&&!("response"in n)?e:Q(r,n)}return e.replace(/\{\{(.+?)\}\}/g,(r,o)=>{const a=Q(o.trim(),n);return a!=null?String(a):""})}function Q(e,n){try{if(/^[\w.]+$/.test(e))return X(n,e);if(e.includes("|")&&!e.includes("||"))return pe(e,n);const s=Object.keys(n).filter(o=>/^[a-zA-Z_$][\w$]*$/.test(o)),t=s.map(o=>n[o]);return new Function(...s,`"use strict"; try { return (${e}); } catch(e) { return undefined; }`)(...t)}catch(s){console.warn(`Failed to evaluate expression: ${e}`,s);return}}function X(e,n){const s=n.split(".");let t=e;for(const r of s){if(t==null)return;t=t[r]}return t}function pe(e,n){const[s,t]=e.split("|").map(o=>o.trim()),r=X(n,s);return t==="timeAgo"?fe(r):r}function fe(e){if(!e)return"";const n=new Date(e);if(isNaN(n.getTime()))return e;const t=Math.floor((new Date().getTime()-n.getTime())/1e3);return t<60?`${t}s`:t<3600?`${Math.floor(t/60)}m`:t<86400?`${Math.floor(t/3600)}h`:t<2592e3?`${Math.floor(t/86400)}d`:t<31536e3?`${Math.floor(t/2592e3)}mo`:`${Math.floor(t/31536e3)}y`}function q(e){var n,s,t="";if(typeof e=="string"||typeof e=="number")t+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(n=0;n<r;n++)e[n]&&(s=q(e[n]))&&(t&&(t+=" "),t+=s)}else for(s in e)e[s]&&(t&&(t+=" "),t+=s);return t}function D(){for(var e,n,s=0,t="",r=arguments.length;s<r;s++)(e=arguments[s])&&(n=q(e))&&(t&&(t+=" "),t+=n);return t}const me=({content:e,style:n="bodyMedium",color:s,fontWeight:t,maxLines:r})=>{const o=D("pineui-text",`pineui-text--${n}`,{"pineui-text--bold":t==="bold"}),a={color:s?`var(--md-sys-color-${s}, ${s})`:void 0,WebkitLineClamp:r??void 0,display:r?"-webkit-box":void 0,WebkitBoxOrient:r?"vertical":void 0,overflow:r?"hidden":void 0};return i.jsx("p",{className:o,style:a,children:e||"(empty)"})},L=({type:e,label:n,icon:s,enabled:t=!0,loading:r=!1,onPress:o,context:a,size:d="medium",color:c})=>{const p=async()=>{if(!t||r||!o||!a)return;const b=E(o,a);await a.executeAction(b)},h=D("pineui-button",`pineui-button--${e.split(".")[1]}`,{"pineui-button--disabled":!t,"pineui-button--loading":r,[`pineui-button--${d}`]:d}),v={color:c?`var(--md-sys-color-${c}, ${c})`:void 0};return i.jsxs("button",{className:h,onClick:p,disabled:!t||r,style:v,children:[r?i.jsx("span",{className:"pineui-button__spinner",children:"⏳"}):s?i.jsx("span",{className:"pineui-button__icon",children:s}):null,n&&i.jsx("span",{className:"pineui-button__label",children:n})]})},ee=({type:e,children:n=[],spacing:s=0,padding:t=0,mainAxisAlignment:r="start",crossAxisAlignment:o="start",flex:a,width:d,height:c,maxWidth:p,overflow:h,backgroundColor:v,border:b,borderRadius:j,elevation:w,borderRight:I,borderLeft:C,borderTop:M,borderBottom:_,onPress:N,context:S,renderer:B})=>{if(!B||!S)return null;const F=async()=>{if(N&&S){const T=E(N,S);await S.executeAction(T)}},f=e==="layout.column",y=D("pineui-layout",{"pineui-layout--column":f,"pineui-layout--row":!f}),l={display:"flex",flexDirection:f?"column":"row",gap:`${s}px`,padding:`${t}px`,justifyContent:he(r),alignItems:ye(o),flex:a,width:d!==void 0?typeof d=="number"?`${d}px`:d:void 0,height:c!==void 0?typeof c=="number"?`${c}px`:c:void 0,maxWidth:p!==void 0?typeof p=="number"?`${p}px`:p:void 0,overflow:h,backgroundColor:v,border:b,borderRadius:j!==void 0?`${j}px`:void 0,boxShadow:w?ve(w):void 0,borderRight:I,borderLeft:C,borderTop:M,borderBottom:_,minWidth:0,cursor:N?"pointer":void 0};return i.jsx("div",{className:y,style:l,onClick:N?F:void 0,children:n.map((T,k)=>i.jsx(B,{node:T,context:S},k))})};function he(e){return{start:"flex-start",center:"center",end:"flex-end",spaceBetween:"space-between",spaceAround:"space-around"}[e]||"flex-start"}function ye(e){return{start:"flex-start",center:"center",end:"flex-end",stretch:"stretch"}[e]||"flex-start"}function ve(e){const n={1:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",2:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1)",3:"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1)",4:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)",5:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)"};return n[e]||n[1]}const xe=({child:e,children:n,elevation:s=1,padding:t=16,variant:r,onPress:o,context:a,renderer:d})=>{if(!d||!a)return null;const c=async()=>{if(o&&a){const j=E(o,a);await a.executeAction(j)}},h=D("pineui-card",`pineui-card--elevation-${r==="outlined"||r==="filled"?0:s}`,{"pineui-card--clickable":!!o,"pineui-card--outlined":r==="outlined","pineui-card--filled":r==="filled"}),v={padding:`${t}px`,...r==="outlined"?{border:"1px solid var(--md-sys-color-outline)"}:{},...r==="filled"?{background:"var(--md-sys-color-surfaceVariant)"}:{}},b=e?i.jsx(d,{node:e,context:a}):n?i.jsx(i.Fragment,{children:n.map((j,w)=>i.jsx(d,{node:j,context:a},w))}):null;return i.jsx("div",{className:h,style:v,onClick:o?c:void 0,children:b})},ge=({src:e,alt:n="",aspectRatio:s,borderRadius:t=0,loading:r="lazy",onPress:o,context:a})=>{const d=async()=>{o&&a&&await a.executeAction(o)},c={width:"100%",aspectRatio:s,borderRadius:`${t}px`,objectFit:"cover",cursor:o?"pointer":void 0};return i.jsx("img",{className:"pineui-image",src:e,alt:n,loading:r,style:c,onClick:o?d:void 0})},be=({src:e,size:n=40,onPress:s,context:t})=>{const r=async()=>{s&&t&&await t.executeAction(s)},o={width:`${n}px`,height:`${n}px`,borderRadius:"50%",objectFit:"cover",cursor:s?"pointer":void 0};return i.jsx("img",{className:"pineui-avatar",src:e,alt:"Avatar",style:o,onClick:s?r:void 0})},je=({name:e,size:n=24,color:s,visible:t=!0})=>{if(!t)return null;const r={fontSize:`${n}px`,color:s?`var(--md-sys-color-${s}, ${s})`:void 0},o={verified:"✓",favorite:"❤️",favoriteBorder:"🤍",chatBubbleOutline:"💬",repeat:"🔁",bookmark:"🔖",bookmarkBorder:"🔖",iosShare:"↗️",moreVert:"⋮"};return i.jsx("span",{className:"pineui-icon",style:r,children:o[e]||e})};function $(e,n){return e==="{{response}}"?n:typeof e!="object"||e===null?e:Array.isArray(e)?e.map(s=>$(s,n)):Object.fromEntries(Object.entries(e).map(([s,t])=>[s,$(t,n)]))}const we=({id:e,layout:n="list",columns:s=3,spacing:t=16,data:r,itemTemplate:o,loadingState:a,emptyState:d,errorState:c,refreshable:p=!1,context:h,renderer:v})=>{const[b,j]=m.useState([]),[w,I]=m.useState(!0),[C,M]=m.useState(!1),[_,N]=m.useState(null),[S,B]=m.useState(!0),[F,f]=m.useState(null),y=r.type==="action.http"&&h?r.url.replace(/\{\{state\.([^}]+)\}\}/g,(k,u)=>{const x=u.split(".");let g=h.state;for(const O of x){if(g==null)return"";g=g[O]}return g!=null?String(g):""}):"";m.useEffect(()=>{l()},[y]);const l=async(k=!1)=>{if(h)try{if(k?M(!0):I(!0),N(null),r.type==="action.http"){let u=r.url;u.includes("{{state.")&&(u=u.replace(/\{\{state\.([^}]+)\}\}/g,(W,G)=>{const H=G.split(".");let V=h.state;for(const We of H){if(V==null)return"";V=V[We]}return V!=null?String(V):""})),k&&F&&(u+=`${u.includes("?")?"&":"?"}after=${F}`);const g=await(await fetch(u)).json(),O=g.data||g;if(j(W=>k?[...W,...O]:O),r.onSuccess&&h){console.log(`[Collection] onSuccess called with ${O.length} items`);const W=$(r.onSuccess,O);await h.executeAction(W),console.log("[Collection] onSuccess done")}g.pagination?(B(g.pagination.hasMore),f(g.pagination.cursor)):B(!1)}}catch(u){N(u)}finally{I(!1),M(!1)}},T=()=>{!C&&S&&l(!0)};return!v||!h?null:w&&a?i.jsx(v,{node:a,context:h}):_&&c?i.jsx(v,{node:c,context:h}):b.length===0&&d?i.jsx(v,{node:d,context:h}):i.jsxs("div",{className:"pineui-collection","data-collection-id":e,children:[p&&i.jsx("div",{className:"pineui-collection__refresh",children:i.jsx("button",{onClick:()=>l(!1),children:"Refresh"})}),i.jsx("div",{className:`pineui-collection__${n}`,style:n==="grid"?{display:"grid",gridTemplateColumns:`repeat(${s}, 1fr)`,gap:`${t}px`}:void 0,children:b.map((k,u)=>{const x={...h,item:k,index:u};return i.jsx("div",{className:`pineui-collection__item ${n==="grid"?"pineui-collection__item--grid":""}`,children:i.jsx(v,{node:o,context:x})},k.id||u)})}),S&&!w&&i.jsx("div",{className:"pineui-collection__load-more",style:{padding:"16px",textAlign:"center"},children:i.jsx("button",{onClick:T,disabled:C,style:{padding:"12px 24px",fontSize:"14px",fontWeight:500,cursor:C?"not-allowed":"pointer",opacity:C?.6:1},children:C?"Carregando...":"Carregar mais"})})]})},_e=({data:e,template:n,itemTemplate:s,layout:t="list",columns:r=3,spacing:o=16,context:a,renderer:d})=>{if(!d||!a)return null;const c=n||s;if(!c)return null;const p=Array.isArray(e)?e:[];if(p.length===0)return null;const h=t==="grid"?{display:"grid",gridTemplateColumns:`repeat(${r}, 1fr)`,gap:`${o}px`}:{display:"flex",flexDirection:"column",gap:`${o}px`};return i.jsx("div",{style:h,children:p.map((v,b)=>{const j={...a,item:v,index:b};return i.jsx(d,{node:c,context:j},v.id??b)})})},Ne=({appBar:e,body:n,floatingActionButton:s,bottomNavigationBar:t,context:r,renderer:o})=>!o||!r?null:i.jsxs("div",{className:"pineui-scaffold",children:[e&&i.jsx("header",{className:"pineui-scaffold__appbar",children:i.jsx(o,{node:e,context:r})}),i.jsx("main",{className:"pineui-scaffold__body",children:i.jsx(o,{node:n,context:r})}),s&&i.jsx("div",{className:"pineui-scaffold__fab",children:i.jsx(o,{node:s,context:r})}),t&&i.jsx("footer",{className:"pineui-scaffold__bottomnav",children:i.jsx(o,{node:t,context:r})})]}),ke=({title:e,leading:n,actions:s=[],context:t,renderer:r})=>!r||!t?null:i.jsxs("div",{className:"pineui-appbar",children:[n&&i.jsx("div",{className:"pineui-appbar__leading",children:i.jsx(r,{node:n,context:t})}),e&&i.jsx("div",{className:"pineui-appbar__title",children:i.jsx(r,{node:e,context:t})}),s.length>0&&i.jsx("div",{className:"pineui-appbar__actions",children:s.map((o,a)=>i.jsx(r,{node:o,context:t},a))})]}),Ce=({items:e,currentIndex:n,onItemTap:s,context:t})=>{const r=async o=>{if(!t)return;const a=JSON.parse(JSON.stringify(s).replace(/\{\{item\.(\w+)\}\}/g,(d,c)=>{const p=o[c];return p!=null?String(p):""}));await t.executeAction(a)};return i.jsx("nav",{className:"pineui-bottomnav",children:e.map((o,a)=>i.jsxs("button",{className:`pineui-bottomnav__item ${a===n?"pineui-bottomnav__item--active":""}`,onClick:()=>r(o),children:[i.jsxs("div",{className:"pineui-bottomnav__icon-container",children:[i.jsx("span",{className:"pineui-bottomnav__icon",children:o.icon}),o.badge&&o.badge>0&&i.jsx("span",{className:"pineui-bottomnav__badge",children:o.badge})]}),i.jsx("span",{className:"pineui-bottomnav__label",children:o.label})]},a))})},R=({type:e,id:n,label:s,placeholder:t="",value:r="",error:o,multiline:a=!1,maxLines:d=1,maxLength:c,autofocus:p=!1,onChanged:h,onChange:v,context:b})=>{const j=v||h,w=async _=>{!j||!b||await b.executeAction(j,{event:{value:_.target.value},value:_.target.value})},C={"input.email":"email","input.password":"password","input.number":"number","input.search":"search","input.text":"text"}[e]||"text",M={id:n,placeholder:t,defaultValue:r,maxLength:c,autoFocus:p,onChange:w,className:`pineui-input${o?" pineui-input--error":""}`};return i.jsxs("div",{className:"pineui-input-wrapper",style:{width:"100%"},children:[s&&i.jsx("label",{htmlFor:n,style:{display:"block",fontSize:"12px",fontWeight:500,color:o?"var(--md-sys-color-error)":"var(--md-sys-color-onSurfaceVariant)",marginBottom:"4px"},children:s}),a?i.jsx("textarea",{...M,rows:d,style:{resize:"none",minHeight:`${d*24}px`}}):i.jsx("input",{...M,type:C}),o&&i.jsx("p",{style:{fontSize:"12px",color:"var(--md-sys-color-error)",marginTop:"4px"},children:o})]})},Se={text:me,"button.filled":L,"button.text":L,"button.outlined":L,"button.icon":L,"button.fab":L,"layout.column":ee,"layout.row":ee,"layout.scaffold":Ne,"layout.appBar":ke,"layout.bottomNav":Ce,card:xe,image:ge,avatar:be,icon:je,collection:we,"collection.map":_e,"input.text":R,"input.email":R,"input.password":R,"input.number":R,"input.search":R,divider:({thickness:e=1,color:n="surfaceVariant"})=>{const s={height:`${e}px`,backgroundColor:`var(--md-sys-color-${n}, #e0e0e0)`,border:"none",margin:0};return i.jsx("hr",{className:"pineui-divider",style:s})},conditionalRender:({conditions:e,context:n,renderer:s})=>{if(!s||!n)return null;for(const t of e){const r=E({when:t.when},n);if(r.when===!0||r.when==="true")return i.jsx(s,{node:t.render,context:n})}return null},"conditional.render":({condition:e,children:n,child:s,context:t,renderer:r})=>{if(!r||!t)return null;const o=E({condition:e},t);return o.condition===!0||o.condition==="true"||o.condition===1?s?i.jsx(r,{node:s,context:t}):n?i.jsx(i.Fragment,{children:n.map((d,c)=>i.jsx(r,{node:d,context:t},c))}):null:null},tabs:({tabs:e,defaultTab:n,context:s,renderer:t})=>{var d;const[r,o]=m.useState(n||((d=e[0])==null?void 0:d.id));if(!t||!s)return null;const a=e.find(c=>c.id===r);return i.jsxs("div",{className:"pineui-tabs",children:[i.jsx("div",{className:"pineui-tabs__header",children:e.map(c=>i.jsxs("button",{className:`pineui-tabs__tab ${r===c.id?"pineui-tabs__tab--active":""}`,onClick:()=>o(c.id),children:[c.icon&&i.jsx("span",{className:"pineui-tabs__icon",children:c.icon}),i.jsx("span",{className:"pineui-tabs__label",children:c.label}),c.badge!==void 0&&c.badge>0&&i.jsx("span",{className:"pineui-tabs__badge",children:c.badge})]},c.id))}),i.jsx("div",{className:"pineui-tabs__content",children:a&&i.jsx(t,{node:a.content,context:s})})]})},badge:({label:e,variant:n="default",size:s="medium"})=>{const t=D("pineui-badge",`pineui-badge--${n}`,`pineui-badge--${s}`);return i.jsx("span",{className:t,children:e})},chip:({label:e,icon:n,selected:s=!1,onPress:t,context:r})=>{const o=async()=>{t&&r&&await r.executeAction(t)},a=D("pineui-chip",{"pineui-chip--selected":s});return i.jsxs("button",{className:a,onClick:o,children:[n&&i.jsx("span",{className:"pineui-chip__icon",children:n}),i.jsx("span",{className:"pineui-chip__label",children:e})]})},grid:({children:e,columns:n=3,spacing:s=16,context:t,renderer:r})=>{if(!r||!t)return null;const o={display:"grid",gridTemplateColumns:`repeat(${n}, 1fr)`,gap:`${s}px`};return i.jsx("div",{className:"pineui-grid",style:o,children:e.map((a,d)=>i.jsx(r,{node:a,context:t},d))})},progress:({value:e,label:n,showPercentage:s=!1,color:t="primary"})=>{const r=Math.min(100,Math.max(0,e));return i.jsxs("div",{className:"pineui-progress",children:[(n||s)&&i.jsxs("div",{className:"pineui-progress__header",children:[n&&i.jsx("span",{className:"pineui-progress__label",children:n}),s&&i.jsxs("span",{className:"pineui-progress__percentage",children:[r,"%"]})]}),i.jsx("div",{className:"pineui-progress__track",children:i.jsx("div",{className:`pineui-progress__fill pineui-progress__fill--${t}`,style:{width:`${r}%`}})})]})},table:({columns:e,data:n,context:s,renderer:t})=>{const[r,o]=m.useState([]),[a,d]=m.useState(!0);m.useEffect(()=>{c()},[]);const c=async()=>{if(s){if(Array.isArray(n)){o(n),d(!1);return}if(n.type==="action.http")try{const p=n,v=await(await fetch(p.url,{method:p.method||"GET",headers:{"Content-Type":"application/json"},body:p.body?JSON.stringify(p.body):void 0})).json();o(v.data||v),d(!1)}catch(p){console.error("Table data fetch error:",p),d(!1)}}};return!t||!s?null:a?i.jsx("div",{className:"pineui-table",children:i.jsx("p",{style:{padding:"16px",textAlign:"center"},children:"Loading..."})}):i.jsx("div",{className:"pineui-table",children:i.jsxs("table",{children:[i.jsx("thead",{children:i.jsx("tr",{children:e.map(p=>i.jsx("th",{style:{width:p.width},className:"pineui-table__header",children:p.label},p.key))})}),i.jsx("tbody",{children:r.map((p,h)=>i.jsx("tr",{className:"pineui-table__row",children:e.map(v=>i.jsx("td",{className:"pineui-table__cell",children:v.template?i.jsx(t,{node:v.template,context:s,parentData:p}):i.jsx("span",{children:p[v.key]})},v.key))},h))})]})})},view:({name:e,context:n,renderer:s,flex:t,width:r,height:o})=>{var c;const a=(c=n==null?void 0:n.views)==null?void 0:c[e];if(!a)return console.warn(`View not found: ${e}`),null;const d={};return t&&(d.flex=t),r&&(d.width=r),o&&(d.height=o),i.jsx("div",{className:"pineui-view",style:d,children:i.jsx(s,{node:a.screen,context:n})})}},z=({node:e,context:n,parentData:s})=>{if(!e||!e.type)return null;const t=s!==void 0?Object.assign({},n,{item:s}):n,o=e.type!=="collection"?E(e,t):e;if(o.type.startsWith("component.")){const d=o.type,c=n.components[d];if(!c)return console.warn(`Component not found: ${d}`),null;const p={...t,props:o.props};return i.jsx(z,{node:c.definition,context:p,parentData:s})}const a=Se[o.type];return a?i.jsx(a,{...o,context:n,renderer:z}):(console.warn(`Unknown component type: ${o.type}`),null)},Te=({messages:e,onDismiss:n})=>i.jsx("div",{className:"pineui-snackbar-container",children:e.map(s=>i.jsx(Ae,{message:s,onDismiss:n},s.id))}),Ae=({message:e,onDismiss:n})=>{const[s,t]=m.useState(!1);return m.useEffect(()=>{setTimeout(()=>t(!0),10);const r=setTimeout(()=>{t(!1),setTimeout(()=>n(e.id),300)},e.duration||3e3);return()=>clearTimeout(r)},[e,n]),i.jsxs("div",{className:`pineui-snackbar ${s?"pineui-snackbar--visible":""}`,children:[i.jsx("span",{className:"pineui-snackbar__message",children:e.message}),e.action&&i.jsx("button",{className:"pineui-snackbar__action",onClick:e.action.onPress,children:e.action.label})]})},Ee=({presentation:e="modal",dismissible:n=!0,child:s,onClose:t,context:r,renderer:o})=>{if(m.useEffect(()=>(document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}),[]),!o||!r)return null;const a=p=>{n&&p.target===p.currentTarget&&t()},d=p=>{n&&p.key==="Escape"&&t()};m.useEffect(()=>(window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)),[n]);const c=e==="bottomSheet"?"pineui-modal-backdrop pineui-modal-backdrop--bottomSheet":"pineui-modal-backdrop";return i.jsx("div",{className:c,onClick:a,children:i.jsx("div",{className:`pineui-modal pineui-modal--${e}`,children:i.jsx(o,{node:s,context:r})})})},Ie=({overlays:e,onClose:n,context:s,renderer:t})=>i.jsx(i.Fragment,{children:Object.entries(e).map(([r,{visible:o,config:a}])=>o?i.jsx(Ee,{id:r,...a,onClose:()=>n(r),context:s,renderer:t},r):null)});function J(e,n){if(n.startsWith("http://")||n.startsWith("https://"))return n;try{const s=new URL(e,window.location.href);return new URL(n,s).href}catch{const s=n.replace(/^\.\//,"");return`${e.endsWith("/")?e.slice(0,-1):e}/${s}`}}async function te(e,n){if(!e.imports)return e;const s={...e};if(e.imports.components)for(const t of e.imports.components)try{const r=J(n,t),a=await(await fetch(r)).json();s.components={...s.components,...a}}catch(r){console.error(`❌ Failed to load component from ${t}:`,r),console.error(` Resolved URL: ${J(n,t)}`)}if(e.imports.views)for(const t of e.imports.views)try{const r=J(n,t),a=await(await fetch(r)).json();s.views={...s.views,...a}}catch(r){console.error(`Failed to load view from ${t}:`,r)}return s}class Me extends m.Component{constructor(n){super(n),this.state={hasError:!1,error:null}}static getDerivedStateFromError(n){return{hasError:!0,error:n}}componentDidCatch(n,s){console.error("🚨 PineUI Error:",n),console.error("Component Stack:",s.componentStack)}render(){var n;return this.state.hasError?this.props.fallback?this.props.fallback:i.jsxs("div",{className:"pineui-error",style:{padding:"24px",textAlign:"center"},children:[i.jsx("div",{style:{fontSize:"48px",marginBottom:"16px"},children:"⚠️"}),i.jsx("h3",{style:{marginBottom:"8px",fontSize:"18px",fontWeight:600},children:"Something went wrong"}),i.jsx("p",{style:{color:"#79747E",fontSize:"14px",marginBottom:"16px"},children:((n=this.state.error)==null?void 0:n.message)||"An unexpected error occurred"}),i.jsx("button",{onClick:()=>window.location.reload(),style:{padding:"10px 20px",background:"#6750A4",color:"white",border:"none",borderRadius:"20px",cursor:"pointer",fontSize:"14px",fontWeight:500},children:"Reload Page"})]}):this.props.children}}function Oe(e,n){const s=n.split(".");let t=e;for(const r of s){if(t==null)return;t=t[r]}return t}const ne=({schema:e,schemaUrl:n,baseUrl:s=""})=>{const[t,r]=m.useState(null),[o,a]=m.useState(!0),[d,c]=m.useState(null),[p,h]=m.useState([]),[v,b]=m.useState({}),j=(e==null?void 0:e.state)||{currentUser:{id:"user_current",username:"currentuser",displayName:"Current User",avatar:"https://i.pravatar.cc/150?img=1"},composer:{text:"",media:null,posting:!1},testInput:""},[w,I]=m.useState(j);m.useEffect(()=>{n&&!e?M():e&&C()},[n,e,s]);const C=async()=>{try{a(!0);let f=e;f.imports&&s&&(console.log("Loading imports for initial schema...",f.imports),f=await te(f,s),console.log("Imports loaded! Components:",Object.keys(f.components||{}))),r(f),f.state&&I(y=>({...y,...f.state}))}catch(f){c(f)}finally{a(!1)}},M=async()=>{try{a(!0);let y=await(await fetch(n)).json();y.imports&&s&&(y=await te(y,s)),r(y),y.state&&I(l=>({...l,...y.state}))}catch(f){c(f)}finally{a(!1)}},_=async(f,y)=>{var T,k;(f.type==="action.sequence"||f.intent&&f.intent.startsWith("course"))&&console.log(`[executeAction] type=${f.intent||f.type}, courseList.length=${((T=w.courseList)==null?void 0:T.length)??"N/A"}, selectedCourseIndex=${w.selectedCourseIndex}`);const l=E(f,{state:w,...y});if(l.intent){const u=l.intent,x={...y,...l};return delete x.intent,N(u,x)}if(l.type==="intent"&&l.name){const u={...y,...l};return delete u.type,delete u.name,N(l.name,u)}if(l.type&&l.type.startsWith("intent.")){const u=l.type.substring(7),x={...y,...l};return delete x.type,N(u,x)}switch(l.type){case"action.http":{try{const u=l.url.startsWith("http")?l.url:`${s}${l.url}`,g=await(await fetch(u,{method:l.method||"GET",headers:{"Content-Type":"application/json"},body:l.body?JSON.stringify(l.body):void 0})).json();console.log("HTTP action result:",g)}catch(u){console.error("HTTP action error:",u)}break}case"action.state.patch":{const u=l.value;console.log(`[patch] ${l.path} =`,typeof u=="object"&&u!==null?Array.isArray(u)?`Array(${u.length})`:`{id: ${u==null?void 0:u.id}, title: ${u==null?void 0:u.title}}`:u),I(x=>{const g={...x};return Be(g,l.path,l.value),g});break}case"action.overlay.open":{const u=(k=t==null?void 0:t.overlays)==null?void 0:k[l.overlayId];u?b(x=>({...x,[l.overlayId]:{visible:!0,config:u}})):console.warn("Overlay not found:",l.overlayId);break}case"action.overlay.close":{b(u=>({...u,[l.overlayId]:{...u[l.overlayId],visible:!1}}));break}case"action.collection.refresh":{console.log("Refresh collection:",l.collectionId);break}case"action.snackbar.show":{const u=typeof l.message=="string"&&l.message.includes("{{")?l.message.replace(/\{\{(.+?)\}\}/g,(g,O)=>{const W=O.trim();if(W.startsWith("state.")){const G=W.substring(6),H=Oe(w,G);return H!=null?String(H):""}return""}):l.message,x={id:`snackbar-${Date.now()}`,message:u,duration:l.duration||3e3,action:l.action?{label:l.action.label,onPress:()=>_(l.action.onPress)}:void 0};h(g=>[...g,x]);break}case"action.delay":{const u=l.duration||1e3;await new Promise(x=>setTimeout(x,u));break}case"action.sequence":{for(const u of l.actions??[])await _(u,y);break}default:console.warn("Unknown action type:",l.type)}},N=async(f,y)=>{if(console.log("Executing intent:",f,y),!(t!=null&&t.intents))return;const l=t.intents[f];if(!l){console.warn("Intent not found:",f);return}if(Array.isArray(l.handler))for(const T of l.handler)await _(T,y);else await _(l.handler,y)},S={state:w,data:{},components:(t==null?void 0:t.components)||{},views:(t==null?void 0:t.views)||{},intents:(t==null?void 0:t.intents)||{},schema:t,executeAction:_,executeIntent:N};if(o)return i.jsxs("div",{className:"pineui-loading",style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",minHeight:"400px",gap:"16px",color:"#79747E"},children:[i.jsx("div",{style:{width:"40px",height:"40px",border:"4px solid #E7E0EC",borderTop:"4px solid #6750A4",borderRadius:"50%",animation:"pineui-spin 1s linear infinite"}}),i.jsx("p",{style:{margin:0,fontSize:"14px",fontWeight:500},children:"Loading application..."}),i.jsx("style",{dangerouslySetInnerHTML:{__html:`
|
|
10
10
|
@keyframes pineui-spin {
|
|
11
11
|
0% { transform: rotate(0deg); }
|
|
12
12
|
100% { transform: rotate(360deg); }
|
|
13
13
|
}
|
|
14
|
-
`}})]});if(d)return
|
|
14
|
+
`}})]});if(d)return i.jsx("div",{className:"pineui-error",children:i.jsxs("p",{children:["Error loading schema: ",d.message]})});if(!t)return i.jsx("div",{className:"pineui-error",children:i.jsx("p",{children:"No schema provided"})});const B=f=>{h(y=>y.filter(l=>l.id!==f))},F=f=>{b(y=>({...y,[f]:{...y[f],visible:!1}}))};return i.jsx(Me,{children:i.jsxs("div",{className:"pineui-root",children:[i.jsx(z,{node:t.screen,context:S}),i.jsx(Te,{messages:p,onDismiss:B}),i.jsx(Ie,{overlays:v,onClose:F,context:S,renderer:z})]})})};function Be(e,n,s){const t=n.split(".");let r=e;for(let o=0;o<t.length-1;o++)r[t[o]]||(r[t[o]]={}),r=r[t[o]];r[t[t.length-1]]=s}function se(e){var t,r;const n=typeof e.target=="string"?document.querySelector(e.target):e.target;if(!n){console.error("PineUI: Target element not found"),(t=e.onError)==null||t.call(e,new Error("Target element not found"));return}U.createRoot(n).render(m.createElement(ne,{schema:e.schema,schemaUrl:e.schemaUrl,baseUrl:e.baseUrl})),(r=e.onReady)==null||r.call(e)}typeof window<"u"&&(window.PineUI={render:se}),A.PineUI=ne,A.render=se,Object.defineProperty(A,Symbol.toStringTag,{value:"Module"})});
|
package/dist/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--md-sys-color-primary: #6750a4;--md-sys-color-onPrimary: #ffffff;--md-sys-color-secondary: #625b71;--md-sys-color-onSecondary: #ffffff;--md-sys-color-error: #ba1a1a;--md-sys-color-onError: #ffffff;--md-sys-color-success: #198754;--md-sys-color-surface: #ffffff;--md-sys-color-onSurface: #1c1b1f;--md-sys-color-surfaceVariant: #e7e0ec;--md-sys-color-onSurfaceVariant: #49454f;--md-sys-color-outline: #79747e;--md-sys-color-background: #fffbfe;--md-sys-color-onBackground: #1c1b1f}*{box-sizing:border-box}.pineui-root{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;color:var(--md-sys-color-onBackground);background:var(--md-sys-color-background);width:100%;height:100%;overflow:hidden}.pineui-root *{margin:0;padding:0}.pineui-text{margin:0;line-height:1.5}.pineui-text--titleLarge{font-size:22px;font-weight:500;line-height:28px}.pineui-text--titleMedium{font-size:16px;font-weight:500;line-height:24px}.pineui-text--titleSmall{font-size:14px;font-weight:500;line-height:20px}.pineui-text--bodyLarge{font-size:16px;font-weight:400;line-height:24px}.pineui-text--bodyMedium{font-size:14px;font-weight:400;line-height:20px}.pineui-text--bodySmall{font-size:12px;font-weight:400;line-height:16px}.pineui-text--headlineSmall{font-size:24px;font-weight:400;line-height:32px}.pineui-text--bold{font-weight:700}.pineui-layout{display:flex}.pineui-layout--column{flex-direction:column}.pineui-layout--row{flex-direction:row}.pineui-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:none;border-radius:20px;font-family:inherit;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;padding:10px 24px}.pineui-button--filled{background:var(--md-sys-color-primary);color:var(--md-sys-color-onPrimary)}.pineui-button--filled:hover:not(:disabled){opacity:.9;box-shadow:0 1px 3px #0003}.pineui-button--text{background:transparent;color:var(--md-sys-color-primary);padding:10px 12px}.pineui-button--text:hover:not(:disabled){background:#6750a414}.pineui-button--icon{background:transparent;color:var(--md-sys-color-onSurfaceVariant);padding:8px;border-radius:8px;min-width:40px;min-height:40px}.pineui-button--icon:hover:not(:disabled){background:#0000000d}.pineui-button--fab{background:var(--md-sys-color-primary);color:var(--md-sys-color-onPrimary);border-radius:16px;padding:16px;box-shadow:0 2px 4px #0003}.pineui-button--disabled{opacity:.38;cursor:not-allowed}.pineui-button--small{font-size:12px;padding:6px 16px}.pineui-button--icon.pineui-button--small{padding:4px;min-width:20px;min-height:20px;font-size:14px;line-height:1}.pineui-card{background:var(--md-sys-color-surface);border-radius:12px;transition:box-shadow .2s}.pineui-card--elevation-0{box-shadow:none}.pineui-card--elevation-1{box-shadow:0 1px 2px #0000001a}.pineui-card--clickable{cursor:pointer}.pineui-card--clickable:hover{box-shadow:0 2px 8px #00000026}.pineui-image{display:block;max-width:100%;height:auto}.pineui-avatar{display:block;border:2px solid var(--md-sys-color-surface)}.pineui-icon{display:inline-flex;align-items:center;justify-content:center}.pineui-scaffold{display:flex;flex-direction:column;height:100%;background:var(--md-sys-color-background)}.pineui-scaffold__appbar{background:var(--md-sys-color-surface);box-shadow:0 1px 3px #0000001a;padding:16px;z-index:10}.pineui-scaffold__body{flex:1;overflow-y:auto}.pineui-scaffold__fab{position:fixed;bottom:80px;right:16px;z-index:20}.pineui-scaffold__bottomnav{background:var(--md-sys-color-surface);box-shadow:0 -1px 3px #0000001a;padding:8px 0;z-index:10}.pineui-collection{width:100%}.pineui-collection__list{display:flex;flex-direction:column}.pineui-collection__list .pineui-collection__item{border-bottom:1px solid var(--md-sys-color-surfaceVariant)}.pineui-collection__list .pineui-collection__item:last-child{border-bottom:none}.pineui-loading,.pineui-error{display:flex;align-items:center;justify-content:center;min-height:200px;padding:32px;text-align:center;color:var(--md-sys-color-onSurfaceVariant)}.pineui-error{color:var(--md-sys-color-error)}.pineui-snackbar-container{position:fixed;bottom:16px;left:50%;transform:translate(-50%);z-index:1000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.pineui-snackbar{background:var(--md-sys-color-onSurface);color:var(--md-sys-color-surface);padding:14px 16px;border-radius:4px;box-shadow:0 4px 8px #0000004d;display:flex;align-items:center;gap:16px;min-width:300px;max-width:500px;pointer-events:auto;opacity:0;transform:translateY(20px);transition:all .3s cubic-bezier(.4,0,.2,1)}.pineui-snackbar--visible{opacity:1;transform:translateY(0)}.pineui-snackbar__message{flex:1;font-size:14px;line-height:20px}.pineui-snackbar__action{background:transparent;border:none;color:var(--md-sys-color-primary);font-size:14px;font-weight:500;cursor:pointer;padding:8px 12px;border-radius:4px;text-transform:uppercase;letter-spacing:.5px}.pineui-snackbar__action:hover{background:#6750a41f}.pineui-appbar{display:flex;align-items:center;padding:12px 16px;gap:16px;background:var(--md-sys-color-surface);box-shadow:0 1px 3px #0000001a}.pineui-appbar__leading{display:flex;align-items:center}.pineui-appbar__title{flex:1}.pineui-appbar__actions{display:flex;align-items:center;gap:8px}.pineui-bottomnav{display:flex;justify-content:space-around;align-items:center;background:var(--md-sys-color-surface);box-shadow:0 -1px 3px #0000001a;padding:8px 0;min-height:64px}.pineui-bottomnav__item{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;background:transparent;border:none;cursor:pointer;padding:8px;color:var(--md-sys-color-onSurfaceVariant);transition:all .2s;position:relative;gap:4px}.pineui-bottomnav__item:hover{background:#0000000d}.pineui-bottomnav__item--active{color:var(--md-sys-color-primary)}.pineui-bottomnav__icon-container{position:relative;font-size:24px}.pineui-bottomnav__badge{position:absolute;top:-8px;right:-8px;background:var(--md-sys-color-error);color:var(--md-sys-color-onError);font-size:10px;font-weight:600;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center}.pineui-bottomnav__label{font-size:12px;font-weight:500}.pineui-input{width:100%;padding:12px 16px;border:1px solid var(--md-sys-color-outline);border-radius:4px;font-family:inherit;font-size:16px;line-height:24px;color:var(--md-sys-color-onSurface);background:var(--md-sys-color-surface);transition:all .2s}.pineui-input:focus{outline:none;border-color:var(--md-sys-color-primary);box-shadow:0 0 0 1px var(--md-sys-color-primary)}.pineui-input::placeholder{color:var(--md-sys-color-onSurfaceVariant);opacity:.6}textarea.pineui-input{resize:vertical;min-height:80px}.pineui-divider{width:100%;margin:0}.pineui-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:999;animation:fadeIn .2s ease-out;pointer-events:auto}.pineui-modal-backdrop--bottomSheet{align-items:flex-end;justify-content:stretch}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.pineui-modal{background:var(--md-sys-color-surface);border-radius:16px;box-shadow:0 8px 32px #0000004d;max-width:90vw;max-height:90vh;overflow:auto;animation:slideUp .3s cubic-bezier(.4,0,.2,1)}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.pineui-modal--bottomSheet{width:100%;max-width:100vw;max-height:80vh;border-radius:16px 16px 0 0;margin:0;animation:slideUpFromBottom .3s cubic-bezier(.4,0,.2,1)}@keyframes slideUpFromBottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}.pineui-modal--modal{width:500px;max-width:90vw}.pineui-modal--dialog{width:400px;max-width:90vw;padding:24px}.pineui-tabs{display:flex;flex-direction:column;width:100%}.pineui-tabs__header{display:flex;gap:8px;border-bottom:1px solid var(--md-sys-color-outline);overflow-x:auto;scrollbar-width:thin}.pineui-tabs__tab{display:flex;align-items:center;gap:8px;padding:12px 16px;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--md-sys-color-onSurfaceVariant);font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;white-space:nowrap}.pineui-tabs__tab:hover{background:#0000000d}.pineui-tabs__tab--active{color:var(--md-sys-color-primary);border-bottom-color:var(--md-sys-color-primary)}.pineui-tabs__badge{background:var(--md-sys-color-surfaceVariant);color:var(--md-sys-color-onSurfaceVariant);padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600}.pineui-tabs__content{padding:16px 0}.pineui-badge{display:inline-flex;align-items:center;padding:4px 8px;border-radius:12px;font-size:12px;font-weight:600;white-space:nowrap}.pineui-badge--default{background:var(--md-sys-color-surfaceVariant);color:var(--md-sys-color-onSurfaceVariant)}.pineui-badge--success{background:#1987541a;color:var(--md-sys-color-success);border:1px solid var(--md-sys-color-success)}.pineui-badge--warning{background:#ffc1071a;color:#ff9800;border:1px solid #ff9800}.pineui-badge--error{background:#ba1a1a1a;color:var(--md-sys-color-error);border:1px solid var(--md-sys-color-error)}.pineui-badge--info{background:#6750a41a;color:var(--md-sys-color-primary);border:1px solid var(--md-sys-color-primary)}.pineui-badge--small{padding:2px 6px;font-size:10px}.pineui-badge--large{padding:6px 12px;font-size:14px}.pineui-chip{display:inline-flex;align-items:center;gap:6px;padding:8px 12px;background:var(--md-sys-color-surface);border:1px solid var(--md-sys-color-outline);border-radius:8px;font-size:14px;font-weight:500;color:var(--md-sys-color-onSurface);cursor:pointer;transition:all .2s}.pineui-chip:hover{background:var(--md-sys-color-surfaceVariant)}.pineui-chip--selected{background:var(--md-sys-color-primary);color:var(--md-sys-color-onPrimary);border-color:var(--md-sys-color-primary)}.pineui-grid,.pineui-progress{width:100%}.pineui-progress__header{display:flex;justify-content:space-between;margin-bottom:8px;font-size:14px}.pineui-progress__label{color:var(--md-sys-color-onSurface);font-weight:500}.pineui-progress__percentage{color:var(--md-sys-color-onSurfaceVariant)}.pineui-progress__track{width:100%;height:8px;background:var(--md-sys-color-surfaceVariant);border-radius:4px;overflow:hidden}.pineui-progress__fill{height:100%;transition:width .3s ease;border-radius:4px}.pineui-progress__fill--primary{background:var(--md-sys-color-primary)}.pineui-progress__fill--success{background:var(--md-sys-color-success)}.pineui-progress__fill--error{background:var(--md-sys-color-error)}.pineui-table{width:100%;overflow-x:auto}.pineui-table table{width:100%;border-collapse:collapse}.pineui-table__header{text-align:left;padding:12px 16px;font-size:12px;font-weight:600;color:var(--md-sys-color-onSurfaceVariant);text-transform:uppercase;letter-spacing:.5px;border-bottom:1px solid var(--md-sys-color-outline)}.pineui-table__row{border-bottom:1px solid var(--md-sys-color-surfaceVariant);transition:background .2s}.pineui-table__row:hover{background:#00000005}.pineui-table__cell{padding:16px;vertical-align:middle}
|
|
1
|
+
:root{--md-sys-color-primary: #6750a4;--md-sys-color-onPrimary: #ffffff;--md-sys-color-secondary: #625b71;--md-sys-color-onSecondary: #ffffff;--md-sys-color-error: #ba1a1a;--md-sys-color-onError: #ffffff;--md-sys-color-success: #198754;--md-sys-color-surface: #ffffff;--md-sys-color-onSurface: #1c1b1f;--md-sys-color-surfaceVariant: #e7e0ec;--md-sys-color-onSurfaceVariant: #49454f;--md-sys-color-outline: #79747e;--md-sys-color-background: #fffbfe;--md-sys-color-onBackground: #1c1b1f}*{box-sizing:border-box}.pineui-root{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;color:var(--md-sys-color-onBackground);background:var(--md-sys-color-background);width:100%;height:100%;overflow:hidden;line-height:1.5;font-size:16px}.pineui-root *{margin:0;padding:0;box-sizing:border-box}.pineui-text{margin:0;line-height:1.5}.pineui-text--titleLarge{font-size:22px;font-weight:500;line-height:28px}.pineui-text--titleMedium{font-size:16px;font-weight:500;line-height:24px}.pineui-text--titleSmall{font-size:14px;font-weight:500;line-height:20px}.pineui-text--bodyLarge{font-size:16px;font-weight:400;line-height:24px}.pineui-text--bodyMedium{font-size:14px;font-weight:400;line-height:20px}.pineui-text--bodySmall{font-size:12px;font-weight:400;line-height:16px}.pineui-text--headlineSmall{font-size:24px;font-weight:400;line-height:32px}.pineui-text--headlineMedium{font-size:28px;font-weight:400;line-height:36px}.pineui-text--headlineLarge{font-size:32px;font-weight:400;line-height:40px}.pineui-text--labelLarge{font-size:14px;font-weight:500;line-height:20px}.pineui-text--labelMedium{font-size:12px;font-weight:500;line-height:16px}.pineui-text--labelSmall{font-size:11px;font-weight:500;line-height:16px}.pineui-text--bold{font-weight:700}.pineui-layout{display:flex}.pineui-layout--column{flex-direction:column}.pineui-layout--row{flex-direction:row}.pineui-button{display:inline-flex;align-items:center;justify-content:center;gap:8px;border:none;border-radius:20px;font-family:inherit;font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;padding:10px 24px}.pineui-button--filled{background:var(--md-sys-color-primary);color:var(--md-sys-color-onPrimary)}.pineui-button--filled:hover:not(:disabled){opacity:.9;box-shadow:0 1px 3px #0003}.pineui-button--text{background:transparent;color:var(--md-sys-color-primary);padding:10px 12px}.pineui-button--text:hover:not(:disabled){background:#6750a414}.pineui-button--outlined{background:transparent;color:var(--md-sys-color-primary);border:1px solid var(--md-sys-color-outline);padding:10px 24px}.pineui-button--outlined:hover:not(:disabled){background:#6750a414}.pineui-button--icon{background:transparent;color:var(--md-sys-color-onSurfaceVariant);padding:8px;border-radius:8px;min-width:40px;min-height:40px}.pineui-button--icon:hover:not(:disabled){background:#0000000d}.pineui-button--fab{background:var(--md-sys-color-primary);color:var(--md-sys-color-onPrimary);border-radius:16px;padding:16px;box-shadow:0 2px 4px #0003}.pineui-button--disabled{opacity:.38;cursor:not-allowed}.pineui-button--small{font-size:12px;padding:6px 16px}.pineui-button--icon.pineui-button--small{padding:4px;min-width:20px;min-height:20px;font-size:14px;line-height:1}.pineui-card{background:var(--md-sys-color-surface);border-radius:12px;transition:box-shadow .2s}.pineui-card--elevation-0{box-shadow:none}.pineui-card--elevation-1{box-shadow:0 1px 2px #0000001a}.pineui-card--clickable{cursor:pointer}.pineui-card--clickable:hover{box-shadow:0 2px 8px #00000026}.pineui-image{display:block;max-width:100%;height:auto}.pineui-avatar{display:block;border:2px solid var(--md-sys-color-surface)}.pineui-icon{display:inline-flex;align-items:center;justify-content:center}.pineui-scaffold{display:flex;flex-direction:column;height:100%;background:var(--md-sys-color-background)}.pineui-scaffold__appbar{background:var(--md-sys-color-surface);box-shadow:0 1px 3px #0000001a;padding:16px;z-index:10}.pineui-scaffold__body{flex:1;overflow-y:auto}.pineui-scaffold__fab{position:fixed;bottom:80px;right:16px;z-index:20}.pineui-scaffold__bottomnav{background:var(--md-sys-color-surface);box-shadow:0 -1px 3px #0000001a;padding:8px 0;z-index:10}.pineui-collection{width:100%}.pineui-collection__list{display:flex;flex-direction:column}.pineui-collection__list .pineui-collection__item{border-bottom:1px solid var(--md-sys-color-surfaceVariant)}.pineui-collection__list .pineui-collection__item:last-child{border-bottom:none}.pineui-loading,.pineui-error{display:flex;align-items:center;justify-content:center;min-height:200px;padding:32px;text-align:center;color:var(--md-sys-color-onSurfaceVariant)}.pineui-error{color:var(--md-sys-color-error)}.pineui-snackbar-container{position:fixed;bottom:16px;left:50%;transform:translate(-50%);z-index:1000;display:flex;flex-direction:column;gap:8px;pointer-events:none}.pineui-snackbar{background:var(--md-sys-color-onSurface);color:var(--md-sys-color-surface);padding:14px 16px;border-radius:4px;box-shadow:0 4px 8px #0000004d;display:flex;align-items:center;gap:16px;min-width:300px;max-width:500px;pointer-events:auto;opacity:0;transform:translateY(20px);transition:all .3s cubic-bezier(.4,0,.2,1)}.pineui-snackbar--visible{opacity:1;transform:translateY(0)}.pineui-snackbar__message{flex:1;font-size:14px;line-height:20px}.pineui-snackbar__action{background:transparent;border:none;color:var(--md-sys-color-primary);font-size:14px;font-weight:500;cursor:pointer;padding:8px 12px;border-radius:4px;text-transform:uppercase;letter-spacing:.5px}.pineui-snackbar__action:hover{background:#6750a41f}.pineui-appbar{display:flex;align-items:center;padding:12px 16px;gap:16px;background:var(--md-sys-color-surface);box-shadow:0 1px 3px #0000001a}.pineui-appbar__leading{display:flex;align-items:center}.pineui-appbar__title{flex:1}.pineui-appbar__actions{display:flex;align-items:center;gap:8px}.pineui-bottomnav{display:flex;justify-content:space-around;align-items:center;background:var(--md-sys-color-surface);box-shadow:0 -1px 3px #0000001a;padding:8px 0;min-height:64px}.pineui-bottomnav__item{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;background:transparent;border:none;cursor:pointer;padding:8px;color:var(--md-sys-color-onSurfaceVariant);transition:all .2s;position:relative;gap:4px}.pineui-bottomnav__item:hover{background:#0000000d}.pineui-bottomnav__item--active{color:var(--md-sys-color-primary)}.pineui-bottomnav__icon-container{position:relative;font-size:24px}.pineui-bottomnav__badge{position:absolute;top:-8px;right:-8px;background:var(--md-sys-color-error);color:var(--md-sys-color-onError);font-size:10px;font-weight:600;padding:2px 6px;border-radius:10px;min-width:18px;text-align:center}.pineui-bottomnav__label{font-size:12px;font-weight:500}.pineui-input{width:100%;padding:12px 16px;border:1px solid var(--md-sys-color-outline);border-radius:4px;font-family:inherit;font-size:16px;line-height:24px;color:var(--md-sys-color-onSurface);background:var(--md-sys-color-surface);transition:all .2s}.pineui-input:focus{outline:none;border-color:var(--md-sys-color-primary);box-shadow:0 0 0 1px var(--md-sys-color-primary)}.pineui-input::placeholder{color:var(--md-sys-color-onSurfaceVariant);opacity:.6}textarea.pineui-input{resize:vertical;min-height:80px}.pineui-divider{width:100%;margin:0}.pineui-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:999;animation:fadeIn .2s ease-out;pointer-events:auto}.pineui-modal-backdrop--bottomSheet{align-items:flex-end;justify-content:stretch}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.pineui-modal{background:var(--md-sys-color-surface);border-radius:16px;box-shadow:0 8px 32px #0000004d;max-width:90vw;max-height:90vh;overflow:auto;animation:slideUp .3s cubic-bezier(.4,0,.2,1)}@keyframes slideUp{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.pineui-modal--bottomSheet{width:100%;max-width:100vw;max-height:80vh;border-radius:16px 16px 0 0;margin:0;animation:slideUpFromBottom .3s cubic-bezier(.4,0,.2,1)}@keyframes slideUpFromBottom{0%{transform:translateY(100%)}to{transform:translateY(0)}}.pineui-modal--modal{width:500px;max-width:90vw}.pineui-modal--fullscreen{width:95vw;height:95vh;max-width:95vw;max-height:95vh;border-radius:12px;overflow:hidden;display:flex;flex-direction:column}.pineui-modal--dialog{width:400px;max-width:90vw;padding:24px}.pineui-tabs{display:flex;flex-direction:column;width:100%}.pineui-tabs__header{display:flex;gap:8px;border-bottom:1px solid var(--md-sys-color-outline);overflow-x:auto;scrollbar-width:thin}.pineui-tabs__tab{display:flex;align-items:center;gap:8px;padding:12px 16px;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--md-sys-color-onSurfaceVariant);font-size:14px;font-weight:500;cursor:pointer;transition:all .2s;white-space:nowrap}.pineui-tabs__tab:hover{background:#0000000d}.pineui-tabs__tab--active{color:var(--md-sys-color-primary);border-bottom-color:var(--md-sys-color-primary)}.pineui-tabs__badge{background:var(--md-sys-color-surfaceVariant);color:var(--md-sys-color-onSurfaceVariant);padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600}.pineui-tabs__content{padding:16px 0}.pineui-badge{display:inline-flex;align-items:center;padding:4px 8px;border-radius:12px;font-size:12px;font-weight:600;white-space:nowrap}.pineui-badge--default{background:var(--md-sys-color-surfaceVariant);color:var(--md-sys-color-onSurfaceVariant)}.pineui-badge--success{background:#1987541a;color:var(--md-sys-color-success);border:1px solid var(--md-sys-color-success)}.pineui-badge--warning{background:#ffc1071a;color:#ff9800;border:1px solid #ff9800}.pineui-badge--error{background:#ba1a1a1a;color:var(--md-sys-color-error);border:1px solid var(--md-sys-color-error)}.pineui-badge--info{background:#6750a41a;color:var(--md-sys-color-primary);border:1px solid var(--md-sys-color-primary)}.pineui-badge--small{padding:2px 6px;font-size:10px}.pineui-badge--large{padding:6px 12px;font-size:14px}.pineui-chip{display:inline-flex;align-items:center;gap:6px;padding:8px 12px;background:var(--md-sys-color-surface);border:1px solid var(--md-sys-color-outline);border-radius:8px;font-size:14px;font-weight:500;color:var(--md-sys-color-onSurface);cursor:pointer;transition:all .2s}.pineui-chip:hover{background:var(--md-sys-color-surfaceVariant)}.pineui-chip--selected{background:var(--md-sys-color-primary);color:var(--md-sys-color-onPrimary);border-color:var(--md-sys-color-primary)}.pineui-grid,.pineui-progress{width:100%}.pineui-progress__header{display:flex;justify-content:space-between;margin-bottom:8px;font-size:14px}.pineui-progress__label{color:var(--md-sys-color-onSurface);font-weight:500}.pineui-progress__percentage{color:var(--md-sys-color-onSurfaceVariant)}.pineui-progress__track{width:100%;height:8px;background:var(--md-sys-color-surfaceVariant);border-radius:4px;overflow:hidden}.pineui-progress__fill{height:100%;transition:width .3s ease;border-radius:4px}.pineui-progress__fill--primary{background:var(--md-sys-color-primary)}.pineui-progress__fill--success{background:var(--md-sys-color-success)}.pineui-progress__fill--error{background:var(--md-sys-color-error)}.pineui-table{width:100%;overflow-x:auto}.pineui-table table{width:100%;border-collapse:collapse}.pineui-table__header{text-align:left;padding:12px 16px;font-size:12px;font-weight:600;color:var(--md-sys-color-onSurfaceVariant);text-transform:uppercase;letter-spacing:.5px;border-bottom:1px solid var(--md-sys-color-outline)}.pineui-table__row{border-bottom:1px solid var(--md-sys-color-surfaceVariant);transition:background .2s}.pineui-table__row:hover{background:#00000005}.pineui-table__cell{padding:16px;vertical-align:middle}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pineui/react",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Server-Driven UI framework for AI-native applications. Build dynamic, multi-platform interfaces from JSON schemas.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"server-driven-ui",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"license": "Apache-2.0 WITH Commons-Clause",
|
|
16
16
|
"repository": {
|
|
17
17
|
"type": "git",
|
|
18
|
-
"url": "https://github.com/PineUI/PineUI.git",
|
|
18
|
+
"url": "git+https://github.com/PineUI/PineUI.git",
|
|
19
19
|
"directory": "packages/react"
|
|
20
20
|
},
|
|
21
21
|
"homepage": "https://pineui.github.io/PineUI/",
|