@gemboss/ui 0.48.0 → 0.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +260 -0
  2. package/README.md +127 -11
  3. package/catalog/editor.html +1 -1
  4. package/catalog/index.html +10 -10
  5. package/gemboss-ui.css +3 -3
  6. package/package.json +22 -2
  7. package/parts/components.css +3 -3
  8. package/parts/core.css +1 -1
  9. package/parts/shell.css +2 -2
  10. package/src/app-shell.css +1 -1
  11. package/src/assistant/chat.tsx +50 -6
  12. package/src/assistant/host.tsx +19 -7
  13. package/src/assistant/index.ts +1 -1
  14. package/src/assistant/sessions.tsx +2 -1
  15. package/src/assistant-chat.css +1 -1
  16. package/src/assistant.css +1 -1
  17. package/src/auth-signin-plain.js +1 -0
  18. package/src/auth-sso-plain.js +1 -1
  19. package/src/auth.tsx +105 -8
  20. package/src/briefing-card.css +1 -1
  21. package/src/collections.css +1 -1
  22. package/src/create-shell.css +1 -0
  23. package/src/create-shell.tsx +221 -0
  24. package/src/editor-insert.css +1 -0
  25. package/src/editor.css +1 -1
  26. package/src/empty-stage.css +1 -0
  27. package/src/empty-stage.tsx +31 -0
  28. package/src/icons.tsx +2 -0
  29. package/src/index-table.tsx +7 -4
  30. package/src/index.ts +16 -2
  31. package/src/kit-plain.css +1 -1
  32. package/src/kit-plain.js +1 -1
  33. package/src/language-switcher.tsx +10 -41
  34. package/src/list-page.css +1 -0
  35. package/src/list-page.tsx +239 -0
  36. package/src/menu-extras.css +1 -0
  37. package/src/menu-keys.ts +199 -0
  38. package/src/menu-layer.ts +2 -1
  39. package/src/menu-plain.js +1 -0
  40. package/src/menu.css +1 -0
  41. package/src/menu.tsx +83 -35
  42. package/src/pager-extras.css +1 -0
  43. package/src/pager.css +1 -0
  44. package/src/pager.tsx +88 -0
  45. package/src/portal.css +1 -1
  46. package/src/segmented.tsx +12 -2
  47. package/src/selection.tsx +3 -1
  48. package/src/session-rail-plain.js +1 -1
  49. package/src/settings-dialog.tsx +29 -2
  50. package/src/shell.css +1 -1
  51. package/src/stage-path.css +1 -0
  52. package/src/stage-path.tsx +89 -0
  53. package/src/stage.css +1 -0
  54. package/src/stage.tsx +52 -0
  55. package/src/starting-point.css +1 -0
  56. package/src/starting-point.tsx +93 -0
  57. package/src/status-list.css +1 -0
  58. package/src/status-list.tsx +65 -0
  59. package/src/status-matrix.css +1 -0
  60. package/src/status-matrix.tsx +131 -0
  61. package/src/team-chat.css +1 -1
  62. package/src/translation-row.css +1 -0
  63. package/src/translation-row.tsx +113 -0
  64. package/src/ui.css +1 -1
@@ -33,6 +33,8 @@ function elapsed(since: number): string {
33
33
  export interface AssistantHostLabels {
34
34
  ready: string; working: string; done: string;
35
35
  answerWaiting: string; askAboutScreen: string;
36
+ /** The last answer ends on a question only the person can answer (the `waiting` prop). */
37
+ waiting: string;
36
38
  reopen: string; hide: string; hideTitle: string; openInstead: string; openInsteadTitle: string;
37
39
  grip: string; headerTitle: string;
38
40
  newChat: string; openFull: string; minimize: string; minimizeTitle: string;
@@ -43,7 +45,7 @@ export interface AssistantHostLabels {
43
45
  }
44
46
  const EN: AssistantHostLabels = {
45
47
  ready: "Ready", working: "Working", done: "Done — tap to see it",
46
- answerWaiting: "An answer is waiting", askAboutScreen: "Ask about this screen",
48
+ answerWaiting: "An answer is waiting", askAboutScreen: "Ask about this screen", waiting: "Waiting on you",
47
49
  reopen: "Reopen the {title}", hide: "Hide the assistant", hideTitle: "Hide the assistant",
48
50
  openInstead: "Open the assistant", openInsteadTitle: "Still working — open it",
49
51
  grip: "Drag to resize the assistant; left and right arrows move it sideways",
@@ -90,7 +92,7 @@ export function AssistantMenuItem({ danger, disabled, onClick, className, childr
90
92
  /**
91
93
  * The header's ⋯ (0.31.0, Chris 08/10/2026: "clear history lên topbar … nhiều icon rồi nên cần gom nhóm"). A `<details>`
92
94
  * like the kit's Menu, but its position and trigger are the host's (assistant.css): the kit's `.ui-menu` rules live in
93
- * kit-plain.css, which the admin does not load, while the row (`ui-menu__item`) and the surface
95
+ * menu.css (kit-plain.css until 23/10/2026), which the admin loads only with a kit Menu, while the row (`ui-menu__item`) and the surface
94
96
  * (`gemboss-popover-surface`) are shell.css, which it does. Escape and an outside press close it, the way the engine
95
97
  * picker's popup closes (engine.tsx): Escape with focus inside goes back to ⋯ and is stopped, so the surface's own
96
98
  * "Escape hides the assistant" does not fire on the same key; an Escape meant for a modal elsewhere is left to it. It also
@@ -170,8 +172,15 @@ function useSideFits(): boolean {
170
172
 
171
173
  export function AssistantHost({
172
174
  title, labels, onNewChat, onClearHistory, canClearHistory = true, menuItems, onExpand, onShrink, fullActions, secondTab,
173
- view = "primary", onViewChange, miniHint, allowSide = true, children,
175
+ view = "primary", onViewChange, miniHint, allowSide = true, waiting = false, children,
174
176
  }: {
177
+ /**
178
+ * The chat's last answer ends on choices only the person can make, and nothing is running (0.49, 22/10/2026). The surface
179
+ * knows (its chat says so); the frame says it where the person looks when the chat is out of the way: "Waiting on you"
180
+ * and an amber dot on the status bar and the header, ahead of "Done" and "Ready". Not part of the dock state: the plain
181
+ * frame (assistant-plain.js) keeps its own copy of that reducer, and a question waiting is the chat's fact, not the frame's.
182
+ */
183
+ waiting?: boolean;
175
184
  /** "Gem assistant" in the admin. Names the region, the popup header and the status bar. */
176
185
  title: string;
177
186
  labels?: Partial<AssistantHostLabels>;
@@ -380,7 +389,10 @@ export function AssistantHost({
380
389
  // Announced on the grip. Read at render (not in the key handler) so assistive tech is told the
381
390
  // real ceiling for this window, which changes when the window does.
382
391
  const maxDockHeight = clampDockHeight(Number.MAX_SAFE_INTEGER, typeof window === "undefined" ? 900 : window.innerHeight);
383
- const statusText = dock.busy ? L.working : dock.unread ? L.done : L.ready;
392
+ const statusText = dock.busy ? L.working : waiting ? L.waiting : dock.unread ? L.done : L.ready;
393
+ // The waiting dot's colour is set here, not by a class: the compatibility bundle (gemboss-ui.css) carries assistant.css and
394
+ // sits at its gzip ceiling, and one more rule put it 8 B over (weight-gate, 22/10/2026).
395
+ const waitingDot = waiting && !dock.busy ? { background: "var(--gemboss-warning)" } : undefined;
384
396
  // The surface's rows of the ⋯ menu, in the panel's header and in full screen's chrome alike.
385
397
  const clearRow = onClearHistory ? (
386
398
  <AssistantMenuItem danger disabled={!canClearHistory} onClick={onClearHistory}>{L.clearHistory}</AssistantMenuItem>
@@ -418,10 +430,10 @@ export function AssistantHost({
418
430
  {mode === "mini" ? (
419
431
  <div className="gb-dock-minirow">
420
432
  <button type="button" className="gb-dock-minibar" onClick={dock.reopen} aria-label={L.reopen.replace("{title}", title)}>
421
- <span className={`gb-dock-dot${dock.busy ? " gb-dock-dot-busy" : dock.unread ? " gb-dock-dot-unread" : ""}`} aria-hidden />
433
+ <span className={`gb-dock-dot${dock.busy ? " gb-dock-dot-busy" : !waiting && dock.unread ? " gb-dock-dot-unread" : ""}`} style={waitingDot} aria-hidden />
422
434
  <strong>{title}</strong>
423
435
  <span className="gb-dock-ministatus">
424
- {dock.busy && runStartedAt ? `${L.working} · ${elapsed(runStartedAt)}` : dock.unread ? L.answerWaiting : miniHint || L.askAboutScreen}
436
+ {dock.busy && runStartedAt ? `${L.working} · ${elapsed(runStartedAt)}` : waiting ? L.waiting : dock.unread ? L.answerWaiting : miniHint || L.askAboutScreen}
425
437
  </span>
426
438
  <span className="gb-dock-minichevron" aria-hidden>▲</span>
427
439
  </button>
@@ -487,7 +499,7 @@ export function AssistantHost({
487
499
  onPointerCancel={isDock ? onHeaderUp : undefined}
488
500
  title={isDock ? L.headerTitle : undefined}
489
501
  >
490
- <span className={`gb-dock-dot${dock.busy ? " gb-dock-dot-busy" : ""}`} aria-hidden />
502
+ <span className={`gb-dock-dot${dock.busy ? " gb-dock-dot-busy" : ""}`} style={waitingDot} aria-hidden />
491
503
  <span className="gb-dock-title">{title}</span>
492
504
  <span className="gb-dock-status">{statusText}</span>
493
505
  <div className="gb-dock-actions">
@@ -6,7 +6,7 @@ export * from "./dock";
6
6
  export { AssistantWorkspaceLayout, OpenChatTabs, SessionRail, SESSION_RAIL_EN, groupSessions, normalizeForSearch, relativeTime, type AssistantSession, type SessionGroup, type SessionRailIcons, type SessionRailLabels } from "./sessions";
7
7
  export { BRIDGE_TONE, BridgeNotice, ENGINE_PICKER_EN, EnginePanel, EnginePicker, engineChipName, useEnginePicker, type BridgeSetup, type BridgeState, type BridgeStatus, type Choice, type EngineChoice, type EnginePickerLabels, type EnginePickerProps, type EnginePickerTab } from "./engine";
8
8
  // 0.29.0: the chat BODY as components (the surface hands in messages and actions), its markdown, and each engine's mark.
9
- export { AssistantChat, ChatAttach, ChatBubble, ChatComposer, ChatError, ChatLabelsProvider, ChatMarkdown, ChatMessage, ChatMeta, ChatNote, ChatPending, ChatStarters, ChatSteps, ChatThread, CHAT_EN, PaperclipIcon, useComposerDensity, useFullChromeRoom, type AssistantChatProps, type ChatComposerProps, type ChatFix, type ChatLabels, type ChatMarkdownProps, type ChatMessageData, type ChatStarter, type ChatStep, type ComposerDensity } from "./chat";
9
+ export { AssistantChat, ChatAttach, ChatBubble, ChatComposer, ChatError, ChatLabelsProvider, ChatMarkdown, ChatMessage, ChatMeta, ChatNote, ChatPending, ChatStarters, ChatSteps, ChatThread, CHAT_EN, PaperclipIcon, firstBlank, selectBlank, useComposerDensity, useFullChromeRoom, type AssistantChatProps, type ChatComposerProps, type ChatFix, type ChatLabels, type ChatMarkdownProps, type ChatMessageData, type ChatStarter, type ChatStep, type ComposerDensity } from "./chat";
10
10
  export { bareUrl, CODE_FOLD_LINES, FLEET_IMAGE_HOSTS, imageSource, linkTarget, parseBlocks, parseInline, type Block, type ImageHost, type Inline, type InlineOptions } from "./chat-markdown";
11
11
  export { ENGINE_MARK_ART, ENGINE_MARK_FILL_RULE, EngineMark, isEngineMarkId, type EngineMarkArt, type EngineMarkId } from "./engine-mark";
12
12
  export { atBridge, BRIDGE_GONE, bridgeTurnError, PAIRING_REJECTED, useChatTurns, type ChatTurns, type TurnError } from "./chat-turns";
@@ -278,7 +278,8 @@ export function SessionRail({
278
278
  {s.pinned && <I.pinFilled className="gemboss-assistant-pin-dot" />}
279
279
  <span className="gemboss-assistant-thread-title">{s.title}</span>
280
280
  </span>
281
- <span className="gemboss-assistant-thread-meta">{relativeTime(s.updatedAt, L)}</span>
281
+ {/* When, then how it ended (the surface's `preview`, its closing line; learned from Replo, 23/10/2026): one line, cut with "…". */}
282
+ <span className="gemboss-assistant-thread-meta">{relativeTime(s.updatedAt, L)}{s.preview ? ` · ${s.preview}` : ""}</span>
282
283
  </button>
283
284
  <div className="gemboss-assistant-thread-actions">
284
285
  <button
@@ -1 +1 @@
1
- .gb-chat{display:flex;flex-direction:column;min-width:0;min-height:0;height:100%;background:var(--gemboss-surface, #fff)}.gemboss-assistant-layout:not(.is-dock) .gb-chat{background:transparent}.gb-chat>.gemboss-ec-scroll{flex:1 1 auto}.gb-dock:not(.gb-dock-full) .gb-chat-head{display:none}.gb-chat-head{flex:none;box-sizing:border-box;justify-content:center}.gb-chat[data-chrome]>.gb-chat-head{padding-right:var(--gb-chat-chrome-w);min-height:var(--gb-chat-chrome-h)}.gb-chat[data-chrome]:not(:has(>.gb-chat-head))>.gemboss-ec-scroll{padding-top:var(--gb-chat-chrome-h)}.gemboss-ec-starter.gb-chat-starter{white-space:normal;border-radius:12px;text-align:left;overflow-wrap:anywhere}.gb-chat-starter-hint{display:block;margin-bottom:4px;color:var(--gemboss-text-muted);font-size:var(--gemboss-fs-caption, 12px)}.gb-chat-label{margin:0;color:var(--gemboss-text-muted);font-size:var(--gemboss-fs-caption, 12px)}.gb-chat-target{color:var(--gemboss-text-muted)}.gb-chat-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;color:var(--gemboss-text-muted);font-size:var(--gemboss-fs-caption, 12px)}.gb-chat-copy{flex:none}.gb-chat-note{margin:0;align-self:center;text-align:center;color:var(--gemboss-text-muted);font-size:var(--gemboss-fs-caption, 12px)}.gb-chat-notice{margin:0}.gb-chat-error{display:grid;gap:8px;margin:0;overflow-wrap:anywhere}.gb-chat-cmd{display:block;padding:6px 8px;border-radius:8px;background:#0000000d;color:var(--gemboss-text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:16px;overflow-wrap:anywhere;user-select:all}.gb-chat-original>summary{cursor:pointer;min-height:24px;display:flex;align-items:center}.gemboss-ec-input .gemboss-ec-attach-btn{flex:0 0 auto;width:44px;height:44px;border-radius:50%;padding:0;display:inline-flex;align-items:center;justify-content:center;border:0;background-color:transparent;color:var(--gemboss-text-muted);cursor:pointer}.gemboss-ec-input .gemboss-ec-attach-btn:hover:not(:disabled){background-color:var(--gemboss-hover, rgba(0, 0, 0, .05));color:var(--gemboss-text)}.gemboss-ec-input .gemboss-ec-attach-btn:focus-visible{outline:2px solid var(--ui-focus, #5661f5);outline-offset:2px}.gemboss-ec-input .gemboss-ec-attach-btn:disabled{opacity:.5;cursor:default}.gemboss-ec-input .gemboss-ec-attach-btn svg{width:24px;height:24px}@media (pointer: fine){.gemboss-ec-input .gb-engine-chip{position:relative}.gemboss-ec-input .gb-engine-chip:after{content:"";position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);height:44px;z-index:1}}@media (pointer: coarse),(max-width: 47.9975em){.gb-chat-original>summary{min-height:44px}}@media (max-width: 560px){.gb-dock-fullchrome .gb-dock-shrink:not(:has(svg)){padding:0 12px;width:auto}.gb-dock-fullchrome .gb-dock-shrink:not(:has(svg)) span{position:static;width:auto;height:auto;overflow:visible;clip:auto}}
1
+ .gb-chat{display:flex;flex-direction:column;min-width:0;min-height:0;height:100%;background:var(--gemboss-surface, #fff)}.gemboss-assistant-layout:not(.is-dock) .gb-chat{background:transparent}.gb-chat>.gemboss-ec-scroll{flex:1 1 auto}.gb-dock:not(.gb-dock-full) .gb-chat-head{display:none}.gb-chat-head{flex:none;box-sizing:border-box;justify-content:center}.gb-chat[data-chrome]>.gb-chat-head{padding-right:var(--gb-chat-chrome-w);min-height:var(--gb-chat-chrome-h)}.gb-chat[data-chrome]:not(:has(>.gb-chat-head))>.gemboss-ec-scroll{padding-top:var(--gb-chat-chrome-h)}.gemboss-ec-starter.gb-chat-starter{white-space:normal;border-radius:12px;text-align:left;overflow-wrap:anywhere}.gb-chat-starter-hint{display:block;margin-bottom:4px;color:var(--gemboss-text-muted);font-size:var(--gemboss-fs-caption, 12px)}.gemboss-ec-starters.gb-chat-starters-cards{flex-direction:column;flex-wrap:nowrap;row-gap:8px}.gb-chat-starters-cards .gb-chat-starter{display:flex;align-items:center;gap:12px;padding:12px 16px}.gb-chat-starter-icon{flex:none;width:32px;height:32px;border-radius:var(--gemboss-radius-md, 8px);display:grid;place-items:center;background:var(--gemboss-accent-soft, #eef0fe);color:var(--gemboss-accent, #5661f5)}.gb-chat-starter-icon svg{width:20px;height:20px;fill:currentColor}.gb-chat-starter-body{display:flex;flex-direction:column;gap:2px;min-width:0}.gb-chat-starter-label{font-weight:600}.gb-chat-starter-sub{color:var(--gemboss-text-muted);font-size:var(--gemboss-fs-caption, 12px)}.gb-chat-label{margin:0;color:var(--gemboss-text-muted);font-size:var(--gemboss-fs-caption, 12px)}.gb-chat-target{color:var(--gemboss-text-muted)}.gb-chat-meta{display:flex;flex-wrap:wrap;align-items:center;gap:8px;color:var(--gemboss-text-muted);font-size:var(--gemboss-fs-caption, 12px)}.gb-chat-copy{flex:none}.gb-chat-note{margin:0;align-self:center;text-align:center;color:var(--gemboss-text-muted);font-size:var(--gemboss-fs-caption, 12px)}.gb-chat-notice{margin:0}.gb-chat-error{display:grid;gap:8px;margin:0;overflow-wrap:anywhere}.gb-chat-cmd{display:block;padding:6px 8px;border-radius:8px;background:#0000000d;color:var(--gemboss-text);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:16px;overflow-wrap:anywhere;user-select:all}.gb-chat-original>summary{cursor:pointer;min-height:24px;display:flex;align-items:center}.gemboss-ec-input .gemboss-ec-attach-btn{flex:0 0 auto;width:44px;height:44px;border-radius:50%;padding:0;display:inline-flex;align-items:center;justify-content:center;border:0;background-color:transparent;color:var(--gemboss-text-muted);cursor:pointer}.gemboss-ec-input .gemboss-ec-attach-btn:hover:not(:disabled){background-color:var(--gemboss-hover, rgba(0, 0, 0, .05));color:var(--gemboss-text)}.gemboss-ec-input .gemboss-ec-attach-btn:focus-visible{outline:2px solid var(--ui-focus, #5661f5);outline-offset:2px}.gemboss-ec-input .gemboss-ec-attach-btn:disabled{opacity:.5;cursor:default}.gemboss-ec-input .gemboss-ec-attach-btn svg{width:24px;height:24px}@media (pointer: fine){.gemboss-ec-input .gb-engine-chip{position:relative}.gemboss-ec-input .gb-engine-chip:after{content:"";position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);height:44px;z-index:1}}@media (pointer: coarse),(max-width: 47.9975em){.gb-chat-original>summary{min-height:44px}}@media (max-width: 560px){.gb-dock-fullchrome .gb-dock-shrink:not(:has(svg)){padding:0 12px;width:auto}.gb-dock-fullchrome .gb-dock-shrink:not(:has(svg)) span{position:static;width:auto;height:auto;overflow:visible;clip:auto}}.gemboss-ec-decide{display:flex;flex-direction:column;gap:8px;margin:0 12px;padding:12px;border:1px solid var(--gemboss-divider);border-radius:16px;background:var(--gemboss-surface);box-shadow:var(--gemboss-shadow-raised, 0 4px 16px rgba(31, 30, 29, .1))}.gemboss-ec-decide-label{font-size:var(--gemboss-fs-caption, 12px);font-weight:600;color:var(--gemboss-warning, #9a6700)}.gemboss-ec-decide+.gemboss-ec-input{margin-top:8px}
package/src/assistant.css CHANGED
@@ -1 +1 @@
1
- .gb-dock{position:fixed;z-index:320;right:24px;bottom:0;width:min(460px,calc(100vw - 288px));display:flex;flex-direction:column;min-height:0;background:var(--gemboss-surface);background:color-mix(in srgb,var(--gemboss-surface) 93%,transparent);-webkit-backdrop-filter:blur(14px) saturate(1.4);backdrop-filter:blur(14px) saturate(1.4);border:1px solid var(--gemboss-divider);border-bottom:0;border-radius:12px 12px 0 0;box-shadow:0 -2px 6px #0f172a0d,0 24px 64px #0f172a2e;overflow:hidden;transition:transform .14s cubic-bezier(.2,.8,.3,1),opacity .14s ease-out}@starting-style{.gb-dock-dock,.gb-dock-mini{transform:translateY(10px);opacity:0}.gb-dock-side{transform:translate(12px);opacity:0}}.gb-dock-dragging,.gb-dock-dragging *{transition:none!important}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){.gb-dock{background:var(--gemboss-surface)}}@media (prefers-reduced-motion: reduce){.gb-dock{transition:none}}.gb-dock-hidden{display:none}.gb-dock-full{z-index:4;inset:56px 0 0 240px;width:auto;border:0;border-radius:0;box-shadow:none;background:var(--gemboss-app-bg);-webkit-backdrop-filter:none;backdrop-filter:none}.gb-dock-side{z-index:290;top:56px;right:0;bottom:0;width:var(--gb-dock-side-w, 400px);background:var(--gemboss-surface);-webkit-backdrop-filter:none;backdrop-filter:none;border:0;border-left:1px solid var(--gemboss-divider);border-radius:0;box-shadow:none;overflow:visible}.gb-dock-side .gb-dock-body,.gb-dock-side .gb-dock-pane{overflow:hidden}.gb-dock-side .gb-dock-header{cursor:default;touch-action:auto}.gb-dock-side .gb-dock-status{flex:0 0 auto;position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.gb-dock-side .gb-dock-header:active{cursor:default}.gb-dock-side>.gb-dock-sidegrip{position:absolute;top:0;bottom:0;left:-3px;width:5px;z-index:3}@media (min-width: 1100px){body.gemboss-assistant-side .gemboss-platform-main{margin-right:var(--gb-assistant-side-w, 400px)}}.gb-dock-fullchrome{position:absolute;top:10px;right:16px;z-index:1;display:flex;gap:8px}.gb-dock-shrink{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;border:1px solid var(--gemboss-divider);border-radius:var(--gemboss-radius-full);background:var(--gemboss-surface);color:var(--gemboss-text-muted);font:inherit;font-size:var(--gemboss-fs-caption);cursor:pointer;white-space:nowrap}.gb-dock-shrink:hover{background:var(--gemboss-hover);color:var(--gemboss-text)}.gb-dock-shrink:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gb-dock-shrink svg{width:16px;height:16px;flex:0 0 auto}@media (max-width: 560px){.gb-dock-shrink span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.gb-dock-shrink{padding:0;width:44px;justify-content:center}.gb-dock-shrink-keep span{position:static;width:auto;height:auto;overflow:visible;clip:auto}.gb-dock-shrink-keep{padding:0 12px;width:auto}.gb-dock-fullchrome{position:static;justify-content:flex-end;padding:8px 12px 0}.gb-dock-full .gemboss-assistant-layout>.gemboss-assistant-rail{position:absolute;top:8px;left:12px;z-index:1;width:auto;flex:none;padding:0;border:0}.gb-dock-full .gemboss-assistant-layout>.gemboss-assistant-rail .gemboss-assistant-newchat{width:44px;min-height:44px;padding:0;border-radius:var(--gemboss-radius-full)}}.gb-dock-mini{height:auto;width:min(320px,calc(100vw - 288px));-webkit-backdrop-filter:blur(14px) saturate(1.4);backdrop-filter:blur(14px) saturate(1.4);border-radius:12px 12px 0 0}.gb-dock-mini .gb-dock-body{display:none}.gb-dock-minirow{display:flex;align-items:center;padding-right:4px}.gb-dock-minirow .gb-dock-minibar{flex:1 1 auto;min-width:0}.gb-dock-minirow .gb-dock-icon{flex:0 0 auto}.gb-dock-minibar{display:flex;align-items:center;gap:8px;width:100%;min-height:48px;padding:0 12px;border:0;background:transparent;font:inherit;color:var(--gemboss-text-strong);cursor:pointer;text-align:left}.gb-dock-minibar:hover{background:var(--gemboss-hover)}.gb-dock-minibar strong{font-size:13px;font-weight:600;flex:0 0 auto}.gb-dock-ministatus{flex:1 1 auto;min-width:0;font-size:12px;color:var(--gemboss-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gb-dock-minichevron{font-size:10px;color:var(--gemboss-text-muted)}.gb-dock-grip{position:absolute;top:0;left:0;right:0;height:14px;z-index:2;display:grid;place-items:center;cursor:ns-resize;touch-action:none;background:transparent}.gb-dock-grip>span{display:block;width:44px;height:4px;border-radius:2px;background:var(--gemboss-divider)}.gb-dock-grip:hover>span,.gb-dock-grip:focus-visible>span{background:var(--gemboss-text-muted)}.gb-dock-grip:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:-2px}.gb-dock-header{flex:0 0 auto;cursor:grab;touch-action:none;user-select:none;display:flex;align-items:center;gap:8px;padding:0 4px 0 16px;min-height:48px;border-bottom:1px solid var(--gemboss-divider);background:transparent}.gb-dock-title{font-size:13px;font-weight:600;color:var(--gemboss-text-strong);white-space:nowrap;flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}.gb-dock-status{flex:1 1 auto;min-width:0;font-size:12px;color:var(--gemboss-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gb-dock-header:active{cursor:grabbing}.gb-dock-actions{display:flex;align-items:center;gap:2px;cursor:default;margin-left:auto}.gb-dock-action{margin-right:8px}.gb-dock-menu{position:relative}.gb-dock-menu>summary{list-style:none}.gb-dock-menu>summary::-webkit-details-marker{display:none}.gb-dock-menu[open]>summary{color:var(--gemboss-text-strong);background:var(--gemboss-hover)}.gb-dock-menu-list{position:absolute;top:calc(100% + 4px);right:0;z-index:5;display:grid;min-width:220px;padding:6px;box-sizing:border-box;cursor:default}.gb-dock-menu-list>.ui-menu__item{border-radius:8px}.gb-dock-menu-list>.ui-menu__item:disabled{opacity:.5;cursor:not-allowed;background:transparent}.gb-dock-menu-sep{height:1px;margin:4px 0;border:0;background:var(--gemboss-divider)}.gb-dock-menu-pill{width:44px;padding:0;justify-content:center}.gb-dock-menu-pill svg{width:18px;height:18px}.gb-dock-icon{width:44px;height:44px;display:grid;place-items:center;border:0;border-radius:8px;background:transparent;color:var(--gemboss-text-muted);cursor:pointer;padding:0}.gb-dock-icon:hover{background:var(--gemboss-hover);color:var(--gemboss-text-strong)}.gb-dock-icon:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:-2px}.gb-dock-icon svg{width:18px;height:18px}.gb-dock-icon-on{color:var(--gemboss-active-fg);background:var(--gemboss-active-bg)}.gb-dock-dot{flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--gemboss-divider)}.gb-dock-dot-busy{background:var(--gemboss-primary);animation:gb-dock-pulse 1.4s ease-in-out infinite}.gb-dock-dot-unread{background:var(--gemboss-success-strong)}@keyframes gb-dock-pulse{0%,to{opacity:1}50%{opacity:.35}}@media (prefers-reduced-motion: reduce){.gb-dock-dot-busy{animation:none}}.gb-dock-tabs{flex:0 0 auto;display:flex;gap:4px;padding:0 8px;border-bottom:1px solid var(--gemboss-divider)}.gb-dock-tab{position:relative;display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--gemboss-text-muted);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap}.gb-dock-tab:hover{color:var(--gemboss-text-strong)}.gb-dock-tab[aria-selected=true]{color:var(--gemboss-text-strong);font-weight:600;border-bottom-color:var(--gemboss-primary)}.gb-dock-tab:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:-2px}.gb-dock-badge{min-width:18px;padding:0 6px;border-radius:var(--gemboss-radius-full);background:var(--gemboss-primary);color:var(--gemboss-on-primary, #fff);font-size:11px;font-weight:700;line-height:18px;text-align:center}.gb-dock-body{flex:1 1 auto;min-height:0;display:flex;min-width:0}.gb-dock-body>*{flex:1 1 auto;min-width:0;min-height:0}.gb-dock-pane{display:flex;min-width:0;min-height:0}.gb-dock-pane>*{flex:1 1 auto;min-width:0;min-height:0}.gb-dock-body .gemboss-assistant-layout,.gb-dock-body .gemboss-assistant-page{height:auto;min-height:0}.gb-dock-pane[hidden]{display:none}.gb-dock-booting{flex:1 1 auto;display:grid;place-items:center;padding:24px;color:var(--gemboss-text-muted);font-size:14px}.gb-dock-sr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}@media (max-width: 420px){.gb-dock-status{display:none}}@media (max-width: 760px){.gb-dock{right:8px;left:8px;width:auto;padding-bottom:env(safe-area-inset-bottom);border-radius:12px 12px 0 0}.gb-dock-mini{width:auto}.gb-dock-full{inset:56px 0 0;border-radius:0}.gb-dock-side{left:0;right:0;width:auto;border-left:0;border-radius:0}.gb-dock-sidegrip,.gb-dock-pinside{display:none}.gb-dock-menu-list>.gb-dock-pinside{display:none}}@media (min-width: 761px) and (max-width: 1099.98px){.gb-dock-side{left:240px;width:auto}.gb-dock-side .gb-dock-sidegrip,.gb-dock-pinside{display:none}.gb-dock-menu-list>.gb-dock-pinside{display:none}}.gb-assistant-launcher{display:inline-flex;align-items:center;gap:8px;border:0;cursor:pointer;font-family:var(--gemboss-font-sans, system-ui, sans-serif)}.gb-assistant-launcher svg{flex:0 0 auto}.gb-assistant-launcher:focus-visible{outline:2px solid var(--gemboss-accent, #5661f5);outline-offset:2px}.gb-assistant-launcher--rail{width:100%;min-height:44px;margin:8px 0 4px;padding:0 12px;border-radius:var(--gemboss-radius-md, 8px);background:var(--gemboss-accent-soft);color:var(--gemboss-accent-strong);font-size:13px;font-weight:600;line-height:1;text-align:left}.gb-assistant-launcher--rail:hover{background:color-mix(in srgb,var(--gemboss-accent) 16%,var(--gemboss-surface))}.gb-assistant-launcher--rail .gb-assistant-launcher-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gb-assistant-launcher-kbd{font:inherit;font-size:11px;opacity:.7;border:1px solid currentColor;border-radius:5px;padding:1px 5px}.gb-assistant-launcher--topbar{display:none;position:relative;justify-content:center;flex:0 0 auto;width:44px;height:44px;padding:0;border-radius:var(--gemboss-radius-md, 8px);background:transparent;color:var(--gemboss-text, #1b1c1e)}.gb-assistant-launcher--topbar:hover,.gb-assistant-launcher--topbar:active{background:var(--gemboss-hover, #eceef2)}.gb-assistant-launcher--topbar .gb-assistant-launcher-label,.gb-assistant-launcher--topbar .gb-assistant-launcher-kbd{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@media (max-width: 760px){.gb-assistant-launcher--rail{display:none}.gb-assistant-launcher--topbar{display:inline-flex}}
1
+ .gb-dock{position:fixed;z-index:320;right:24px;bottom:0;width:min(460px,calc(100vw - 288px));display:flex;flex-direction:column;min-height:0;background:var(--gemboss-surface);background:color-mix(in srgb,var(--gemboss-surface) 93%,transparent);-webkit-backdrop-filter:blur(14px) saturate(1.4);backdrop-filter:blur(14px) saturate(1.4);border:1px solid var(--gemboss-divider);border-bottom:0;border-radius:12px 12px 0 0;box-shadow:0 -2px 6px #0f172a0d,0 24px 64px #0f172a2e;overflow:hidden;transition:transform .14s cubic-bezier(.2,.8,.3,1),opacity .14s ease-out}@starting-style{.gb-dock-dock,.gb-dock-mini{transform:translateY(10px);opacity:0}.gb-dock-side{transform:translate(12px);opacity:0}}.gb-dock-dragging,.gb-dock-dragging *{transition:none!important}@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))){.gb-dock{background:var(--gemboss-surface)}}@media (prefers-reduced-motion: reduce){.gb-dock{transition:none}}.gb-dock-hidden{display:none}.gb-dock-full{z-index:4;inset:56px 0 0 240px;width:auto;border:0;border-radius:0;box-shadow:none;background:var(--gemboss-app-bg);-webkit-backdrop-filter:none;backdrop-filter:none}.gb-dock-side{z-index:290;top:56px;right:0;bottom:0;width:var(--gb-dock-side-w, 400px);background:var(--gemboss-surface);-webkit-backdrop-filter:none;backdrop-filter:none;border:0;border-left:1px solid var(--gemboss-divider);border-radius:0;box-shadow:none;overflow:visible}.gb-dock-side .gb-dock-body,.gb-dock-side .gb-dock-pane{overflow:hidden}.gb-dock-side .gb-dock-header{cursor:default;touch-action:auto}.gb-dock-side .gb-dock-status{flex:0 0 auto;position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}.gb-dock-side .gb-dock-header:active{cursor:default}.gb-dock-side>.gb-dock-sidegrip{position:absolute;top:0;bottom:0;left:-3px;width:5px;z-index:3}@media (min-width: 1100px){body.gemboss-assistant-side .gemboss-platform-main{margin-right:var(--gb-assistant-side-w, 400px)}}.gb-dock-fullchrome{position:absolute;top:10px;right:16px;z-index:1;display:flex;gap:8px}.gb-dock-shrink{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;border:1px solid var(--gemboss-divider);border-radius:var(--gemboss-radius-full);background:var(--gemboss-surface);color:var(--gemboss-text-muted);font:inherit;font-size:var(--gemboss-fs-caption);cursor:pointer;white-space:nowrap}.gb-dock-shrink:hover{background:var(--gemboss-hover);color:var(--gemboss-text)}.gb-dock-shrink:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gb-dock-shrink svg{width:16px;height:16px;flex:0 0 auto}@media (max-width: 560px){.gb-dock-shrink span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.gb-dock-shrink{padding:0;width:44px;justify-content:center}.gb-dock-shrink-keep span{position:static;width:auto;height:auto;overflow:visible;clip:auto}.gb-dock-shrink-keep{padding:0 12px;width:auto}.gb-dock-fullchrome{position:static;justify-content:flex-end;padding:8px 12px 0}.gb-dock-full .gemboss-assistant-layout>.gemboss-assistant-rail{position:absolute;top:8px;left:12px;z-index:1;width:auto;flex:none;padding:0;border:0}.gb-dock-full .gemboss-assistant-layout>.gemboss-assistant-rail .gemboss-assistant-newchat{width:44px;min-height:44px;padding:0;border-radius:var(--gemboss-radius-full)}}.gb-dock-mini{height:auto;width:min(320px,calc(100vw - 288px));-webkit-backdrop-filter:blur(14px) saturate(1.4);backdrop-filter:blur(14px) saturate(1.4);border-radius:12px 12px 0 0}.gb-dock-mini .gb-dock-body{display:none}.gb-dock-minirow{display:flex;align-items:center;padding-right:4px}.gb-dock-minirow .gb-dock-minibar{flex:1 1 auto;min-width:0}.gb-dock-minirow .gb-dock-icon{flex:0 0 auto}.gb-dock-minibar{display:flex;align-items:center;gap:8px;width:100%;min-height:48px;padding:0 12px;border:0;background:transparent;font:inherit;color:var(--gemboss-text-strong);cursor:pointer;text-align:left}.gb-dock-minibar:hover{background:var(--gemboss-hover)}.gb-dock-minibar strong{font-size:13px;font-weight:600;flex:0 0 auto}.gb-dock-ministatus{flex:1 1 auto;min-width:0;font-size:12px;color:var(--gemboss-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gb-dock-minichevron{font-size:10px;color:var(--gemboss-text-muted)}.gb-dock-grip{position:absolute;top:0;left:0;right:0;height:14px;z-index:2;display:grid;place-items:center;cursor:ns-resize;touch-action:none;background:transparent}.gb-dock-grip>span{display:block;width:44px;height:4px;border-radius:2px;background:var(--gemboss-divider)}.gb-dock-grip:hover>span,.gb-dock-grip:focus-visible>span{background:var(--gemboss-text-muted)}.gb-dock-grip:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:-2px}.gb-dock-header{flex:0 0 auto;cursor:grab;touch-action:none;user-select:none;display:flex;align-items:center;gap:8px;padding:0 4px 0 16px;min-height:48px;border-bottom:1px solid var(--gemboss-divider);background:transparent}.gb-dock-title{font-size:13px;font-weight:600;color:var(--gemboss-text-strong);white-space:nowrap;flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis}.gb-dock-status{flex:1 1 auto;min-width:0;font-size:12px;color:var(--gemboss-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gb-dock-header:active{cursor:grabbing}.gb-dock-actions{display:flex;align-items:center;gap:2px;cursor:default;margin-left:auto}.gb-dock-action{margin-right:8px}.gb-dock-menu{position:relative}.gb-dock-menu>summary{list-style:none}.gb-dock-menu>summary::-webkit-details-marker{display:none}.gb-dock-menu[open]>summary{color:var(--gemboss-text-strong);background:var(--gemboss-hover)}.gb-dock-menu-list{position:absolute;top:calc(100% + 4px);right:0;z-index:5;display:grid;min-width:220px;padding:6px;box-sizing:border-box;cursor:default}.gb-dock-menu-list>.ui-menu__item{border-radius:8px}.gb-dock-menu-list>.ui-menu__item:disabled{opacity:.5;cursor:not-allowed;background:transparent}.gb-dock-menu-sep{height:1px;margin:4px 0;border:0;background:var(--gemboss-divider)}.gb-dock-menu-pill{width:44px;padding:0;justify-content:center}.gb-dock-menu-pill svg{width:18px;height:18px}.gb-dock-icon{width:44px;height:44px;display:grid;place-items:center;border:0;border-radius:8px;background:transparent;color:var(--gemboss-text-muted);cursor:pointer;padding:0}.gb-dock-icon:hover{background:var(--gemboss-hover);color:var(--gemboss-text-strong)}.gb-dock-icon:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:-2px}.gb-dock-icon svg{width:18px;height:18px}.gb-dock-icon-on{color:var(--gemboss-active-fg);background:var(--gemboss-active-bg)}.gb-dock-dot{flex:0 0 auto;width:8px;height:8px;border-radius:50%;background:var(--gemboss-divider)}.gb-dock-dot-busy{background:var(--gemboss-primary);animation:gb-dock-pulse 1.4s ease-in-out infinite}.gb-dock-dot-unread{background:var(--gemboss-success-strong)}@keyframes gb-dock-pulse{0%,to{opacity:1}50%{opacity:.35}}@media (prefers-reduced-motion: reduce){.gb-dock-dot-busy{animation:none}}.gb-dock-tabs{flex:0 0 auto;display:flex;gap:4px;padding:0 8px;border-bottom:1px solid var(--gemboss-divider)}.gb-dock-tab{position:relative;display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 12px;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--gemboss-text-muted);font:inherit;font-size:13px;cursor:pointer;white-space:nowrap}.gb-dock-tab:hover{color:var(--gemboss-text-strong)}.gb-dock-tab[aria-selected=true]{color:var(--gemboss-text-strong);font-weight:600;border-bottom-color:var(--gemboss-primary)}.gb-dock-tab:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:-2px}.gb-dock-badge{min-width:18px;padding:0 6px;border-radius:var(--gemboss-radius-full);background:var(--gemboss-primary);color:var(--gemboss-on-primary, #fff);font-size:11px;font-weight:700;line-height:18px;text-align:center}.gb-dock-body{flex:1 1 auto;min-height:0;display:flex;min-width:0}.gb-dock-body>*{flex:1 1 auto;min-width:0;min-height:0}.gb-dock-pane{display:flex;min-width:0;min-height:0}.gb-dock-pane>*{flex:1 1 auto;min-width:0;min-height:0}.gb-dock-body .gemboss-assistant-layout,.gb-dock-body .gemboss-assistant-page{height:auto;min-height:0}.gb-dock-pane[hidden]{display:none}.gb-dock-booting{flex:1 1 auto;display:grid;place-items:center;padding:24px;color:var(--gemboss-text-muted);font-size:14px}.gb-dock-sr{position:absolute;left:0;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}@media (max-width: 420px){.gb-dock-status{display:none}}@media (max-width: 760px){.gb-dock{right:8px;left:8px;width:auto;padding-bottom:env(safe-area-inset-bottom);border-radius:12px 12px 0 0}.gb-dock-mini{width:auto}.gb-dock-full{inset:56px 0 0;border-radius:0}.gb-dock-side{left:0;right:0;width:auto;border-left:0;border-radius:0}.gb-dock-sidegrip,.gb-dock-pinside{display:none}.gb-dock-menu-list>.gb-dock-pinside{display:none}}@media (min-width: 761px) and (max-width: 1099.98px){.gb-dock-side{left:240px;width:auto}.gb-dock-side .gb-dock-sidegrip,.gb-dock-pinside{display:none}.gb-dock-menu-list>.gb-dock-pinside{display:none}}.gb-assistant-launcher{display:inline-flex;align-items:center;gap:8px;border:0;cursor:pointer;font-family:var(--gemboss-font-sans, system-ui, sans-serif)}.gb-assistant-launcher svg{flex:0 0 auto}.gb-assistant-launcher:focus-visible{outline:2px solid var(--gemboss-accent, #5661f5);outline-offset:2px}.gb-assistant-launcher--rail{width:100%;min-height:44px;margin:8px 0 4px;padding:0 12px;border-radius:var(--gemboss-radius-md, 8px);background:var(--gemboss-accent-soft);color:var(--gemboss-accent-strong);font-size:13px;font-weight:600;line-height:1;text-align:left}.gb-assistant-launcher--rail:hover{background:color-mix(in srgb,var(--gemboss-accent) 16%,var(--gemboss-surface))}.gb-assistant-launcher--rail .gb-assistant-launcher-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gb-assistant-launcher-kbd{font:inherit;font-size:11px;opacity:.7;border:1px solid currentColor;border-radius:5px;padding:1px 5px}.gb-assistant-launcher--topbar{display:none;position:relative;justify-content:center;flex:0 0 auto;width:44px;height:44px;padding:0;border-radius:var(--gemboss-radius-md, 8px);background:transparent;color:var(--gemboss-text, #1b1c1e)}.gb-assistant-launcher--topbar:hover,.gb-assistant-launcher--topbar:active{background:var(--gemboss-hover, #eceef2)}.gb-assistant-launcher--topbar .gb-assistant-launcher-label,.gb-assistant-launcher--topbar .gb-assistant-launcher-kbd{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@media (max-width: 760px){.gb-assistant-launcher--rail{display:none}.gb-assistant-launcher--topbar{display:inline-flex}}
@@ -0,0 +1 @@
1
+ (function(o){"use strict";var p=o.gembossUI||(o.gembossUI={}),S='<svg width="18" height="18" viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false"><path d="M1.5 10S4.6 4.5 10 4.5 18.5 10 18.5 10 15.4 15.5 10 15.5 1.5 10 1.5 10Z"/><circle cx="10" cy="10" r="2.6"/></svg>',E="Couldn't reach the server. Check your connection and try again.",h=0;function q(){var f=0,w=!1;return document.querySelectorAll("form[data-gb-signin]").forEach(function(t){if(t.getAttribute("data-gb-ready"))return;t.setAttribute("data-gb-ready","1");var n="gb-signin"+(h?"-"+h:""),y=t.getAttribute("data-sso");if(h++,f++,t.getAttribute("method")||(t.method="post"),y&&!(t.previousElementSibling&&t.previousElementSibling.classList.contains("gb-auth-sso")))if(!p.initContinueWithGemBoss)o.console&&o.console.error("auth-signin-plain.js: data-sso needs auth-sso-plain.js loaded first");else{var m=document.createElement("div"),u=document.createElement("a");m.className="gb-auth-sso",u.className="gb-auth-sso-btn",u.setAttribute("data-gb-sso",y),u.setAttribute("data-next",t.getAttribute("data-next")||"/"),t.getAttribute("data-issuer")&&u.setAttribute("data-issuer",t.getAttribute("data-issuer")),m.append(u),t.before(m),w=!0}t.classList.add("gb-auth-form"),t.innerHTML='<div class="gb-auth-field"><label for="'+n+'-email">Email</label><input class="gb-auth-input" id="'+n+'-email" type="email" name="email" autocomplete="username" required></div><div class="gb-auth-field"><label for="'+n+'-password">Password</label><div class="gb-auth-pw"><input class="gb-auth-input" id="'+n+'-password" type="password" name="password" autocomplete="current-password" required><button type="button" aria-controls="'+n+'-password" aria-label="Show password" title="Show password" data-label-show="Show password" data-label-hide="Hide password" class="gb-auth-pw-toggle">'+S+'</button></div></div><div id="'+n+'-error"></div><button type="submit" class="gb-auth-submit">Sign in</button>';var l=t.querySelector('input[name="email"]'),d=t.querySelector('input[name="password"]'),c=t.querySelector(".gb-auth-pw-toggle"),A=t.querySelector("#"+n+"-error"),v=t.querySelector(".gb-auth-submit");function g(a,e){if(A.textContent="",[l,d].forEach(function(r){r.removeAttribute("aria-invalid"),r.removeAttribute("aria-describedby")}),!!a){var i=document.createElement("div");i.className="gb-auth-error",i.setAttribute("role","alert"),i.textContent=a,A.append(i),[l,d].forEach(function(r){e&&r.setAttribute("aria-invalid","true"),r.setAttribute("aria-describedby",n+"-error")})}}function b(a){v.disabled=a,v.textContent=a?"Signing in\u2026":"Sign in"}c.addEventListener("click",function(a){a.stopPropagation();var e=d.type==="password",i=c.getAttribute(e?"data-label-hide":"data-label-show");d.type=e?"text":"password",c.setAttribute("aria-label",i),c.setAttribute("title",i);var r=c.querySelector("svg"),s=r.querySelector('path[d="M3 17 17 3"]');e&&!s?(s=document.createElementNS("http://www.w3.org/2000/svg","path"),s.setAttribute("d","M3 17 17 3"),r.append(s)):!e&&s&&s.remove()}),g(t.getAttribute("data-error"),!0),o.addEventListener("pageshow",function(a){a.persisted&&b(!1)}),t.addEventListener("submit",function(a){if(l.value=l.value.trim(),t.getAttribute("data-submit")!=="json"){b(!0);return}a.preventDefault(),!v.disabled&&(b(!0),g(""),fetch(t.action,{method:"POST",credentials:"same-origin",headers:{"content-type":"application/json"},body:JSON.stringify({email:l.value,password:d.value})}).then(function(e){if(e.redirected){location.assign(e.url);return}if(e.ok){location.assign(t.getAttribute("data-next")||"/");return}return e.json().catch(function(){return{}}).then(function(i){var r=[i.error,i.detail,i.message].filter(function(s){return typeof s=="string"&&s})[0];g(r||"Couldn't sign in (HTTP "+e.status+"). Try again.",e.status<500),b(!1)})}).catch(function(){g(E,!1),b(!1)}))})}),w&&p.initContinueWithGemBoss(),f}p.initSignIn=q})(typeof globalThis<"u"?globalThis:this);
@@ -1 +1 @@
1
- (function(i){"use strict";var g=i.gembossUI||(i.gembossUI={}),d="https://admin.gemboss.ai",l={not_member:"Your GemBoss account does not have access here. Use the password.",invalid:"That sign-in did not go through. Try again, or use the password.",off:"Signing in with GemBoss is not available here yet. Use the password."},f='<svg viewBox="0 0 32 32" width="18" height="18" aria-hidden="true" focusable="false"><rect width="32" height="32" rx="7"/><g transform="translate(16,16) scale(0.24) translate(-50,-62)"><polygon points="26,14 74,14 66,50 34,50" fill="#8a93ff"/><path d="M26,14 74,14 96,50 50,110 4,50Z" fill="none" stroke="#f4f4f2" stroke-width="5" stroke-linejoin="round"/><path d="M4,50H96M26,14 34,50M74,14 66,50M34,50 50,110M66,50 50,110" fill="none" stroke="#f4f4f2" stroke-opacity="0.72" stroke-width="3" stroke-linejoin="round"/></g></svg>';function b(){var s=document.querySelectorAll("a[data-gb-sso]");if(!s.length)return!1;var t=new URLSearchParams(location.search),h=t.get("sso"),c=!t.has("sso")&&t.get("password")!=="1"&&/(?:^|;\s*)gb_sso=1(?:;|$)/.test(document.cookie),o=null;return s.forEach(function(e){var m=(e.getAttribute("data-issuer")||d)+"/api/auth/sso/authorize?service="+encodeURIComponent(e.getAttribute("data-gb-sso"))+"&next="+encodeURIComponent(e.getAttribute("data-next")||"/");e.href=m,o=o||e,e.querySelector("svg")||(e.innerHTML=f+'<span class="gb-auth-sso-label">Continue with GemBoss</span>',e.querySelector("rect").style.fill="var(--gb-mark-bg, #0b0b0c)");var r=e.closest(".gb-auth-sso")||e.parentNode;if(h&&!r.querySelector(".gb-auth-sso-why")){var n=document.createElement("p");n.className="gb-auth-sso-why",n.setAttribute("role","status"),n.textContent=l[h]||l.invalid,e.after(n)}if(!r.querySelector(".gb-auth-or")){var a=document.createElement("p");a.className="gb-auth-or",a.textContent="or use the password",r.append(a)}e.addEventListener("click",function(){u(e)})}),c&&(u(o),location.replace(o.href)),c}function u(s){var t=s.querySelector(".gb-auth-sso-label");t&&(t.textContent="Continuing with GemBoss\u2026")}g.initContinueWithGemBoss=b})(typeof globalThis<"u"?globalThis:this);
1
+ (function(i){"use strict";var d=i.gembossUI||(i.gembossUI={}),g="https://admin.gemboss.ai",l={not_member:"Your GemBoss account is not a member here. Ask an admin to add your email.",invalid:"That sign-in did not go through. Try again, or use the password.",off:"Signing in with GemBoss is not available here yet. Use the password."},f='<svg viewBox="0 0 32 32" width="18" height="18" aria-hidden="true" focusable="false"><rect width="32" height="32" rx="7"/><g transform="translate(16,16) scale(0.24) translate(-50,-62)"><polygon points="26,14 74,14 66,50 34,50" fill="#8a93ff"/><path d="M26,14 74,14 96,50 50,110 4,50Z" fill="none" stroke="#f4f4f2" stroke-width="5" stroke-linejoin="round"/><path d="M4,50H96M26,14 34,50M74,14 66,50M34,50 50,110M66,50 50,110" fill="none" stroke="#f4f4f2" stroke-opacity="0.72" stroke-width="3" stroke-linejoin="round"/></g></svg>';function b(){var o=document.querySelectorAll("a[data-gb-sso]");if(!o.length)return!1;var t=new URLSearchParams(location.search),h=t.get("sso"),c=!t.has("sso")&&t.get("password")!=="1"&&/(?:^|;\s*)gb_sso=1(?:;|$)/.test(document.cookie),s=null;return o.forEach(function(e){if(!e.getAttribute("data-gb-sso-ready")){e.setAttribute("data-gb-sso-ready","1");var m=(e.getAttribute("data-issuer")||g)+"/api/auth/sso/authorize?service="+encodeURIComponent(e.getAttribute("data-gb-sso"))+"&next="+encodeURIComponent(e.getAttribute("data-next")||"/")+"&host="+encodeURIComponent(location.host);e.href=m,s=s||e,e.querySelector("svg")||(e.innerHTML=f+'<span class="gb-auth-sso-label">Continue with GemBoss</span>',e.querySelector("rect").style.fill="var(--gb-mark-bg, #0b0b0c)");var r=e.closest(".gb-auth-sso")||e.parentNode;if(h&&!r.querySelector(".gb-auth-sso-why")){var n=document.createElement("p");n.className="gb-auth-sso-why",n.setAttribute("role","status"),n.textContent=l[h]||l.invalid,e.after(n)}if(!r.querySelector(".gb-auth-or")){var a=document.createElement("p");a.className="gb-auth-or",a.textContent="or use the password",r.append(a)}e.addEventListener("click",function(){u(e)})}}),c&&s&&(u(s),location.replace(s.href)),c&&!!s}function u(o){var t=o.querySelector(".gb-auth-sso-label");t&&(t.textContent="Continuing with GemBoss\u2026")}d.initContinueWithGemBoss=b})(typeof globalThis<"u"?globalThis:this);
package/src/auth.tsx CHANGED
@@ -133,14 +133,19 @@ export function AuthLayout({ brand, tagline, mark, panel, backdrop = "facet", ar
133
133
  */
134
134
  export const GEMBOSS_ISSUER = "https://admin.gemboss.ai";
135
135
  const SSO_REASONS: Record<string, string> = {
136
- not_member: "Your GemBoss account does not have access here. Use the password.",
136
+ not_member: "Your GemBoss account is not a member here. Ask an admin to add your email.",
137
137
  invalid: "That sign-in did not go through. Try again, or use the password.",
138
138
  off: "Signing in with GemBoss is not available here yet. Use the password.",
139
139
  };
140
140
 
141
- /** The GemBoss door for one tool, with the path on the tool to come back to. */
142
- export function gemBossSignInUrl(service: string, next = "/", issuer = GEMBOSS_ISSUER): string {
143
- return `${issuer}/api/auth/sso/authorize?service=${encodeURIComponent(service)}&next=${encodeURIComponent(next)}`;
141
+ /**
142
+ * The GemBoss door for one tool, with the path on the tool to come back to, and the name the person is on (`host`):
143
+ * GemBoss sends the token to the tool's registered URL on that name, so the session lands where they are (a tool
144
+ * answers to a flat name and an .ops name). GemBoss only chooses among registered URLs with it.
145
+ */
146
+ export function gemBossSignInUrl(service: string, next = "/", issuer = GEMBOSS_ISSUER, host?: string): string {
147
+ return `${issuer}/api/auth/sso/authorize?service=${encodeURIComponent(service)}&next=${encodeURIComponent(next)}` +
148
+ (host ? `&host=${encodeURIComponent(host)}` : "");
144
149
  }
145
150
 
146
151
  /** Whether this visit should go to GemBoss without a click: the browser came in that way before, and nothing says stay. */
@@ -150,24 +155,29 @@ export function continuesByItself(cookie: string, search: string): boolean {
150
155
  return /(?:^|;\s*)gb_sso=1(?:;|$)/.test(cookie);
151
156
  }
152
157
 
153
- export function AuthContinueWithGemBoss({ service, next = "/", issuer = GEMBOSS_ISSUER }: {
158
+ export function AuthContinueWithGemBoss({ service, next = "/", issuer = GEMBOSS_ISSUER, host: givenHost }: {
154
159
  /** This tool's id in GemBoss's list of tools that redeem (FLEET_SSO_SERVICES). */
155
160
  service: string;
156
161
  /** Where on this tool to land afterwards: a path. */
157
162
  next?: string;
158
163
  issuer?: string;
164
+ /** The name this page is served on (the request's Host). A server-rendered page passes it, so a click made before
165
+ * React has loaded already carries it; without it the link gains it once mounted. */
166
+ host?: string;
159
167
  }) {
160
- const href = gemBossSignInUrl(service, next, issuer);
168
+ const [host, setHost] = useState<string | undefined>(givenHost);
169
+ const href = gemBossSignInUrl(service, next, issuer, host);
161
170
  const [going, setGoing] = useState(false);
162
171
  const [reason, setReason] = useState<string | null>(null);
163
172
  useEffect(() => {
173
+ setHost(window.location.host);
164
174
  const r = new URLSearchParams(window.location.search).get("sso");
165
175
  if (r) setReason(SSO_REASONS[r] ?? SSO_REASONS.invalid);
166
176
  if (continuesByItself(document.cookie, window.location.search)) {
167
177
  setGoing(true);
168
- window.location.replace(href);
178
+ window.location.replace(gemBossSignInUrl(service, next, issuer, window.location.host));
169
179
  }
170
- }, [href]);
180
+ }, [service, next, issuer]);
171
181
  return (
172
182
  <div className="gb-auth-sso">
173
183
  <a className="gb-auth-sso-btn" href={href} onClick={() => setGoing(true)}>
@@ -282,3 +292,90 @@ export function AuthFoot({ children }: { children?: React.ReactNode }) {
282
292
  export function AuthHelp({ children }: { children?: React.ReactNode }) {
283
293
  return <p className="gb-auth-help">{children}</p>;
284
294
  }
295
+
296
+ /** What the form says when the request never got an answer. */
297
+ export const SIGN_IN_OFFLINE = "Couldn't reach the server. Check your connection and try again.";
298
+
299
+ /**
300
+ * The whole sign-in form of a fleet tool (23/10/2026), the part every tool used to write itself: Continue with GemBoss,
301
+ * then Email, Password, the error and Sign in. Chris, 23/10/2026, seeing "Your lark email" on one form and other words on
302
+ * the next: "cái này chắc phải đưa vào gemboss ui". So the words, the fields and their order live here and nowhere else;
303
+ * a tool says which tool it is (`service`), where to land (`next`) and how to check the two values (`onSignIn`).
304
+ *
305
+ * `onSignIn` returns the sentence to show when it did not work (the server's own words, e.g. "The email or password is
306
+ * wrong."), or nothing once it has started moving the browser on: the button stays on "Signing in…" until the page goes,
307
+ * so a second press cannot send the password twice. It throwing reads as the network being down.
308
+ *
309
+ * Without `service` there is no GemBoss button: only for a tool that GemBoss does not sign into yet.
310
+ * Plain-HTML twin: `initSignIn()` in auth-signin-plain.js, same markup (auth-signin-browser.test.ts compares the two).
311
+ */
312
+ export function AuthSignIn({ service, next = "/", issuer = GEMBOSS_ISSUER, host, action, onSignIn, foot, idPrefix = "gb-signin" }: {
313
+ /** This tool's id in GemBoss's FLEET_SSO_SERVICES. */
314
+ service?: string;
315
+ /** The request's Host, from a server-rendered page: see AuthContinueWithGemBoss. */
316
+ host?: string;
317
+ /** Where the form posts if it is sent before React has loaded (a server-rendered page): the tool's sign-in route, which
318
+ * should answer a plain form post with a redirect. The form is always `method="post"`, so that early press never
319
+ * becomes a GET with the password in the URL. */
320
+ action?: string;
321
+ /** Where on this tool to land after GemBoss: a path. */
322
+ next?: string;
323
+ issuer?: string;
324
+ onSignIn: (credentials: { email: string; password: string }) => Promise<string | null | undefined | void>;
325
+ /** One line under the form, e.g. "Internal use only." */
326
+ foot?: React.ReactNode;
327
+ /** Prefix of the inputs' ids: only matters with two sign-in forms on one page. */
328
+ idPrefix?: string;
329
+ }) {
330
+ const [email, setEmail] = useState("");
331
+ const [password, setPassword] = useState("");
332
+ const [busy, setBusy] = useState(false);
333
+ const [error, setError] = useState<string | null>(null);
334
+ // The server refused what was typed: both fields are marked. A dropped network marks neither (nothing in them is wrong).
335
+ const [wrong, setWrong] = useState(false);
336
+ const errorId = `${idPrefix}-error`;
337
+
338
+ // Back to this page from the browser's memory after it moved on (bfcache keeps React's state): not still "Signing in…".
339
+ useEffect(() => {
340
+ const back = (e: PageTransitionEvent) => { if (e.persisted) setBusy(false); };
341
+ window.addEventListener("pageshow", back);
342
+ return () => window.removeEventListener("pageshow", back);
343
+ }, []);
344
+
345
+ async function submit(e: React.FormEvent<HTMLFormElement>) {
346
+ e.preventDefault();
347
+ if (busy) return;
348
+ setBusy(true);
349
+ setError(null);
350
+ let said: string | null | undefined | void;
351
+ let refused = true;
352
+ try {
353
+ said = await onSignIn({ email: email.trim(), password });
354
+ } catch {
355
+ said = SIGN_IN_OFFLINE;
356
+ refused = false;
357
+ }
358
+ if (said) {
359
+ setError(said);
360
+ setWrong(refused);
361
+ setBusy(false);
362
+ }
363
+ }
364
+
365
+ // Both fields point at the error once there is one: a screen reader that Tabs back into either hears why.
366
+ const described = error ? { ...(wrong ? { "aria-invalid": true as const } : {}), "aria-describedby": errorId } : {};
367
+ return (
368
+ <>
369
+ {service ? <AuthContinueWithGemBoss service={service} next={next} issuer={issuer} host={host} /> : null}
370
+ <AuthForm method="post" action={action} onSubmit={submit}>
371
+ <AuthField id={`${idPrefix}-email`} label="Email" type="email" name="email" autoComplete="username" required
372
+ value={email} onChange={(e) => setEmail(e.target.value)} {...described} />
373
+ <PasswordField id={`${idPrefix}-password`} name="password" autoComplete="current-password" required
374
+ value={password} onChange={(e) => setPassword(e.target.value)} {...described} />
375
+ <div id={errorId}><AuthError>{error}</AuthError></div>
376
+ <AuthSubmit disabled={busy}>{busy ? "Signing in…" : "Sign in"}</AuthSubmit>
377
+ </AuthForm>
378
+ {foot ? <AuthFoot>{foot}</AuthFoot> : null}
379
+ </>
380
+ );
381
+ }
@@ -1 +1 @@
1
- .ui-briefing{display:flex;flex-wrap:wrap;align-items:center;gap:24px 32px;min-width:0;padding:40px 44px;border-radius:var(--gemboss-radius-2xl, 20px);background:var(--gemboss-accent-wash, #f7f8ff)}.ui-briefing__body{display:grid;flex:1 1 380px;gap:16px;min-width:0;justify-items:start}.ui-briefing__eyebrow{margin:0;background:var(--gemboss-accent-soft, #eef0fe);color:var(--gemboss-accent-strong, #3a44de)}.ui-briefing__title{margin:0;max-width:24ch;font-size:var(--gemboss-fs-display, 30px);line-height:38px;font-weight:650;letter-spacing:-.01em;color:var(--ui-text-strong);overflow-wrap:anywhere}.ui-briefing__lead{margin:-8px 0 0;max-width:56ch;font-size:var(--gemboss-fs-body-lg, 16px);line-height:24px;color:var(--ui-text-muted)}.ui-briefing__lead :is(strong,b){color:var(--ui-text-strong);font-variant-numeric:tabular-nums}.ui-briefing__evidence{display:flex;flex-wrap:wrap;gap:8px}.ui-briefing__actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:4px}.ui-briefing__art{display:flex;flex:0 1 auto;justify-content:center;min-width:0}@media (pointer: coarse),(max-width: 47.9975em){.ui-briefing{padding:28px 24px}.ui-briefing__title{font-size:var(--gemboss-fs-h1, 24px);line-height:32px}}
1
+ .ui-briefing{container-type:inline-size;display:flex;flex-wrap:wrap;align-items:center;gap:24px 32px;min-width:0;padding:40px 44px;border-radius:var(--gemboss-radius-2xl, 20px);background:var(--gemboss-accent-wash, #f7f8ff)}.ui-briefing__body{display:grid;flex:1 1 380px;gap:16px;min-width:0;justify-items:start}.ui-briefing__eyebrow{margin:0;background:var(--gemboss-accent-soft, #eef0fe);color:var(--gemboss-accent-strong, #3a44de)}.ui-briefing__title{margin:0;max-width:24ch;font-size:var(--gemboss-fs-display, 30px);line-height:38px;font-weight:650;letter-spacing:-.01em;color:var(--ui-text-strong);overflow-wrap:anywhere}.ui-briefing__lead{margin:-8px 0 0;max-width:56ch;font-size:var(--gemboss-fs-body-lg, 16px);line-height:24px;color:var(--ui-text-muted)}.ui-briefing__lead :is(strong,b){color:var(--ui-text-strong);font-variant-numeric:tabular-nums}.ui-briefing__evidence{display:flex;flex-wrap:wrap;gap:8px}.ui-briefing__actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:4px}.ui-briefing__art{display:flex;flex:0 1 auto;justify-content:center;min-width:0}@container (max-width: 631px){.ui-briefing__art{display:none}}@media (pointer: coarse),(max-width: 47.9975em){.ui-briefing{padding:28px 24px}.ui-briefing__title{font-size:var(--gemboss-fs-h1, 24px);line-height:32px}}
@@ -1 +1 @@
1
- :root{--ui-coll-head-bg: color-mix(in srgb, var(--ui-text, #1b1c1e) 3.5%, var(--ui-surface, #fff));--ui-coll-hover: color-mix(in srgb, var(--ui-text, #1b1c1e) 3.5%, var(--ui-surface, #fff));--ui-coll-selected: color-mix(in srgb, var(--ui-text, #1b1c1e) 6%, var(--ui-surface, #fff));--ui-coll-check-w: 40px}.ui-table-wrap.ui-table-wrap--flush{border:0;border-radius:0;box-shadow:none;background:transparent}.ui-table--sticky-first tr{background:var(--ui-surface)}.ui-table--sticky-first tbody tr:hover{background:var(--ui-surface-2)}.ui-table--sticky-first :is(th,td):first-child{position:sticky;left:0;z-index:1;background:inherit}@supports (animation-timeline: scroll()){.ui-table-wrap:has(>.ui-table--sticky-first){scroll-timeline:--ui-coll-x inline}.ui-table--sticky-first :is(th,td):first-child{animation:ui-coll-edge linear both;animation-timeline:--ui-coll-x;animation-range:0 24px}}@keyframes ui-coll-edge{0%{box-shadow:none}to{box-shadow:1px 0 0 var(--ui-border),6px 0 8px -6px #0000002e}}.ui-table--compact :is(td,tbody th){padding-block:6px}.ui-table--compact thead th{padding-block:6px}.ui-table__totals>tr{background:var(--ui-coll-head-bg)}.ui-table__totals>tr>:is(td,th){background:var(--ui-coll-head-bg);font-weight:650;color:var(--ui-text);border-top:1px solid var(--ui-border);border-bottom:0}.ui-table__footer{padding:8px 12px;background:var(--ui-coll-head-bg);border-top:1px solid var(--ui-border);color:var(--ui-text-muted);font-size:var(--ui-fs-body);text-align:center}.ui-table th.ui-table__rowhead{font-weight:450;color:var(--ui-text);text-align:left}.ui-table th.ui-table__rowhead:not(.is-num){white-space:normal;min-width:9.0625rem;overflow-wrap:anywhere}.ui-table th.ui-table__rowhead>a,.ui-table:where(:not(.ui-table--index)) tbody :is(td,th) li>a{display:inline-flex;align-items:center;min-height:24px}.ui-table:where(:not(.ui-table--index)) tbody :is(td,th){vertical-align:top}.ui-table:where(:not(.ui-table--index)) tbody :is(td>a,th.ui-table__rowhead>a,:is(td,th) li>a){margin-block:calc((1lh - 24px)/2)}.ui-table__sort{display:flex;width:max-content;max-width:100%;align-items:center;gap:4px;min-height:24px;margin-block:-2px;padding:0;border:0;background:none;color:inherit;font:inherit;text-align:inherit;text-decoration:none;cursor:pointer;white-space:nowrap}.ui-table__sort:hover{color:var(--ui-text)}.ui-table__sort:focus-visible{outline:2px solid var(--ui-focus);outline-offset:2px;border-radius:4px}.ui-table__sort:after{content:"";flex:none;width:16px;height:16px;background:currentColor;opacity:0;-webkit-mask:var(--ui-coll-arrow) center / 16px no-repeat;mask:var(--ui-coll-arrow) center / 16px no-repeat;--ui-coll-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 3.5v9M4.5 9 8 12.5 11.5 9' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}.ui-table__sort:is(:hover,:focus-visible):after{opacity:.45}th[aria-sort=ascending]>.ui-table__sort:after,th[aria-sort=descending]>.ui-table__sort:after{opacity:1}th[aria-sort=ascending]>.ui-table__sort:after{transform:rotate(180deg)}th[aria-sort=ascending]>.ui-table__sort,th[aria-sort=descending]>.ui-table__sort{color:var(--ui-text)}.ui-table .is-num>.ui-table__sort{flex-direction:row-reverse;margin-left:auto}.ui-trunc{display:block;max-width:var(--ui-trunc, 32ch);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-clamp-2{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;white-space:normal;overflow-wrap:anywhere}.ui-index{position:relative;container:ui-index / inline-size;min-width:0}.ui-table--index{font-size:var(--ui-fs-body)}.ui-table--index tr{background:var(--ui-surface)}.ui-table.ui-table--index thead th{padding:8px 6px;background:var(--ui-coll-head-bg);color:var(--ui-text-muted);font-size:var(--ui-fs-caption);line-height:20px;font-weight:550;text-transform:none;letter-spacing:0}.ui-table.ui-table--index :is(td,tbody th){padding:6px;line-height:20px;white-space:nowrap;vertical-align:middle;border-bottom:0;border-top:1px solid var(--ui-border)}.ui-table.ui-table--index :is(th,td):where(:first-child){padding-left:var(--ui-space-3)}.ui-table.ui-table--index :is(th,td):where(:last-child){padding-right:var(--ui-space-3)}.ui-table--index tbody tr:hover{background:var(--ui-coll-hover)}.ui-table--index tbody tr:is(.is-selected,[aria-selected=true]){background:var(--ui-coll-selected)}.ui-table--index tbody tr:is([data-href],.is-linked){cursor:pointer}.ui-table--index tbody tr:has(.ui-table__title:focus-visible){outline:2px solid var(--ui-focus);outline-offset:-2px}.ui-table__title:focus-visible{outline:none}.ui-table__primary{min-width:0}.ui-table__primary-inner{display:flex;align-items:center;gap:var(--ui-space-3);min-width:0}.ui-table__primary-text{min-width:0}.ui-table__title{display:block;max-width:var(--ui-trunc, 40ch);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ui-text);font-weight:650;text-decoration:none}a.ui-table__title:hover{text-decoration:underline}.ui-table--index .ui-table__title+.ui-sub,.ui-table--index .ui-sub{display:block;max-width:var(--ui-trunc, 40ch);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:0;line-height:16px}.ui-table--index td>a.ui-table__title{display:block;min-height:0}.ui-table--index td>.ui-table__primary-inner>a.ui-table__title,.ui-table--index .ui-table__primary-text>a.ui-table__title{line-height:20px}.ui-table.ui-table--index .ui-table__check{width:var(--ui-coll-check-w);padding:6px 8px 6px 12px}.ui-table.ui-table--index thead .ui-table__check{padding:8px 8px 8px 12px}.ui-table__checkbox{display:flex;width:max-content;align-items:center;justify-content:center;min-width:24px;min-height:24px;margin:-2px 0;cursor:pointer}.ui-table__checkbox>input,.ui-list__check>input{width:16px;height:16px;margin:0;accent-color:var(--ui-accent);cursor:pointer}.ui-table__checkbox>input:focus-visible,.ui-list__check>input:focus-visible{outline:2px solid var(--ui-focus);outline-offset:2px}.ui-table--index :is(.ui-table__check,.ui-table__primary){position:sticky;z-index:1;background:inherit}.ui-table--index .ui-table__check,.ui-table--index .ui-table__primary{left:0}.ui-table--index:has(.ui-table__check) .ui-table__primary{left:var(--ui-coll-check-w)}.ui-table__actions{width:1%;text-align:right}.ui-table__actions>*{vertical-align:middle}.ui-row-actions{display:inline-flex;align-items:center;gap:var(--ui-space-2)}.ui-bulkbar{position:relative;z-index:3;display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-space-2);box-sizing:border-box;min-height:38px;margin-bottom:-38px;padding:4px 8px 4px 12px;background:var(--ui-surface);border:1px solid var(--ui-border);border-bottom-color:transparent;border-radius:var(--ui-radius-lg) var(--ui-radius-lg) 0 0;font-size:var(--ui-fs-body)}.ui-bulkbar[hidden]{display:none}.ui-bulkbar__count{flex:none;font-weight:550;font-variant-numeric:tabular-nums;white-space:nowrap}.ui-bulkbar__actions{display:inline-flex;flex-wrap:wrap;gap:var(--ui-space-2);margin-left:auto}.ui-bulkbar .ui-table__checkbox{margin-right:4px}.ui-bulkbar[data-fit=pending]{flex-wrap:nowrap}.ui-bulkbar[data-fit=pending]>.ui-bulkbar__actions{flex:0 1 auto;flex-wrap:nowrap;min-width:0;overflow:hidden}.ui-bulkbar__actions>.ui-bulkbar__more{flex:none}.ui-bulkbar__measure{position:absolute;top:0;left:0;display:inline-flex;gap:var(--ui-space-2);height:0;overflow:hidden;visibility:hidden;pointer-events:none;white-space:nowrap}.ui-bulkbar__measure>*{flex:none}.ui-index__sortbar{display:none}@container ui-index (max-width: 768px){.ui-table--index,.ui-table--index tbody{display:block;width:100%}.ui-table--index thead{display:none}.ui-table--index tbody tr{position:relative;display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 12px;min-height:44px;box-sizing:border-box;padding:10px 12px;border-top:1px solid var(--ui-border)}.ui-table--index tbody tr:first-child{border-top:0}.ui-table--index tbody tr:has(>.ui-table__check){padding-left:48px}.ui-table.ui-table--index tbody :is(td,th){display:block;padding:0;border:0;position:static;background:none;white-space:nowrap}.ui-table--index tbody .ui-table__primary{flex:1 0 100%;white-space:normal}.ui-table--index tbody td:not(.ui-table__primary,.ui-table__check,.ui-table__actions){flex:none;max-width:100%;overflow:hidden;text-overflow:ellipsis;color:var(--ui-text-muted);font-size:var(--ui-fs-caption);line-height:18px}.ui-table--index tbody td[data-label]:not(.ui-table__primary):before{content:attr(data-label) " ";color:var(--ui-text-muted)}.ui-table--index tbody td:not(.ui-table__primary,.ui-table__check,.ui-table__actions) .ui-trunc{display:inline-block;vertical-align:bottom}.ui-table--index tbody td:not(.ui-table__primary,.ui-table__check,.ui-table__actions) .ui-sub{display:inline;margin-left:6px}.ui-table--index tbody td.is-num{text-align:left}.ui-table--index tbody td[data-condensed=hide]{display:none}.ui-table.ui-table--index tbody .ui-table__check{position:absolute;left:4px;top:4px;width:auto;padding:0}.ui-table.ui-table--index tbody .ui-table__actions{order:99;margin-left:auto;width:auto;padding:0;align-self:center}.ui-table--index .ui-table__checkbox{min-width:44px;min-height:44px;margin:0}.ui-table--index .ui-table__title,.ui-table--index .ui-sub,.ui-table--index .ui-table__title+.ui-sub{max-width:none}.ui-table--index tbody a.ui-table__title{position:relative;z-index:1;padding-block:2px;margin-block:-2px}.ui-index__sortbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-space-2);margin:0 0 var(--ui-space-3);font-size:var(--ui-fs-caption);color:var(--ui-text-muted)}.ui-index .ui-bulkbar{margin-bottom:var(--ui-space-2);border-bottom-color:var(--ui-border);border-radius:var(--ui-radius-lg)}.ui-index .ui-table-wrap{overflow-x:visible}}.ui-list{container:ui-list / inline-size;margin:0;padding:0;list-style:none;background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);box-shadow:var(--ui-card-shadow)}.ui-list--flush{border:0;border-radius:0;box-shadow:none;background:transparent}.ui-list__item{position:relative;display:flex;align-items:flex-start;gap:var(--ui-space-3);box-sizing:border-box;padding:var(--ui-space-3);min-height:44px;border-top:1px solid var(--ui-border)}.ui-list>.ui-list__item:first-child{border-top:0}.ui-list>.ui-list__item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.ui-list>.ui-list__item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.ui-list__item:has(>.ui-list__body>.ui-list__title[href]):hover{background:var(--ui-coll-hover)}.ui-list__item:is(.is-selected,[aria-selected=true]){background:var(--ui-coll-selected)}.ui-list__item:has(>.ui-list__body>.ui-list__title:focus-visible){outline:2px solid var(--ui-focus);outline-offset:-2px}.ui-list__media{flex:none;display:flex;align-items:center;min-height:40px}.ui-list__body{flex:1 1 auto;min-width:0}.ui-list__title{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ui-text);font-size:var(--ui-fs-body);line-height:20px;font-weight:650;text-decoration:none}.ui-list__title[href]:after{content:"";position:absolute;inset:0;z-index:0}.ui-list__title:focus-visible{outline:none}.ui-list__sub{margin:0;color:var(--ui-text-muted);font-size:var(--ui-fs-body);line-height:20px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;overflow-wrap:anywhere}.ui-list__meta{margin:2px 0 0;color:var(--ui-text-muted);font-size:var(--ui-fs-caption);line-height:16px}.ui-list__badges{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.ui-list__aside{flex:none;align-self:center;color:var(--ui-text);font-variant-numeric:tabular-nums;text-align:right}.ui-list__actions{flex:none;align-self:center;display:inline-flex;align-items:center;gap:var(--ui-space-2)}.ui-list__item :is(.ui-list__actions,.ui-list__aside a,.ui-list__body a:not(.ui-list__title),button,input,select,textarea,label,summary,details){position:relative;z-index:1}.ui-list__item>:is(.ui-list__actions,.ui-list__aside) a:not(.ui-btn){display:inline-flex;align-items:center;min-height:24px}@container ui-list (max-width: 400px){.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item{display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"media body body" "media aside actions";gap:0;align-items:start}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__media{grid-area:media;margin-inline-end:var(--ui-space-3)}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__body{grid-area:body}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__aside{grid-area:aside;justify-self:start;align-self:center;margin-top:4px;text-align:left}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__actions{grid-area:actions;justify-self:end;align-self:center;margin:4px 0 0 var(--ui-space-3)}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item--disclosure>:is(.ui-list__aside,.ui-list__actions){margin-top:8px}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item:has(>.ui-list__body>.ui-list__title:only-child){grid-template-columns:auto minmax(0,1fr) auto auto;grid-template-areas:"media body aside actions";align-items:center}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item:has(>.ui-list__body>.ui-list__title:only-child)>:is(.ui-list__aside,.ui-list__actions){margin-top:0}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item:has(>.ui-list__body>.ui-list__title:only-child)>.ui-list__aside{margin-inline-start:var(--ui-space-3);text-align:right}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__panel{grid-column:1 / -1}}.ui-list__item--disclosure{flex-wrap:wrap}.ui-list__toggle{display:block;flex:1 1 0;min-width:0;min-height:24px;margin:0;padding:0;border:0;border-radius:var(--ui-radius-sm, 4px);background:none;color:inherit;font:inherit;text-align:left;cursor:pointer}.ui-list__toggle:focus-visible{outline:2px solid var(--ui-focus);outline-offset:2px}.ui-list__toggle>.ui-list__meta{display:block}@media (hover: hover){.ui-list__item--disclosure:not(.is-open):has(>.ui-list__toggle:hover){background:var(--ui-coll-hover)}}.ui-list__chev{display:inline-block;width:16px;height:16px;margin:0 4px 0 -2px;vertical-align:-3px;background:var(--ui-text-muted);-webkit-mask:var(--ui-chev) center / 16px no-repeat;mask:var(--ui-chev) center / 16px no-repeat;transition:transform .15s;--ui-chev: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6 4l4 4-4 4' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}.ui-list__item--disclosure.is-open>.ui-list__toggle .ui-list__chev{transform:rotate(90deg)}@media (forced-colors: active){.ui-list__chev{forced-color-adjust:none;background:CanvasText}}.ui-list__panel{flex:1 0 100%;min-width:0;margin-top:var(--ui-space-2)}.ui-list__panel[hidden]{display:none}@media (pointer: coarse),(max-width: 47.9975em){.ui-list__toggle{min-height:44px}}@media (prefers-reduced-motion: reduce){.ui-list__chev{transition:none}}.ui-resource>.ui-bulkbar{margin-bottom:0;border-bottom-color:var(--ui-border)}.ui-resource>.ui-bulkbar:has(+.ui-list--flush){border-width:0 0 1px;border-radius:0}.ui-resource>.ui-list,.ui-resource>[aria-busy]>.ui-list{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.ui-list__check{display:flex;flex:none;align-items:center;justify-content:center;min-width:24px;min-height:24px;cursor:pointer}.ui-list__check:not(:last-child){margin-inline-end:8px}@media (pointer: coarse),(max-width: 47.9975em){.ui-list__check{min-width:44px;min-height:44px;margin-block:-2px;margin-inline-start:-12px}.ui-list__check:not(:last-child){margin-inline-end:-2px}.ui-resource>.ui-bulkbar>.ui-table__checkbox{min-width:44px;min-height:44px;margin:-8px -8px -8px -12px}}.ui-thumb{display:block;flex:none;width:40px;height:40px;box-sizing:border-box;border:1px solid var(--ui-border);border-radius:var(--ui-radius-md);background:var(--ui-surface-2);overflow:hidden;object-fit:cover}.ui-thumb--xs{width:24px;height:24px;border-radius:var(--ui-radius-sm)}.ui-thumb--md{width:60px;height:60px}.ui-thumb--lg{width:80px;height:80px}.ui-thumb>img{display:block;width:100%;height:100%;object-fit:cover}.ui-list--compact>.ui-list__item{display:block;padding:0;min-height:0}.ui-list__row{display:flex;align-items:center;gap:var(--ui-space-2);box-sizing:border-box;width:100%;min-height:36px;padding:8px 12px;border:0;background:none;color:var(--ui-text);font:inherit;font-size:var(--ui-fs-body);line-height:20px;text-align:left;text-decoration:none;border-radius:inherit}:is(a,button).ui-list__row{cursor:pointer}:is(a,button).ui-list__row:hover{background:var(--ui-coll-hover)}:is(a,button).ui-list__row:focus-visible{outline:2px solid var(--ui-focus);outline-offset:-2px}.ui-list__row[aria-current=page],.ui-list__row.is-selected{background:var(--ui-coll-selected)}.ui-list__icon{flex:none;display:inline-flex;width:20px;height:20px;align-items:center;justify-content:center;color:var(--ui-text-muted)}.ui-list__icon>svg{width:16px;height:16px}.ui-list__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-list__row>.ui-list__meta{flex:none;margin:0;font-variant-numeric:tabular-nums}@media (pointer: coarse),(max-width: 47.9975em){.ui-list__row{min-height:44px}}.ui-list--activity>.ui-list__item{display:grid;grid-template-columns:20px minmax(0,1fr) auto;column-gap:var(--ui-space-2);align-items:start;padding:8px 12px;min-height:36px;border-top:0}.ui-list--activity>.ui-list__item:before{content:"";position:absolute;left:21.5px;top:0;bottom:0;width:1px;background:var(--ui-border)}.ui-list--activity>.ui-list__item:first-child:before{top:14px}.ui-list--activity>.ui-list__item:last-child:before{bottom:calc(100% - 14px)}.ui-list--activity>.ui-list__item:only-child:before{display:none}.ui-list__dot{position:relative;z-index:1;width:8px;height:8px;margin:6px 0 0 6px;border-radius:50%;background:var(--ui-text-muted);box-shadow:0 0 0 3px var(--ui-surface)}.ui-list__dot--success{background:var(--gemboss-success, #0a8f6a)}.ui-list__dot--warning{background:var(--gemboss-warning, #b25e09)}.ui-list__dot--critical{background:var(--gemboss-danger-strong, #c70a24)}.ui-list__dot--info{background:var(--gemboss-accent, #5661f5)}.ui-list--activity .ui-list__label{display:block;white-space:nowrap}.ui-list--activity a.ui-list__label{position:relative;color:var(--ui-text);text-decoration:none;padding-block:2px;margin-block:-2px}.ui-list--activity a.ui-list__label:hover{text-decoration:underline}.ui-list--activity a.ui-list__label:focus-visible{outline:2px solid var(--ui-focus);outline-offset:0;border-radius:4px}.ui-list--activity .ui-list__detail{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ui-text-muted);font-size:var(--ui-fs-caption);line-height:16px}.ui-list--activity time,.ui-list--activity .ui-list__time{color:var(--ui-text-muted);font-size:var(--ui-fs-caption);line-height:20px;white-space:nowrap;font-variant-numeric:tabular-nums}.ui-list__content{margin-top:4px;color:var(--ui-text);font-size:var(--ui-fs-body);line-height:20px;overflow-wrap:anywhere}.ui-list__content>p{margin:0}.ui-list__content>p+p{margin-top:4px}.ui-list--wrap>.ui-list__item>*>:is(.ui-list__label,.ui-list__detail,.ui-list__title){white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere}.ui-list--wrap>.ui-list__item>.ui-list__row{align-items:flex-start}@media (pointer: coarse),(max-width: 47.9975em){.ui-list--wrap>.ui-list__item>.ui-list__row{padding-block:12px}}.ui-list--wrap>.ui-list__item>.ui-list__row>.ui-list__meta{line-height:20px}.ui-cardgrid{--ui-cardgrid-min: 240px;display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ui-cardgrid-min),100%),1fr));gap:var(--ui-space-4);margin:0;padding:0;list-style:none}.ui-cardgrid[data-min="200"]{--ui-cardgrid-min: 200px}.ui-cardgrid[data-min="320"]{--ui-cardgrid-min: 320px}.ui-cardgrid>*{min-width:0}.ui-board{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(240px,1fr);gap:var(--ui-space-4);align-items:start;overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x mandatory;padding-bottom:4px}@media (max-width: 47.9975em){.ui-board{grid-auto-columns:78%}}.ui-board__col{display:flex;flex-direction:column;gap:var(--ui-space-2);min-width:0;padding:var(--ui-space-2);scroll-snap-align:start;background:var(--ui-coll-head-bg);border-radius:var(--ui-radius-lg)}.ui-board__head{display:flex;align-items:center;gap:var(--ui-space-2);min-height:28px;padding:0 4px;font-size:var(--ui-fs-body);font-weight:650}.ui-board__name{min-width:0;margin:0;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-board__count{margin-left:auto;color:var(--ui-text-muted);font-weight:450;font-variant-numeric:tabular-nums}.ui-board__dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--ui-text-muted)}.ui-board__dot--success{background:var(--gemboss-success, #0a8f6a)}.ui-board__dot--warning{background:var(--gemboss-warning, #b25e09)}.ui-board__dot--critical{background:var(--gemboss-danger-strong, #c70a24)}.ui-board__dot--info{background:var(--gemboss-accent, #5661f5)}.ui-board__list{display:grid;gap:var(--ui-space-2);margin:0;padding:0;list-style:none}.ui-board__list>li{min-width:0}.ui-board__empty{margin:0;padding:var(--ui-space-4) var(--ui-space-2);color:var(--ui-text-muted);font-size:var(--ui-fs-body);text-align:center;border:1px dashed var(--ui-border);border-radius:var(--ui-radius-md)}.ui-board__more>summary{list-style:none;justify-self:center;margin:4px auto 0;width:fit-content}.ui-board__more>summary::-webkit-details-marker{display:none}.ui-board__more[open]>summary{display:none}.ui-board__more{display:grid;gap:var(--ui-space-2)}.ui-board__next.ui-more{padding:4px 0 0}.ui-board__next .ui-more__error{color:var(--gemboss-danger-strong, #c70a24)}.ui-board[data-gb-move] .ui-board__list>li[data-id]{position:relative;border-radius:var(--ui-radius-lg);cursor:grab}.ui-board[data-gb-move] .ui-board__list>li[data-id]:focus-visible{outline:2px solid var(--ui-focus);outline-offset:2px}.ui-board__list>li[data-gb-lifted]{outline:2px solid var(--ui-focus);outline-offset:2px;box-shadow:var(--gemboss-shadow-raised);border-radius:var(--ui-radius-lg)}.ui-board[data-gb-dragging] .ui-board__list>li[data-gb-lifted]{outline:0;opacity:.4}.ui-board__col[data-gb-over]{background:color-mix(in srgb,var(--ui-focus) 10%,var(--ui-coll-head-bg))}.ui-board__list>li[data-gb-drop]:before{content:"";position:absolute;left:0;right:0;height:2px;border-radius:1px;background:var(--ui-focus);pointer-events:none}.ui-board__list>li[data-gb-drop=before]:before{top:-5px}.ui-board__list>li[data-gb-drop=after]:before{bottom:-5px}.ui-empty--no-match{padding-block:32px}.ui-coll-error{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-space-2) var(--ui-space-3);margin:var(--ui-space-3)}.ui-coll-error>:first-child{flex:1 1 240px;min-width:0}.ui-coll-count{margin-left:auto;color:var(--ui-text-muted);font-size:var(--ui-fs-body);font-variant-numeric:tabular-nums;white-space:nowrap}.ui-chip__x{margin-right:-4px;font-size:14px;line-height:1;opacity:.7}:is(.ui-table-wrap,.ui-index,.ui-list,.ui-cardgrid,.ui-board)[aria-busy=true]{position:relative}:is(.ui-table-wrap,.ui-index,.ui-list,.ui-cardgrid,.ui-board)[aria-busy=true]>:not(.ui-bulkbar,.ui-coll-busy){opacity:.55;pointer-events:none;transition:opacity .15s}.ui-coll-busy{position:absolute;top:8px;right:8px;z-index:4}:is(.ui-skeleton--table,.ui-skeleton--list,.ui-skeleton--compact,.ui-skeleton--grid,.ui-skeleton--board) .ui-skeleton__line{height:8px;border-radius:4px}.ui-skeleton--table td .ui-skeleton__line{width:70%;margin-block:6px}.ui-skeleton--table td:first-child .ui-skeleton__line{width:85%}.ui-skeleton--table tbody tr:hover{background:none}.ui-skeleton__block{display:block;flex:none;width:40px;height:40px;border-radius:var(--ui-radius-md);background:var(--ui-surface-2)}.ui-skeleton__block--round{border-radius:50%;width:32px;height:32px}.ui-skeleton--list>.ui-list__item{align-items:center}.ui-skeleton--list .ui-list__body{display:grid;gap:12px}.ui-skeleton--list .ui-list__body>.ui-skeleton__line:last-child{width:60%}.ui-skeleton--compact .ui-list__row{gap:12px}.ui-skeleton--compact .ui-list__row>.ui-skeleton__line{flex:1 1 auto;max-width:60%}.ui-skeleton--grid .ui-card__body{display:grid;gap:12px;justify-items:stretch}.ui-skeleton--grid .ui-card__body>.ui-skeleton__line:last-child{width:50%}.ui-skeleton--board .ui-board__list>li{height:72px;border-radius:var(--ui-radius-md);background:var(--ui-surface)}@media (pointer: coarse){.ui-table__sort{min-height:44px;margin-block:-12px}.ui-table__checkbox{min-width:44px;min-height:44px;margin:-12px 0}}@media (pointer: coarse),(max-width: 47.9975em){.ui-table__sort{min-width:44px}}@media (prefers-reduced-motion: reduce){.ui-table--sticky-first :is(th,td):first-child{animation:none}:is(.ui-table-wrap,.ui-index,.ui-list,.ui-cardgrid,.ui-board)[aria-busy=true]>*{transition:none}.ui-board{scroll-behavior:auto}}
1
+ :root{--ui-coll-head-bg: color-mix(in srgb, var(--ui-text, #1b1c1e) 3.5%, var(--ui-surface, #fff));--ui-coll-hover: color-mix(in srgb, var(--ui-text, #1b1c1e) 3.5%, var(--ui-surface, #fff));--ui-coll-selected: color-mix(in srgb, var(--ui-text, #1b1c1e) 6%, var(--ui-surface, #fff));--ui-coll-check-w: 40px}.ui-table-wrap.ui-table-wrap--flush{border:0;border-radius:0;box-shadow:none;background:transparent}.ui-table--sticky-first tr{background:var(--ui-surface)}.ui-table--sticky-first tbody tr:hover{background:var(--ui-surface-2)}.ui-table--sticky-first :is(th,td):first-child{position:sticky;left:0;z-index:1;background:inherit}@supports (animation-timeline: scroll()){.ui-table-wrap:has(>.ui-table--sticky-first){scroll-timeline:--ui-coll-x inline}.ui-table--sticky-first :is(th,td):first-child{animation:ui-coll-edge linear both;animation-timeline:--ui-coll-x;animation-range:0 24px}}@keyframes ui-coll-edge{0%{box-shadow:none}to{box-shadow:1px 0 0 var(--ui-border),6px 0 8px -6px #0000002e}}.ui-table--compact :is(td,tbody th){padding-block:6px}.ui-table--compact thead th{padding-block:6px}.ui-table__totals>tr{background:var(--ui-coll-head-bg)}.ui-table__totals>tr>:is(td,th){background:var(--ui-coll-head-bg);font-weight:650;color:var(--ui-text);border-top:1px solid var(--ui-border);border-bottom:0}.ui-table__footer{padding:8px 12px;background:var(--ui-coll-head-bg);border-top:1px solid var(--ui-border);color:var(--ui-text-muted);font-size:var(--ui-fs-body);text-align:center}.ui-table th.ui-table__rowhead{font-weight:450;color:var(--ui-text);text-align:left}.ui-table th.ui-table__rowhead:not(.is-num){white-space:normal;min-width:9.0625rem;overflow-wrap:anywhere}.ui-table th.ui-table__rowhead>a,.ui-table:where(:not(.ui-table--index)) tbody :is(td,th) li>a{display:inline-flex;align-items:center;min-height:24px}.ui-table:where(:not(.ui-table--index)) tbody :is(td,th){vertical-align:top}.ui-table:where(:not(.ui-table--index)) tbody :is(td>a,th.ui-table__rowhead>a,:is(td,th) li>a){margin-block:calc((1lh - 24px)/2)}.ui-table__sort{display:flex;width:max-content;max-width:100%;align-items:center;gap:4px;min-height:24px;margin-block:-2px;padding:0;border:0;background:none;color:inherit;font:inherit;text-align:inherit;text-decoration:none;cursor:pointer;white-space:nowrap}.ui-table__sort:hover{color:var(--ui-text)}.ui-table__sort:focus-visible{outline:2px solid var(--ui-focus);outline-offset:2px;border-radius:4px}.ui-table__sort:after{content:"";flex:none;width:16px;height:16px;background:currentColor;opacity:0;-webkit-mask:var(--ui-coll-arrow) center / 16px no-repeat;mask:var(--ui-coll-arrow) center / 16px no-repeat;--ui-coll-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M8 3.5v9M4.5 9 8 12.5 11.5 9' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}.ui-table__sort:is(:hover,:focus-visible):after{opacity:.45}th[aria-sort=ascending]>.ui-table__sort:after,th[aria-sort=descending]>.ui-table__sort:after{opacity:1}th[aria-sort=ascending]>.ui-table__sort:after{transform:rotate(180deg)}th[aria-sort=ascending]>.ui-table__sort,th[aria-sort=descending]>.ui-table__sort{color:var(--ui-text)}.ui-table .is-num>.ui-table__sort{flex-direction:row-reverse;margin-left:auto}.ui-trunc{display:block;max-width:var(--ui-trunc, 32ch);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-clamp-2{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;white-space:normal;overflow-wrap:anywhere}.ui-index{position:relative;container:ui-index / inline-size;min-width:0}.ui-table--index{font-size:var(--ui-fs-body)}.ui-table--index tr{background:var(--ui-surface)}.ui-table.ui-table--index thead th{background:var(--ui-surface);line-height:20px;text-transform:none;letter-spacing:0}.ui-table.ui-table--index :is(td,tbody th){line-height:20px;white-space:nowrap;vertical-align:middle;border-bottom:0;border-top:1px solid var(--ui-border)}.ui-table.ui-table--index :is(th,td):where(:first-child){padding-left:var(--ui-space-3)}.ui-table.ui-table--index :is(th,td):where(:last-child){padding-right:var(--ui-space-3)}.ui-table--index tbody tr:hover{background:var(--ui-coll-hover)}.ui-table--index tbody tr:is(.is-selected,[aria-selected=true]){background:var(--ui-coll-selected)}.ui-table--index tbody tr:is([data-href],.is-linked){cursor:pointer}.ui-table--index tbody tr:has(.ui-table__title:focus-visible){outline:2px solid var(--ui-focus);outline-offset:-2px}.ui-table__title:focus-visible{outline:none}.ui-table__primary{min-width:0}.ui-table__primary-inner{display:flex;align-items:center;gap:var(--ui-space-3);min-width:0}.ui-table__primary-text{min-width:0}.ui-table__title{display:block;max-width:var(--ui-trunc, 40ch);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ui-text);font-weight:650;text-decoration:none}a.ui-table__title:hover{text-decoration:underline}.ui-table--index .ui-table__title+.ui-sub,.ui-table--index .ui-sub{display:block;max-width:var(--ui-trunc, 40ch);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:0;line-height:16px}.ui-table--index td>a.ui-table__title{display:block;min-height:0}.ui-table--index td>.ui-table__primary-inner>a.ui-table__title,.ui-table--index .ui-table__primary-text>a.ui-table__title{line-height:20px}.ui-table.ui-table--index .ui-table__check{width:var(--ui-coll-check-w);padding:var(--ui-space-2) 8px var(--ui-space-2) var(--ui-space-3)}.ui-table.ui-table--index thead .ui-table__check{padding-block:var(--ui-space-3)}.ui-table__checkbox{display:flex;width:max-content;align-items:center;justify-content:center;min-width:24px;min-height:24px;margin:-2px 0;cursor:pointer}.ui-table__checkbox>input,.ui-list__check>input{width:16px;height:16px;margin:0;accent-color:var(--ui-accent);cursor:pointer}.ui-table__checkbox>input:focus-visible,.ui-list__check>input:focus-visible{outline:2px solid var(--ui-focus);outline-offset:2px}.ui-table--index :is(.ui-table__check,.ui-table__primary){position:sticky;z-index:1;background:inherit}.ui-table--index .ui-table__check,.ui-table--index .ui-table__primary{left:0}.ui-table--index:has(.ui-table__check) .ui-table__primary{left:var(--ui-coll-check-w)}.ui-table__actions{width:1%;text-align:right}.ui-table__actions>*{vertical-align:middle}.ui-row-actions{display:inline-flex;align-items:center;gap:var(--ui-space-2)}.ui-bulkbar{position:relative;z-index:3;display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-space-2);box-sizing:border-box;min-height:38px;margin-bottom:-38px;padding:4px 8px 4px 12px;background:var(--ui-surface);border:1px solid var(--ui-border);border-bottom-color:transparent;border-radius:var(--ui-radius-lg) var(--ui-radius-lg) 0 0;font-size:var(--ui-fs-body)}.ui-bulkbar[hidden]{display:none}.ui-index .ui-bulkbar{min-height:46px;margin-bottom:-46px}.ui-index--flush .ui-bulkbar{min-height:45px;margin-bottom:-45px;border-width:0 0 1px;border-bottom-color:var(--ui-border);border-radius:0}.ui-bulkbar__count{flex:none;font-weight:550;font-variant-numeric:tabular-nums;white-space:nowrap}.ui-bulkbar__actions{display:inline-flex;flex-wrap:wrap;gap:var(--ui-space-2);margin-left:auto}.ui-bulkbar .ui-table__checkbox{margin-right:4px}.ui-bulkbar[data-fit=pending]{flex-wrap:nowrap}.ui-bulkbar[data-fit=pending]>.ui-bulkbar__actions{flex:0 1 auto;flex-wrap:nowrap;min-width:0;overflow:hidden}.ui-bulkbar__actions>.ui-bulkbar__more{flex:none}.ui-bulkbar__measure{position:absolute;top:0;left:0;display:inline-flex;gap:var(--ui-space-2);height:0;overflow:hidden;visibility:hidden;pointer-events:none;white-space:nowrap}.ui-bulkbar__measure>*{flex:none}.ui-index__sortbar{display:none}@container ui-index (max-width: 768px){.ui-table--index,.ui-table--index tbody{display:block;width:100%}.ui-table--index thead{display:none}.ui-table--index tbody tr{position:relative;display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 12px;min-height:44px;box-sizing:border-box;padding:10px 12px;border-top:1px solid var(--ui-border)}.ui-table--index tbody tr:first-child{border-top:0}.ui-table--index tbody tr:has(>.ui-table__check){padding-left:48px}.ui-table.ui-table--index tbody :is(td,th){display:block;padding:0;border:0;position:static;background:none;white-space:nowrap}.ui-table.ui-table--index tbody .ui-table__primary{flex:1 0 100%;white-space:normal;overflow-wrap:anywhere}.ui-table--index tbody td:not(.ui-table__primary,.ui-table__check,.ui-table__actions){flex:none;max-width:100%;overflow:hidden;text-overflow:ellipsis;color:var(--ui-text-muted);font-size:var(--ui-fs-caption);line-height:18px}.ui-table--index tbody td[data-label]:not(.ui-table__primary):before{content:attr(data-label) " ";color:var(--ui-text-muted)}.ui-table--index tbody td:not(.ui-table__primary,.ui-table__check,.ui-table__actions) .ui-trunc{display:inline-block;vertical-align:bottom}.ui-table--index tbody td:not(.ui-table__primary,.ui-table__check,.ui-table__actions) .ui-sub{display:inline;margin-left:6px}.ui-table--index tbody td.is-num{text-align:left}.ui-table--index tbody td[data-condensed=hide]{display:none}.ui-table.ui-table--index tbody .ui-table__check{position:absolute;left:4px;top:4px;width:auto;padding:0}.ui-table.ui-table--index tbody .ui-table__actions{order:99;margin-left:auto;width:auto;padding:0;align-self:center}.ui-table--index .ui-table__checkbox{min-width:44px;min-height:44px;margin:0}.ui-table--index .ui-table__title,.ui-table--index .ui-sub,.ui-table--index .ui-table__title+.ui-sub{max-width:none}.ui-table--index tbody a.ui-table__title{position:relative;z-index:1;padding-block:2px;margin-block:-2px}.ui-index__sortbar{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-space-2);margin:0 0 var(--ui-space-3);font-size:var(--ui-fs-caption);color:var(--ui-text-muted)}.ui-index .ui-bulkbar{min-height:38px;margin-bottom:var(--ui-space-2);border-bottom-color:var(--ui-border);border-radius:var(--ui-radius-lg)}.ui-index .ui-table-wrap{overflow-x:visible}.ui-index--flush .ui-bulkbar{margin-bottom:0;border-radius:0}.ui-index--flush>.ui-index__sortbar{padding:var(--ui-space-2) 12px 0}}.ui-list{container:ui-list / inline-size;margin:0;padding:0;list-style:none;background:var(--ui-surface);border:1px solid var(--ui-border);border-radius:var(--ui-radius-lg);box-shadow:var(--ui-card-shadow)}.ui-list--flush{border:0;border-radius:0;box-shadow:none;background:transparent}.ui-list__item{position:relative;display:flex;align-items:flex-start;gap:var(--ui-space-3);box-sizing:border-box;padding:var(--ui-space-3);min-height:44px;border-top:1px solid var(--ui-border)}.ui-list>.ui-list__item:first-child{border-top:0}.ui-list>.ui-list__item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.ui-list>.ui-list__item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.ui-list__item:has(>.ui-list__body>.ui-list__title[href]):hover{background:var(--ui-coll-hover)}.ui-list__item:is(.is-selected,[aria-selected=true]){background:var(--ui-coll-selected)}.ui-list__item:has(>.ui-list__body>.ui-list__title:focus-visible){outline:2px solid var(--ui-focus);outline-offset:-2px}.ui-list__media{flex:none;display:flex;align-items:center;min-height:40px}.ui-list__body{flex:1 1 auto;min-width:0}.ui-list__title{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ui-text);font-size:var(--ui-fs-body);line-height:20px;font-weight:650;text-decoration:none}.ui-list__title[href]:after{content:"";position:absolute;inset:0;z-index:0}.ui-list__title:focus-visible{outline:none}.ui-list__sub{margin:0;color:var(--ui-text-muted);font-size:var(--ui-fs-body);line-height:20px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;overflow-wrap:anywhere}.ui-list__meta{margin:2px 0 0;color:var(--ui-text-muted);font-size:var(--ui-fs-caption);line-height:16px}.ui-list__badges{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.ui-list__aside{flex:none;align-self:center;color:var(--ui-text);font-variant-numeric:tabular-nums;text-align:right}.ui-list__actions{flex:none;align-self:center;display:inline-flex;align-items:center;gap:var(--ui-space-2)}.ui-list__item :is(.ui-list__actions,.ui-list__aside a,.ui-list__body a:not(.ui-list__title),button,input,select,textarea,label,summary,details){position:relative;z-index:1}.ui-list__item>:is(.ui-list__actions,.ui-list__aside) a:not(.ui-btn){display:inline-flex;align-items:center;min-height:24px}@container ui-list (max-width: 400px){.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item{display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-areas:"media body body" "media aside actions";gap:0;align-items:start}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__media{grid-area:media;margin-inline-end:var(--ui-space-3)}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__body{grid-area:body}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__aside{grid-area:aside;justify-self:start;align-self:center;margin-top:4px;text-align:left}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__actions{grid-area:actions;justify-self:end;align-self:center;margin:4px 0 0 var(--ui-space-3)}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item--disclosure>:is(.ui-list__aside,.ui-list__actions){margin-top:8px}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item:has(>.ui-list__body>.ui-list__title:only-child){grid-template-columns:auto minmax(0,1fr) auto auto;grid-template-areas:"media body aside actions";align-items:center}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item:has(>.ui-list__body>.ui-list__title:only-child)>:is(.ui-list__aside,.ui-list__actions){margin-top:0}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item:has(>.ui-list__body>.ui-list__title:only-child)>.ui-list__aside{margin-inline-start:var(--ui-space-3);text-align:right}.ui-list:not(.ui-list--compact,.ui-skeleton--list)>.ui-list__item>.ui-list__panel{grid-column:1 / -1}}.ui-list__item--disclosure{flex-wrap:wrap}.ui-list__toggle{display:block;flex:1 1 0;min-width:0;min-height:24px;margin:0;padding:0;border:0;border-radius:var(--ui-radius-sm, 4px);background:none;color:inherit;font:inherit;text-align:left;cursor:pointer}.ui-list__toggle:focus-visible{outline:2px solid var(--ui-focus);outline-offset:2px}.ui-list__toggle>.ui-list__meta{display:block}@media (hover: hover){.ui-list__item--disclosure:not(.is-open):has(>.ui-list__toggle:hover){background:var(--ui-coll-hover)}}.ui-list__chev{display:inline-block;width:16px;height:16px;margin:0 4px 0 -2px;vertical-align:-3px;background:var(--ui-text-muted);-webkit-mask:var(--ui-chev) center / 16px no-repeat;mask:var(--ui-chev) center / 16px no-repeat;transition:transform .15s;--ui-chev: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M6 4l4 4-4 4' fill='none' stroke='black' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")}.ui-list__item--disclosure.is-open>.ui-list__toggle .ui-list__chev{transform:rotate(90deg)}@media (forced-colors: active){.ui-list__chev{forced-color-adjust:none;background:CanvasText}}.ui-list__panel{flex:1 0 100%;min-width:0;margin-top:var(--ui-space-2)}.ui-list__panel[hidden]{display:none}@media (pointer: coarse),(max-width: 47.9975em){.ui-list__toggle{min-height:44px}}@media (prefers-reduced-motion: reduce){.ui-list__chev{transition:none}}.ui-resource>.ui-bulkbar{margin-bottom:0;border-bottom-color:var(--ui-border)}.ui-resource>.ui-bulkbar:has(+.ui-list--flush){border-width:0 0 1px;border-radius:0}.ui-resource>.ui-list,.ui-resource>[aria-busy]>.ui-list{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.ui-list__check{display:flex;flex:none;align-items:center;justify-content:center;min-width:24px;min-height:24px;cursor:pointer}.ui-list__check:not(:last-child){margin-inline-end:8px}@media (pointer: coarse),(max-width: 47.9975em){.ui-list__check{min-width:44px;min-height:44px;margin-block:-2px;margin-inline-start:-12px}.ui-list__check:not(:last-child){margin-inline-end:-2px}.ui-resource>.ui-bulkbar>.ui-table__checkbox{min-width:44px;min-height:44px;margin:-8px -8px -8px -12px}}.ui-thumb{display:block;flex:none;width:40px;height:40px;box-sizing:border-box;border:1px solid var(--ui-border);border-radius:var(--ui-radius-md);background:var(--ui-surface-2);overflow:hidden;object-fit:cover}.ui-thumb--xs{width:24px;height:24px;border-radius:var(--ui-radius-sm)}.ui-thumb--md{width:60px;height:60px}.ui-thumb--lg{width:80px;height:80px}.ui-thumb>img{display:block;width:100%;height:100%;object-fit:cover}.ui-list--compact>.ui-list__item{display:block;padding:0;min-height:0}.ui-list__row{display:flex;align-items:center;gap:var(--ui-space-2);box-sizing:border-box;width:100%;min-height:36px;padding:8px 12px;border:0;background:none;color:var(--ui-text);font:inherit;font-size:var(--ui-fs-body);line-height:20px;text-align:left;text-decoration:none;border-radius:inherit}:is(a,button).ui-list__row{cursor:pointer}:is(a,button).ui-list__row:hover{background:var(--ui-coll-hover)}:is(a,button).ui-list__row:focus-visible{outline:2px solid var(--ui-focus);outline-offset:-2px}.ui-list__row[aria-current=page],.ui-list__row.is-selected{background:var(--ui-coll-selected)}.ui-list__icon{flex:none;display:inline-flex;width:20px;height:20px;align-items:center;justify-content:center;color:var(--ui-text-muted)}.ui-list__icon>svg{width:16px;height:16px}.ui-list__label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-list__row>.ui-list__meta{flex:none;margin:0;font-variant-numeric:tabular-nums}@media (pointer: coarse),(max-width: 47.9975em){.ui-list__row{min-height:44px}}.ui-list--activity>.ui-list__item{display:grid;grid-template-columns:20px minmax(0,1fr) auto;column-gap:var(--ui-space-2);align-items:start;padding:8px 12px;min-height:36px;border-top:0}.ui-list--activity>.ui-list__item:before{content:"";position:absolute;left:21.5px;top:0;bottom:0;width:1px;background:var(--ui-border)}.ui-list--activity>.ui-list__item:first-child:before{top:14px}.ui-list--activity>.ui-list__item:last-child:before{bottom:calc(100% - 14px)}.ui-list--activity>.ui-list__item:only-child:before{display:none}.ui-list__dot{position:relative;z-index:1;width:8px;height:8px;margin:6px 0 0 6px;border-radius:50%;background:var(--ui-text-muted);box-shadow:0 0 0 3px var(--ui-surface)}.ui-list__dot--success{background:var(--gemboss-success, #0a8f6a)}.ui-list__dot--warning{background:var(--gemboss-warning, #b25e09)}.ui-list__dot--critical{background:var(--gemboss-danger-strong, #c70a24)}.ui-list__dot--info{background:var(--gemboss-accent, #5661f5)}.ui-list--activity .ui-list__label{display:block;white-space:nowrap}.ui-list--activity a.ui-list__label{position:relative;color:var(--ui-text);text-decoration:none;padding-block:2px;margin-block:-2px}.ui-list--activity a.ui-list__label:hover{text-decoration:underline}.ui-list--activity a.ui-list__label:focus-visible{outline:2px solid var(--ui-focus);outline-offset:0;border-radius:4px}.ui-list--activity .ui-list__detail{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ui-text-muted);font-size:var(--ui-fs-caption);line-height:16px}.ui-list--activity time,.ui-list--activity .ui-list__time{color:var(--ui-text-muted);font-size:var(--ui-fs-caption);line-height:20px;white-space:nowrap;font-variant-numeric:tabular-nums}.ui-list__content{margin-top:4px;color:var(--ui-text);font-size:var(--ui-fs-body);line-height:20px;overflow-wrap:anywhere}.ui-list__content>p{margin:0}.ui-list__content>p+p{margin-top:4px}.ui-list--wrap>.ui-list__item>*>:is(.ui-list__label,.ui-list__detail,.ui-list__title){white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere}.ui-list--wrap>.ui-list__item>.ui-list__row{align-items:flex-start}@media (pointer: coarse),(max-width: 47.9975em){.ui-list--wrap>.ui-list__item>.ui-list__row{padding-block:12px}}.ui-list--wrap>.ui-list__item>.ui-list__row>.ui-list__meta{line-height:20px}.ui-cardgrid{--ui-cardgrid-min: 240px;display:grid;grid-template-columns:repeat(auto-fill,minmax(min(var(--ui-cardgrid-min),100%),1fr));gap:var(--ui-space-4);margin:0;padding:0;list-style:none}.ui-cardgrid[data-min="200"]{--ui-cardgrid-min: 200px}.ui-cardgrid[data-min="320"]{--ui-cardgrid-min: 320px}.ui-cardgrid>*{min-width:0}.ui-board{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(240px,1fr);gap:var(--ui-space-4);align-items:start;overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x mandatory;padding-bottom:4px}@media (max-width: 47.9975em){.ui-board{grid-auto-columns:78%}}.ui-board__col{display:flex;flex-direction:column;gap:var(--ui-space-2);min-width:0;padding:var(--ui-space-2);scroll-snap-align:start;background:var(--ui-coll-head-bg);border-radius:var(--ui-radius-lg)}.ui-board__head{display:flex;align-items:center;gap:var(--ui-space-2);min-height:28px;padding:0 4px;font-size:var(--ui-fs-body);font-weight:650}.ui-board__name{min-width:0;margin:0;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-board__count{margin-left:auto;color:var(--ui-text-muted);font-weight:450;font-variant-numeric:tabular-nums}.ui-board__dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--ui-text-muted)}.ui-board__dot--success{background:var(--gemboss-success, #0a8f6a)}.ui-board__dot--warning{background:var(--gemboss-warning, #b25e09)}.ui-board__dot--critical{background:var(--gemboss-danger-strong, #c70a24)}.ui-board__dot--info{background:var(--gemboss-accent, #5661f5)}.ui-board__list{display:grid;gap:var(--ui-space-2);margin:0;padding:0;list-style:none}.ui-board__list>li{min-width:0}.ui-board__empty{margin:0;padding:var(--ui-space-4) var(--ui-space-2);color:var(--ui-text-muted);font-size:var(--ui-fs-body);text-align:center;border:1px dashed var(--ui-border);border-radius:var(--ui-radius-md)}.ui-board__more>summary{list-style:none;justify-self:center;margin:4px auto 0;width:fit-content}.ui-board__more>summary::-webkit-details-marker{display:none}.ui-board__more[open]>summary{display:none}.ui-board__more{display:grid;gap:var(--ui-space-2)}.ui-board__next.ui-more{padding:4px 0 0}.ui-board__next .ui-more__error{color:var(--gemboss-danger-strong, #c70a24)}.ui-board[data-gb-move] .ui-board__list>li[data-id]{position:relative;border-radius:var(--ui-radius-lg);cursor:grab}.ui-board[data-gb-move] .ui-board__list>li[data-id]:focus-visible{outline:2px solid var(--ui-focus);outline-offset:2px}.ui-board__list>li[data-gb-lifted]{outline:2px solid var(--ui-focus);outline-offset:2px;box-shadow:var(--gemboss-shadow-raised);border-radius:var(--ui-radius-lg)}.ui-board[data-gb-dragging] .ui-board__list>li[data-gb-lifted]{outline:0;opacity:.4}.ui-board__col[data-gb-over]{background:color-mix(in srgb,var(--ui-focus) 10%,var(--ui-coll-head-bg))}.ui-board__list>li[data-gb-drop]:before{content:"";position:absolute;left:0;right:0;height:2px;border-radius:1px;background:var(--ui-focus);pointer-events:none}.ui-board__list>li[data-gb-drop=before]:before{top:-5px}.ui-board__list>li[data-gb-drop=after]:before{bottom:-5px}.ui-empty--no-match{padding-block:32px}.ui-coll-error{display:flex;flex-wrap:wrap;align-items:center;gap:var(--ui-space-2) var(--ui-space-3);margin:var(--ui-space-3)}.ui-coll-error>:first-child{flex:1 1 240px;min-width:0}.ui-coll-count{margin-left:auto;color:var(--ui-text-muted);font-size:var(--ui-fs-body);font-variant-numeric:tabular-nums;white-space:nowrap}.ui-chip__x{margin-right:-4px;font-size:14px;line-height:1;opacity:.7}:is(.ui-table-wrap,.ui-index,.ui-list,.ui-cardgrid,.ui-board)[aria-busy=true]{position:relative}:is(.ui-table-wrap,.ui-index,.ui-list,.ui-cardgrid,.ui-board)[aria-busy=true]>:not(.ui-bulkbar,.ui-coll-busy){opacity:.55;pointer-events:none;transition:opacity .15s}.ui-coll-busy{position:absolute;top:8px;right:8px;z-index:4}:is(.ui-skeleton--table,.ui-skeleton--list,.ui-skeleton--compact,.ui-skeleton--grid,.ui-skeleton--board) .ui-skeleton__line{height:8px;border-radius:4px}.ui-skeleton--table td .ui-skeleton__line{width:70%;margin-block:6px}.ui-skeleton--table td:first-child .ui-skeleton__line{width:85%}.ui-skeleton--table tbody tr:hover{background:none}.ui-skeleton__block{display:block;flex:none;width:40px;height:40px;border-radius:var(--ui-radius-md);background:var(--ui-surface-2)}.ui-skeleton__block--round{border-radius:50%;width:32px;height:32px}.ui-skeleton--list>.ui-list__item{align-items:center}.ui-skeleton--list .ui-list__body{display:grid;gap:12px}.ui-skeleton--list .ui-list__body>.ui-skeleton__line:last-child{width:60%}.ui-skeleton--compact .ui-list__row{gap:12px}.ui-skeleton--compact .ui-list__row>.ui-skeleton__line{flex:1 1 auto;max-width:60%}.ui-skeleton--grid .ui-card__body{display:grid;gap:12px;justify-items:stretch}.ui-skeleton--grid .ui-card__body>.ui-skeleton__line:last-child{width:50%}.ui-skeleton--board .ui-board__list>li{height:72px;border-radius:var(--ui-radius-md);background:var(--ui-surface)}@media (pointer: coarse){.ui-table__sort{min-height:44px;margin-block:-12px}.ui-table__checkbox{min-width:44px;min-height:44px;margin:-12px 0}}@media (pointer: coarse),(max-width: 47.9975em){.ui-table__sort{min-width:44px}}@media (prefers-reduced-motion: reduce){.ui-table--sticky-first :is(th,td):first-child{animation:none}:is(.ui-table-wrap,.ui-index,.ui-list,.ui-cardgrid,.ui-board)[aria-busy=true]>*{transition:none}.ui-board{scroll-behavior:auto}}
@@ -0,0 +1 @@
1
+ .ui-create-icon{display:grid;place-items:center;width:100%;height:100%;min-width:30px;min-height:30px;border-radius:var(--gemboss-radius-md, 8px);background:var(--gemboss-accent-soft, #eef0fe);color:var(--gemboss-accent, #5661f5)}.ui-create-steps{display:flex;align-items:center;gap:8px;margin:0;padding:0;list-style:none;font-size:var(--gemboss-fs-caption, 12px);color:var(--ui-text-muted)}.ui-create-step{display:flex;align-items:center;gap:6px;white-space:nowrap}.ui-create-step+.ui-create-step:before{content:"";width:24px;height:1px;margin-right:2px;background:var(--ui-border)}.ui-create-step__n{display:grid;place-items:center;width:20px;height:20px;box-sizing:border-box;border:1px solid var(--ui-border);border-radius:999px;font-size:var(--gemboss-fs-micro, 11px)}.ui-create-step--on{font-weight:600;color:var(--ui-text)}.ui-create-step--on .ui-create-step__n{border-color:var(--ui-text);background:var(--ui-text);color:var(--gemboss-surface, #fff)}.ui-create-step--done .ui-create-step__n{border-color:transparent;background:var(--gemboss-success-soft, #e6f4ee);color:var(--gemboss-success, #007f5f)}.ui-create-rail{display:flex;flex-direction:column;gap:20px;min-height:100%;box-sizing:border-box;padding:20px;background:var(--ui-surface)}.ui-create-rail__foot{margin:auto 0 0;font-size:var(--gemboss-fs-caption, 12px);line-height:1.5;color:var(--ui-text-muted)}.ui-create-group{display:flex;flex-direction:column;gap:8px}.ui-create-label{font-size:var(--gemboss-fs-micro, 11px);font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--ui-text-muted)}.ui-create-door{display:flex;align-items:center;gap:12px;width:100%;min-height:56px;padding:8px 12px;text-align:left;cursor:pointer;border:1px solid var(--ui-border);border-radius:var(--gemboss-radius-lg, 12px);background:var(--gemboss-surface, #fff);color:var(--ui-text);font:inherit}.ui-create-door:hover{border-color:var(--ui-text-muted)}.ui-create-door--on{border-color:var(--ui-text);box-shadow:inset 0 0 0 1px var(--ui-text)}.ui-create-door:disabled{opacity:.5;cursor:default}.ui-create-door__art{flex:none;display:grid;place-items:center;width:32px;height:32px;border-radius:var(--gemboss-radius-md, 8px);background:linear-gradient(160deg,#1d2058,#0d0f2e);color:#c7cbff}.ui-create-door--on .ui-create-door__art{color:#fff}.ui-create-door__col{display:flex;flex-direction:column;gap:2px;min-width:0}.ui-create-door__col b{font-size:var(--gemboss-fs-body, 14px);font-weight:600}.ui-create-door__col span{font-size:var(--gemboss-fs-caption, 12px);line-height:1.4;color:var(--ui-text-muted)}.ui-create-chips{display:flex;flex-wrap:wrap;gap:6px}.ui-create-chip{display:inline-flex;align-items:center;gap:6px;min-height:32px;padding:0 12px;cursor:pointer;border:1px solid var(--ui-border);border-radius:999px;background:var(--gemboss-surface, #fff);color:var(--ui-text);font:inherit;font-size:var(--gemboss-fs-caption, 12px)}.ui-create-chip--on{border-color:var(--ui-text);background:var(--ui-text);color:var(--gemboss-surface, #fff);font-weight:600}.ui-create-chip__n{opacity:.6}.ui-create-dot{flex:none;width:8px;height:8px;border-radius:999px;background:#a4a6ad}.ui-create-dot--cold{background:#5661f5}.ui-create-dot--warm{background:#c27c0e}.ui-create-dot--ready{background:#d9480f}.ui-create-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(240px,100%),1fr));gap:16px}.ui-create-card{display:flex;flex-direction:column;min-width:0;overflow:hidden;border:1px solid var(--ui-border);border-radius:var(--gemboss-radius-xl, 16px);background:var(--gemboss-surface, #fff)}.ui-create-card--on{border-color:var(--ui-text);box-shadow:inset 0 0 0 1px var(--ui-text)}.ui-create-card--dashed{border-style:dashed}.ui-create-card__pic{position:relative;height:150px}.ui-create-card__pic>.ui-stage{height:100%;box-sizing:border-box;border-radius:0}.ui-create-card__badge{position:absolute;top:8px;left:8px;z-index:1;padding:2px 8px;border-radius:999px;background:var(--gemboss-surface, #fff);color:var(--ui-text);font-size:var(--gemboss-fs-micro, 11px);font-weight:600}.ui-create-card__body{display:flex;flex:1 1 auto;flex-direction:column;gap:6px;padding:12px 16px 16px}.ui-create-card__eyebrow{display:flex;align-items:center;gap:6px;font-size:var(--gemboss-fs-micro, 11px);font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--ui-text-muted)}.ui-create-card__eyebrow--cold{color:#5661f5}.ui-create-card__eyebrow--warm{color:#a86a0a}.ui-create-card__eyebrow--ready{color:#c2410c}.ui-create-card__title{margin:0;font-size:var(--gemboss-fs-body-lg, 16px);font-weight:600;color:var(--ui-text)}.ui-create-card__line{margin:0;font-size:var(--gemboss-fs-body, 14px);line-height:1.45;color:var(--ui-text-muted)}.ui-create-card__inside{margin:0;font-size:var(--gemboss-fs-caption, 12px);line-height:1.5;color:var(--ui-text)}.ui-create-card__note{margin:0;font-size:var(--gemboss-fs-caption, 12px);line-height:1.5;color:var(--ui-text-muted)}.ui-create-card__act{display:flex;flex-wrap:wrap;gap:8px;margin-top:auto;padding-top:8px}.ui-stage.ui-create-pic{justify-content:center;gap:6px;padding:16px 20%}.ui-create-pic .ui-stage__tile{padding:6px 12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ui-create-pic__more{align-self:center;color:var(--ui-stage-ink-dim)}.ui-stage.ui-create-pic--path{padding:16px}.ui-create-path{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:6px}.ui-create-path__step{display:flex;align-items:center;gap:6px}.ui-create-path__arrow{color:var(--ui-stage-ink-dim)}.ui-create-path__tile{display:flex;flex-direction:column;align-items:center;gap:4px;max-width:76px;padding:6px;text-align:center;border:1px solid var(--ui-stage-glass-line);border-radius:var(--gemboss-radius-md, 8px);background:var(--ui-stage-glass);font-size:var(--gemboss-fs-micro, 11px);line-height:1.2}.ui-create-path__tile img{width:40px;height:40px;object-fit:cover;border-radius:var(--gemboss-radius-sm, 6px);background:#fff}@media (max-width: 47.9975em){.ui-create-step:not(.ui-create-step--on){display:none}.ui-create-step+.ui-create-step:before{display:none}}@media (pointer: coarse){.ui-create-chip{min-height:44px}}