@korso/shepherd-ui 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ :root{--bg:#ece0c6;--ink:#322c20;--ink2:#6f6450;--ink3:#9c917a;--line:#d7c9ac;--line2:#e0d4b9;--live:#3d8b58;--drop:#bd4f3a;--chip:#e3d6ba;--terr:#7a6a48;--card:#f5ecd9}*{box-sizing:border-box}html,body{height:100%}body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.45 Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif;-webkit-font-smoothing:antialiased}.wrap{max-width:1100px;margin:0 auto;padding:40px 44px}header{display:flex;align-items:center;gap:12px;padding-bottom:18px}.brand{font-size:17px;font-weight:600}.vitals{color:var(--ink3);font-size:12.5px}.grow{flex:1}.status{font-size:12px;color:var(--ink3)}.status--ok{color:var(--live)}.status--warn{color:var(--terr)}.status--error{color:var(--drop)}.freshness{font-size:12px;color:var(--ink3)}.repo{position:relative}.repo-trig{display:inline-flex;align-items:center;gap:6px;font-size:13px;font-family:inherit;color:var(--ink);-webkit-appearance:none;-moz-appearance:none;appearance:none;border:1px solid var(--line);border-radius:8px;padding:4px 10px;background:#fffaee66;cursor:pointer}.repo-trig .slash{color:var(--ink3)}.repo-menu{position:absolute;top:36px;left:0;min-width:200px;background:var(--card);border:1px solid var(--line);border-radius:10px;padding:5px;box-shadow:0 8px 24px #32281424;z-index:5}.repo-mi{display:flex;justify-content:space-between;gap:14px;padding:7px 9px;width:100%;text-align:left;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-family:inherit;color:inherit;background:transparent;border-radius:7px;font-size:13px;cursor:pointer}.repo-mi:hover{background:var(--chip)}.repo-mi.on{background:var(--chip);font-weight:600}.repo-mi .ct{font-size:11px;color:var(--ink3)}.repo-mi.all{border-top:1px solid var(--line2);margin-top:4px;padding-top:9px;color:var(--ink2)}.tabs{display:flex;gap:4px;margin-left:auto}.tab{font-size:13px;color:var(--ink2);padding:5px 11px;border:0;border-radius:7px;background:transparent;cursor:pointer;font:inherit}.tab--active{background:var(--ink);color:var(--bg)}.ws-switcher{position:relative}.ws-trig{display:inline-flex;align-items:center;gap:8px;font:inherit;font-size:13px;font-weight:600;color:var(--ink);cursor:pointer;border:1px solid var(--line);border-radius:9px;padding:5px 10px;background:var(--card)}.ws-trig:hover{border-color:var(--ink3)}.ws-trig--empty{background:transparent;border-style:dashed;border-color:var(--ink2)}.ws-avatar{width:18px;height:18px;border-radius:6px;background:var(--ink);color:var(--bg);display:grid;place-items:center;font-size:10px;font-weight:700;flex:none}.ws-avatar--sm{width:16px;height:16px;font-size:9px}.ws-plus{color:var(--ink2);font-weight:700}.ws-name{max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ws-caret{color:var(--ink3);font-size:10px}.ws-menu{position:absolute;top:40px;left:0;width:240px;z-index:20;background:var(--card);border:1px solid var(--line);border-radius:11px;padding:6px;box-shadow:0 8px 24px #32281429}.ws-menu__head{margin:0;padding:6px 8px;font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink3)}.ws-menu__none{margin:0;padding:2px 8px 6px;color:var(--ink3);font-style:italic;font-size:13px}.ws-menu__list{list-style:none;margin:0;padding:0}.ws-mi{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;font-size:13px;color:var(--ink);background:transparent;border:0;border-radius:7px;padding:7px 8px;cursor:pointer}.ws-mi:hover{background:var(--chip)}.ws-mi--on{font-weight:600}.ws-mi__name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ws-mi__check{color:var(--live)}.ws-menu__actions{display:flex;flex-direction:column;margin-top:5px;padding-top:5px;border-top:1px solid var(--line2)}.ws-action{display:flex;align-items:center;gap:8px;width:100%;text-align:left;font:inherit;font-size:13px;color:var(--ink2);background:transparent;border:0;border-radius:7px;padding:8px;cursor:pointer}.ws-action:hover{background:var(--chip);color:var(--ink)}.ws-form{display:flex;flex-direction:column;gap:8px;padding:4px}.ws-form label{font-size:10px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--ink3)}.ws-form input{padding:8px 10px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font:inherit}.ws-form input:focus{outline:none;border-color:var(--terr);box-shadow:0 0 0 3px #7a6a4824}.ws-form__row{display:flex;gap:8px;justify-content:flex-end}.ws-form__row button{font:inherit;font-size:13px;font-weight:600;border-radius:8px;padding:7px 14px;cursor:pointer;border:1px solid var(--ink);background:var(--ink);color:var(--bg)}.ws-form__row button:disabled{opacity:.55;cursor:default}.ws-form__back{background:transparent!important;color:var(--ink2)!important;border-color:var(--line)!important}.ws-menu__error{margin:6px 4px 2px;font-size:12.5px;color:var(--drop)}.crew{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:26px 0 32px}.person{display:inline-flex;align-items:center;gap:9px;padding:5px 13px 5px 5px;border:1px solid var(--line);border-radius:999px;background:var(--card);font-size:13px}.person--idle{opacity:.55}.avatar{width:24px;height:24px;border-radius:50%;display:grid;place-items:center;font-size:10px;font-weight:700;color:#fff;flex:none}.person__name{font-weight:600}.person__doing{color:var(--ink3);font-size:12px}.board{display:grid;grid-template-columns:1fr 1px 1fr;gap:0}.board__rule{background:var(--line)}.col{padding:0 36px}.col:first-child{padding-left:0}.col:last-child{padding-right:0}.colhead{display:flex;align-items:center;gap:8px;margin-bottom:6px}.colhead h2{font-size:12px;font-weight:600;letter-spacing:.03em;margin:0;text-transform:uppercase;color:var(--ink2)}.colhead .n{font-size:11px;color:var(--ink3);background:var(--chip);border-radius:999px;padding:1px 8px}.task{padding:16px 0;border-bottom:1px solid var(--line2)}.task__r1{display:flex;align-items:center;gap:8px}.task__who{font-size:13.5px;font-weight:600}.task__tag{font-size:11px;color:var(--ink3)}.task__repo{font-size:11px;color:var(--terr);background:#7a6a481a;border-radius:4px;padding:0 6px}.task__stat{margin-left:auto;font-size:11px;font-weight:500;color:var(--ink3)}.task__stat--drop{color:var(--drop)}.livedot{width:7px;height:7px;border-radius:50%;background:var(--live);margin-left:auto}.task__intent{font-size:13.5px;margin:5px 0 0;line-height:1.45}.terr{margin-top:8px;display:flex;flex-wrap:wrap;gap:6px;align-items:center}.terr__lbl{font-size:9.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink3)}.glob{font-family:ui-monospace,Menlo,monospace;font-size:11px;color:var(--terr);background:#7a6a481f;border:1px solid rgba(122,106,72,.22);border-radius:5px;padding:1px 7px}.task__meta{font-size:11.5px;color:var(--ink3);margin-top:6px}.terrx{margin-top:8px}.terrx summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:6px;flex-wrap:wrap;-webkit-user-select:none;user-select:none}.terrx summary::-webkit-details-marker{display:none}.terrx .terr--full{margin-top:8px}.glob--more{cursor:pointer;color:var(--ink2);background:var(--chip);border:1px solid var(--line)}.glob--more .tw{color:var(--ink3);display:inline-block;transition:transform .15s}.terrx[open] summary .glob--more .tw{transform:rotate(90deg)}.grp{padding:16px 0;border-bottom:1px solid var(--line2)}.grp__head{display:flex;align-items:center;gap:8px}.grp__who{font-size:13.5px;font-weight:600}.grp__tag,.grp__count{font-size:11px;color:var(--ink3)}.grp__dot{width:7px;height:7px;border-radius:50%;background:var(--live);margin-left:auto}.claims{margin:10px 0 0 6px;padding-left:14px;border-left:1px solid var(--line)}.claim{padding:6px 0}.claim+.claim{border-top:1px solid var(--line2);margin-top:6px}.fold{margin-top:10px}.fold summary{list-style:none;cursor:pointer;font-size:12px;color:var(--ink2);display:inline-flex;align-items:center;gap:6px;-webkit-user-select:none;user-select:none}.fold summary::-webkit-details-marker{display:none}.fold summary .tw{display:inline-block;color:var(--ink3);transition:transform .15s}.fold[open] summary .tw{transform:rotate(90deg)}.fold__body{margin:8px 0 0 6px;padding-left:14px;border-left:1px dashed var(--line)}.covered{font-size:10.5px;color:var(--ink3);font-style:italic;margin-top:4px}.day{font-size:11px;color:var(--ink3);padding:18px 0 2px;font-weight:600}.more{margin-top:20px;font-size:12.5px;color:var(--ink2);padding:7px 13px;border:1px solid var(--line);border-radius:8px;background:#fffaee59;cursor:pointer}.empty{color:var(--ink3);font-style:italic;padding:14px 0}.chat-wrap{background:var(--card);border:1px solid var(--line);border-radius:12px;display:flex;flex-direction:column;overflow:hidden;height:calc(100vh - 150px);min-height:320px}.chat{flex:1;overflow-y:auto;padding:16px}.chat{scrollbar-width:thin;scrollbar-color:var(--line) transparent}.chat::-webkit-scrollbar{width:10px}.chat::-webkit-scrollbar-track{background:transparent}.chat::-webkit-scrollbar-thumb{background:var(--line);border-radius:999px;border:3px solid var(--card);background-clip:padding-box}.chat::-webkit-scrollbar-thumb:hover{background:var(--ink3);background-clip:padding-box}.chat__note{padding:9px 16px;font-size:11.5px;color:var(--ink3)}.msg{display:flex;gap:11px;padding:9px 0}.msg__avatar{flex:none;width:32px;height:32px;border-radius:50%;display:grid;place-items:center;font-size:12px;font-weight:700;color:#fff}.msg__body{min-width:0;flex:1}.msg__head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}.msg__who{font-weight:600}.msg__human{font-size:12px;color:var(--ink3)}.msg__to{font-size:11.5px;color:var(--terr)}.msg__time{font-size:11.5px;color:var(--ink3);margin-left:auto}.msg__text{margin-top:3px;padding:8px 12px;border-radius:4px 12px 12px;background:var(--chip);white-space:pre-wrap;word-break:break-word}.msg--targeted .msg__text{box-shadow:inset 3px 0 0 var(--terr)}.msg--me,.msg--me .msg__head{flex-direction:row-reverse}.msg--me .msg__time{margin-left:0;margin-right:auto}.msg--me .msg__body{display:flex;flex-direction:column;align-items:flex-end}.msg--me .msg__text{border-radius:12px 4px 12px 12px;background:#d4e7d2}.msg--me.msg--targeted .msg__text{box-shadow:inset -3px 0 0 var(--terr)}.composer{position:relative;border-top:1px solid var(--line);padding:10px 12px}.chat-form{display:flex;gap:8px}.chat-input{flex:1;padding:9px 12px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font:inherit}.chat-input:focus{outline:none;border-color:var(--terr)}.chat-send{padding:9px 16px;border-radius:8px;border:1px solid var(--ink);background:var(--ink);color:var(--bg);font-weight:600;cursor:pointer;font:inherit}.chat-send:disabled{opacity:.5;cursor:default}.mention-pop{position:absolute;left:12px;right:12px;bottom:56px;z-index:6;background:var(--card);border:1px solid var(--line);border-radius:10px;padding:5px;box-shadow:0 8px 24px #32281429;max-height:200px;overflow-y:auto}.mention-mi{display:flex;align-items:center;gap:9px;width:100%;text-align:left;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;font-family:inherit;color:inherit;background:transparent;border-radius:7px;padding:6px 8px;font-size:13px;cursor:pointer}.mention-mi:hover,.mention-mi.on{background:var(--chip)}.mention-mi .ma{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;font-size:9px;font-weight:700;color:#fff;flex:none}.gate{max-width:420px;margin:12vh auto 0;text-align:center}.gate h1{font-size:19px;margin:0 0 6px}.gate p{color:var(--ink2);margin:0 0 20px}.gate form{display:flex;gap:8px}.gate input{flex:1;padding:10px 12px;border-radius:8px;border:1px solid var(--line);background:var(--card);color:var(--ink)}.gate button{padding:10px 16px;border-radius:8px;border:1px solid var(--ink);background:var(--ink);color:var(--bg);font-weight:600;cursor:pointer}.shepherd-root{max-width:1100px;margin:0 auto;padding:40px 44px}.shepherd-root>main{padding-top:18px}.shepherd-config{display:flex;flex-direction:column}.shepherd-config h2{font-size:16px;margin:0 0 22px}.config-layout{display:flex;gap:32px;align-items:flex-start}.config-nav{flex:none;width:170px;display:flex;flex-direction:column;gap:2px;position:sticky;top:0}.shepherd-config .config-nav__item{text-align:left;font:inherit;font-size:13.5px;color:var(--ink2);background:transparent;border:0;border-radius:8px;padding:8px 12px;cursor:pointer;box-shadow:inset 2px 0 0 transparent;transition:color .12s ease,background .12s ease}.shepherd-config .config-nav .config-nav__item:hover{color:var(--ink);background:#322c200f}.shepherd-config .config-nav__item--on{color:var(--ink);font-weight:600;box-shadow:inset 2px 0 0 var(--ink)}.shepherd-config .config-nav .config-nav__item--on:hover{background:transparent}.config-panel{flex:1;min-width:0}.config-panel>section+section{margin-top:26px;padding-top:26px;border-top:1px solid var(--line2)}.config-none{color:var(--ink2);font-size:13.5px;max-width:520px}.shepherd-config .readonly-value{margin:0;font-size:14px;color:var(--ink);padding:9px 12px;border-radius:8px;border:1px solid var(--line2);background:var(--bg)}.shepherd-general .leave{padding-top:4px}.shepherd-config button.danger{border-color:var(--drop);background:transparent;color:var(--drop);align-self:flex-start}.shepherd-config button.danger:hover:not(:disabled){background:var(--drop);color:var(--bg)}.shepherd-config .card-head h3{font-size:13px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--ink2);margin:0}.shepherd-config .card-sub{margin:4px 0 0;font-size:12.5px;color:var(--ink3)}.shepherd-config .card-head{margin-bottom:16px}.shepherd-config .card-body{display:flex;flex-direction:column;gap:16px}.shepherd-config .card-body>[role=alert]{margin:0;color:var(--drop);font-size:13px}.shepherd-config .card-body>[role=status]{margin:0;color:var(--ink2);font-size:13px}.shepherd-config .field{display:flex;flex-direction:column;gap:8px}.shepherd-config .card-body label{font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--ink3)}.shepherd-config .helper{margin:0;font-size:12.5px;color:var(--ink2)}.shepherd-config .field>select{width:100%}.shepherd-config select{appearance:none;-webkit-appearance:none;-moz-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%239c917a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 28px center;padding-right:44px}.shepherd-config .field__row{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.shepherd-config .field__row>input{flex:1;min-width:200px}.shepherd-invites .invites{gap:12px}.shepherd-invites .invites>button{align-self:flex-start}.shepherd-config input,.shepherd-config select{padding:9px 12px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font:inherit;transition:border-color .12s ease,box-shadow .12s ease}.shepherd-config input::placeholder{color:var(--ink3)}.shepherd-config input:focus,.shepherd-config select:focus{outline:none;border-color:var(--terr);box-shadow:0 0 0 3px #7a6a4824}.shepherd-config button{padding:9px 16px;border-radius:8px;border:1px solid var(--ink);background:var(--ink);color:var(--bg);font-weight:600;cursor:pointer;font:inherit;white-space:nowrap;transition:background .12s ease}.shepherd-config button:hover:not(:disabled){background:#413a2a}.shepherd-config button:disabled{opacity:.55;cursor:default}.shepherd-config ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column}.shepherd-config li{display:flex;align-items:center;gap:10px;padding:10px 0;font-size:13px}.shepherd-config li+li{border-top:1px solid var(--line2)}.shepherd-config li>span:first-child{flex:1;min-width:0;font-weight:500}.shepherd-config li button{padding:5px 12px}.shepherd-config .role,.shepherd-config .token-meta{color:var(--ink3);font-size:12px}.shepherd-config .email-invite__status{margin:0;font-size:12.5px;color:var(--ink2)}.shepherd-connect-agent .install-command{position:relative}.shepherd-connect-agent pre{margin:0;padding:12px 14px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.5;overflow-x:auto;white-space:pre-wrap;word-break:break-word}.shepherd-config .shepherd-connect-agent .install-command__copy{position:absolute;top:7px;right:7px;display:grid;place-items:center;width:28px;height:28px;padding:0;border-radius:7px;border:0;background:transparent;color:var(--ink3);cursor:pointer;transition:background .12s ease,color .12s ease}.shepherd-config .shepherd-connect-agent .install-command__copy:hover{background:#322c2014;color:var(--ink)}.shepherd-connect-agent h4{margin:6px 0 0;font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--ink3)}.shepherd-connect-agent .token-once{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;padding:10px 12px;border-radius:8px;background:var(--chip);border:1px solid var(--line2)}.shepherd-config .invite-result{align-self:stretch;display:flex;flex-direction:column;gap:12px;padding:14px 16px;border-radius:10px;background:var(--card);border:1px solid var(--line)}.shepherd-config .invite-result__head{display:flex;align-items:center;gap:12px}.shepherd-config .invite-result__eyebrow{flex:1;font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--ink3)}.shepherd-config .invite-uses{font-size:12px;color:var(--ink3)}.shepherd-config .invite-result__copyrow{display:flex;align-items:center;gap:10px}.shepherd-config .invite-result__copyrow>code{flex:1;min-width:0;font-size:15px;font-weight:600;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--ink);letter-spacing:.02em;word-break:break-all}.shepherd-config .invite-result__copyrow--link{padding-top:10px;border-top:1px solid var(--line2)}.shepherd-config .invite-result__copyrow--link a{flex:1;min-width:0;font-size:12px;color:var(--ink2);word-break:break-all}.shepherd-config .invite-result .copy-btn{flex:none;padding:5px 12px;font-size:12px;font-weight:600;border-radius:7px;border:1px solid var(--line);background:var(--bg);color:var(--ink2);cursor:pointer}.shepherd-config .invite-result .copy-btn:hover{background:var(--ink);color:var(--bg);border-color:var(--ink)}.shepherd-config .invite-result .link-btn{flex:none;padding:0;font-size:12px;font-weight:600;border:0;background:transparent;color:var(--drop);cursor:pointer}.shepherd-config .invite-result .link-btn:hover{background:transparent;text-decoration:underline}.shepherd-config .revoked{color:var(--ink3);text-decoration:line-through}.shepherd-empty-state{text-align:center;color:var(--ink2);padding:48px 24px}.shepherd-empty-state button{margin-top:14px}.shepherd-feedback{position:fixed;right:20px;bottom:20px;z-index:10}.shepherd-feedback__trigger{padding:9px 16px;border-radius:999px;border:1px solid var(--ink);background:var(--ink);color:var(--bg);font-weight:600;font-size:13px;font:inherit;cursor:pointer;box-shadow:0 8px 24px #3228142e}.shepherd-feedback__trigger:hover{background:#413a2a}.shepherd-feedback__panel{position:absolute;right:0;bottom:calc(100% + 10px);width:280px;display:flex;flex-direction:column;gap:10px;padding:16px;background:var(--card);border:1px solid var(--line);border-radius:12px;box-shadow:0 8px 24px #3228142e}.shepherd-feedback__panel h3{margin:0;font-size:13px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--ink2)}.shepherd-feedback__panel [role=status]{margin:0;font-size:13px;color:var(--ink2)}.shepherd-feedback__panel [role=alert]{margin:0;font-size:13px;color:var(--drop)}.shepherd-feedback__types{display:flex;gap:6px}.shepherd-feedback__types button{flex:1;padding:6px 0;border-radius:8px;border:1px solid var(--line);background:transparent;color:var(--ink2);font-size:12.5px;font:inherit;cursor:pointer;transition:background .12s ease,color .12s ease}.shepherd-feedback__types button[aria-pressed=true]{background:var(--ink);color:var(--bg);border-color:var(--ink);font-weight:600}.shepherd-feedback__panel textarea{min-height:80px;padding:9px 12px;border-radius:8px;border:1px solid var(--line);background:var(--bg);color:var(--ink);font:inherit;resize:vertical}.shepherd-feedback__panel textarea::placeholder{color:var(--ink3)}.shepherd-feedback__panel textarea:focus{outline:none;border-color:var(--terr);box-shadow:0 0 0 3px #7a6a4824}.shepherd-feedback__panel>button{padding:9px 16px;border-radius:8px;border:1px solid var(--ink);background:var(--ink);color:var(--bg);font-weight:600;cursor:pointer;font:inherit}.shepherd-feedback__panel>button:hover:not(:disabled){background:#413a2a}.shepherd-feedback__panel>button:disabled{opacity:.55;cursor:default}
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Shepherd</title>
7
- <script type="module" crossorigin src="/assets/index-D0C3m6st.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-rNR1Acph.css">
7
+ <script type="module" crossorigin src="/assets/index-BSnsUIT-.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-CK7qrsNo.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@korso/shepherd-ui",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Auth-agnostic React UI library for the Shepherd wallboard (Dashboard, client, provider). Host injects auth; the library never reads tokens.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -1,15 +0,0 @@
1
- import type { WorkspaceSummaryT } from "@shepherd/shared";
2
- export interface WorkspacesProps {
3
- /** All workspaces the account belongs to (for the switcher / context). */
4
- workspaces: WorkspaceSummaryT[];
5
- /** The currently-selected workspace, or null when the account has none. */
6
- selected: WorkspaceSummaryT | null;
7
- /** Called after a mutation that changes membership (create / join / leave). */
8
- onChanged: () => void;
9
- /** Switch the active workspace (optional simple switcher). */
10
- onSelect?: (workspaceId: string) => void;
11
- /** Called after a mutation that may change the selected workspace's roster
12
- * (an invite created, a code redeemed), so the sibling <Members> refetches. */
13
- onMembersChanged?: () => void;
14
- }
15
- export declare function Workspaces({ workspaces, selected, onChanged, onSelect, onMembersChanged, }: WorkspacesProps): import("react").JSX.Element;
@@ -1,116 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useId, useState } from "react";
3
- import { useShepherdClient } from "../context.js";
4
- import { describeError } from "../client.js";
5
- export function Workspaces({ workspaces, selected, onChanged, onSelect, onMembersChanged, }) {
6
- const client = useShepherdClient();
7
- const headingId = useId();
8
- const [name, setName] = useState("");
9
- const [code, setCode] = useState("");
10
- const [invite, setInvite] = useState(null);
11
- const [error, setError] = useState(null);
12
- const [busy, setBusy] = useState(false);
13
- const [emailAddress, setEmailAddress] = useState("");
14
- const [emailStatus, setEmailStatus] = useState(null);
15
- const [emailBusy, setEmailBusy] = useState(false);
16
- const isAdmin = selected?.role === "admin";
17
- async function create() {
18
- if (!name.trim() || busy)
19
- return;
20
- setBusy(true);
21
- setError(null);
22
- try {
23
- await client.createWorkspace({ name: name.trim() });
24
- setName("");
25
- onChanged();
26
- }
27
- catch (err) {
28
- setError(describeError(err));
29
- }
30
- finally {
31
- setBusy(false);
32
- }
33
- }
34
- async function join() {
35
- if (!code.trim() || busy)
36
- return;
37
- setBusy(true);
38
- setError(null);
39
- try {
40
- await client.redeemInvite(code.trim());
41
- setCode("");
42
- onChanged();
43
- onMembersChanged?.();
44
- }
45
- catch (err) {
46
- setError(describeError(err));
47
- }
48
- finally {
49
- setBusy(false);
50
- }
51
- }
52
- async function createInvite() {
53
- if (!selected || busy)
54
- return;
55
- setBusy(true);
56
- setError(null);
57
- try {
58
- const res = await client.createInvite(selected.id, {});
59
- setInvite(res);
60
- onMembersChanged?.();
61
- }
62
- catch (err) {
63
- setError(describeError(err));
64
- }
65
- finally {
66
- setBusy(false);
67
- }
68
- }
69
- async function sendEmailInvite() {
70
- if (!selected || !emailAddress.trim() || emailBusy)
71
- return;
72
- setEmailBusy(true);
73
- setEmailStatus(null);
74
- try {
75
- const res = await client.inviteByEmail(selected.id, emailAddress.trim());
76
- setEmailStatus(`Invite sent to ${res.email}.`);
77
- setEmailAddress("");
78
- onMembersChanged?.();
79
- }
80
- catch (err) {
81
- setEmailStatus(describeError(err));
82
- }
83
- finally {
84
- setEmailBusy(false);
85
- }
86
- }
87
- async function revokeInvite() {
88
- if (!selected || !invite || busy)
89
- return;
90
- setBusy(true);
91
- setError(null);
92
- try {
93
- await client.revokeInvite(selected.id, invite.code);
94
- setInvite(null);
95
- }
96
- catch (err) {
97
- setError(describeError(err));
98
- }
99
- finally {
100
- setBusy(false);
101
- }
102
- }
103
- // Clear any displayed invite/email status when the selected workspace changes.
104
- useEffect(() => {
105
- setInvite(null);
106
- setEmailStatus(null);
107
- }, [selected?.id]);
108
- // InviteResponse has no `link`; build the shareable join URL from the code.
109
- // Encode the code for path-safety (parity with client.ts path encoding).
110
- const joinLink = invite
111
- ? `${window.location.origin}/join/${encodeURIComponent(invite.code)}`
112
- : null;
113
- return (_jsxs("section", { className: "shepherd-workspaces", "aria-labelledby": headingId, children: [_jsxs("div", { className: "card-head", children: [_jsx("h3", { id: headingId, children: "Workspace management" }), _jsx("p", { className: "card-sub", children: "Create a workspace to get started, or join an existing one with an invite code." })] }), _jsxs("div", { className: "card-body", children: [error && _jsx("p", { role: "alert", children: error }), workspaces.length > 1 && onSelect && (_jsxs("div", { className: "field switcher", children: [_jsx("label", { htmlFor: "ws-switcher", children: "Active workspace" }), _jsx("select", { id: "ws-switcher", value: selected?.id ?? "", onChange: (e) => onSelect(e.target.value), children: workspaces.map((w) => (_jsx("option", { value: w.id, children: w.name }, w.id))) })] })), _jsxs("div", { className: "field create", children: [_jsx("label", { htmlFor: "ws-name", children: "Workspace name" }), _jsx("p", { className: "helper", children: "Start a fresh workspace \u2014 you'll be its admin." }), _jsxs("div", { className: "field__row", children: [_jsx("input", { id: "ws-name", type: "text", placeholder: "e.g. Acme Engineering", value: name, onChange: (e) => setName(e.target.value) }), _jsx("button", { type: "button", onClick: () => void create(), disabled: busy, children: "Create workspace" })] })] }), _jsxs("div", { className: "field join", children: [_jsx("label", { htmlFor: "invite-code", children: "Invite code" }), _jsx("p", { className: "helper", children: "Paste an invite code someone shared to join their workspace." }), _jsxs("div", { className: "field__row", children: [_jsx("input", { id: "invite-code", type: "text", placeholder: "Invite code", value: code, onChange: (e) => setCode(e.target.value) }), _jsx("button", { type: "button", onClick: () => void join(), disabled: busy, children: "Join" })] })] }), isAdmin && selected && (_jsxs("div", { className: "admin", children: [_jsxs("div", { className: "invites", children: [_jsx("button", { type: "button", onClick: () => void createInvite(), disabled: busy, children: "Create invite" }), invite && (_jsxs("div", { className: "invite-result", children: [_jsxs("div", { className: "invite-result__row", children: [_jsx("code", { children: invite.code }), _jsx("span", { className: "invite-uses", children: invite.maxUses === null
114
- ? `${invite.useCount} uses`
115
- : `${invite.useCount} / ${invite.maxUses} uses` }), _jsx("button", { type: "button", onClick: () => void revokeInvite(), disabled: busy, children: "Revoke invite" })] }), _jsx("a", { href: joinLink ?? undefined, children: joinLink })] }))] }), _jsxs("div", { className: "field email-invite", children: [_jsx("label", { htmlFor: "invite-email", children: "Email invite" }), _jsx("p", { className: "helper", children: "Send a one-time-use join link directly to someone's inbox." }), _jsxs("div", { className: "field__row", children: [_jsx("input", { id: "invite-email", type: "email", placeholder: "name@example.com", value: emailAddress, onChange: (e) => setEmailAddress(e.target.value) }), _jsx("button", { type: "button", onClick: () => void sendEmailInvite(), disabled: emailBusy, children: "Send invite" })] }), emailStatus && _jsx("p", { className: "email-invite__status", children: emailStatus })] })] }))] })] }));
116
- }