@gemboss/ui 0.42.0 → 0.44.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.
- package/CHANGELOG.md +100 -0
- package/README.md +135 -7
- package/catalog/editor.html +1 -1
- package/catalog/index.html +147 -51
- package/gemboss-ui.css +3 -3
- package/package.json +10 -2
- package/parts/components.css +1 -1
- package/parts/core.css +2 -2
- package/parts/shell.css +1 -1
- package/src/assistant/engine.tsx +3 -2
- package/src/assistant-plain.js +1 -0
- package/src/assistant.css +1 -1
- package/src/briefing-card.css +1 -0
- package/src/briefing-card.tsx +50 -0
- package/src/editor.css +1 -1
- package/src/gemboss-tokens.css +1 -1
- package/src/icons.tsx +2 -0
- package/src/index.ts +8 -2
- package/src/progress-ring.css +1 -0
- package/src/progress-ring.tsx +65 -0
- package/src/question-card.css +1 -0
- package/src/question-card.tsx +116 -0
- package/src/range-bar.css +1 -0
- package/src/range-bar.tsx +102 -0
- package/src/reactions.tsx +32 -6
- package/src/spot-art.css +1 -0
- package/src/spot-art.tsx +130 -0
- package/src/team-chat-plain.js +1 -1
- package/src/team-chat.css +1 -1
- package/src/team-chat.tsx +106 -9
- package/src/theme-dark.css +1 -1
package/src/editor.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
@keyframes gemboss-editor-enter{0%{opacity:0}to{opacity:1}}@keyframes gemboss-editor-toast-in{0%{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%)}}@keyframes gemboss-pagepicker-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes gemboss-flyout-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}@keyframes gemboss-statusbar-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}.gemboss-platform-main:has(.gemboss-editor){box-sizing:border-box;height:100dvh;min-height:0;padding-top:0;padding-bottom:0;overflow:hidden}.gemboss-editor{--gemboss-editor-inset: 5px;position:fixed;inset:0;box-sizing:border-box;display:flex;flex-direction:column;background:var(--gemboss-canvas);overflow:hidden;z-index:400;animation:gemboss-editor-enter .26s cubic-bezier(.16,1,.3,1)}@media (prefers-reduced-motion: reduce){.gemboss-editor{animation:none}}.gemboss-editor--embedded{position:relative;inset:auto;height:100%;min-height:0;z-index:auto;animation:none}.gemboss-editor-toast{position:absolute;top:62px;left:50%;transform:translate(-50%);z-index:500;display:flex;align-items:center;gap:12px;max-width:min(560px,92vw);padding:12px 12px 12px 16px;background:var(--gemboss-text);color:#fff;border-radius:12px;font-size:13px;line-height:1.4;box-shadow:var(--gemboss-shadow-overlay);animation:gemboss-editor-toast-in .24s cubic-bezier(.16,1,.3,1)}.gemboss-editor-toast strong{font-weight:600}.gemboss-editor-toast button{flex:0 0 auto;border:0;background:#ffffff29;color:#fff;width:22px;height:22px;border-radius:8px;cursor:pointer;font-size:12px;line-height:1;transition:background var(--gemboss-transition-fast) ease}.gemboss-editor-toast button:hover{background:#ffffff47}.gemboss-editor-toast button:focus-visible{outline:2px solid #fff;outline-offset:2px}@media (prefers-reduced-motion: reduce){.gemboss-editor-toast{animation:none}}.gemboss-editor-topbar{flex:0 0 auto;height:var(--gemboss-editor-topbar-h, 52px);display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;padding:0 16px;background:var(--gemboss-surface);border-bottom:1px solid var(--gemboss-divider)}@media (min-width: 1001px){.gemboss-editor-topbar--theme{grid-template-columns:auto auto auto;justify-content:space-between}.gemboss-editor-topbar.gemboss-pageedit-top{grid-template-columns:auto fit-content(100%) auto}}.gemboss-editor-tb-left{display:flex;align-items:center;gap:12px;min-width:0}.gemboss-editor-tb-center{display:flex;align-items:center;gap:12px;justify-self:center}.gemboss-editor-topbar--theme .gemboss-editor-tb-center,.gemboss-editor-topbar.gemboss-pageedit-top .gemboss-editor-tb-center{min-width:0}.gemboss-editor-topbar.gemboss-pageedit-top .gemboss-pageedit-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media (max-width: 1200px){.gemboss-editor-topbar.gemboss-pageedit-top .gemboss-editor-tb-name,.gemboss-editor-topbar.gemboss-pageedit-top .gemboss-sec-type{display:none}}.gemboss-editor-tb-right{display:flex;align-items:center;gap:16px;min-width:0;justify-self:end}.gemboss-editor-back{border:0;background:transparent;padding:0;font-family:inherit;font-size:18px;line-height:1;color:var(--gemboss-text);text-decoration:none;cursor:pointer;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--gemboss-radius-md);transition:background var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease}.gemboss-editor-back:hover{background:var(--gemboss-hover)}.gemboss-editor-back:active{background:var(--gemboss-active-bg);color:var(--gemboss-active-fg)}.gemboss-editor-back:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-editor-tb-name{font-family:var(--gemboss-serif);font-size:15px;font-weight:600}.gemboss-editor-savestate{display:inline-flex;align-items:center;gap:6px;font-size:var(--gemboss-fs-micro);font-weight:500;line-height:1;padding:4px 8px;border-radius:var(--gemboss-radius-full);white-space:nowrap;transition:opacity .2s ease}.gemboss-editor-savestate.is-idle,.gemboss-editor-savestate.is-saving{color:var(--gemboss-text-muted)}.gemboss-editor-savestate.is-saved{color:var(--gemboss-success-strong);background:var(--gemboss-success-soft)}.gemboss-editor-savestate .gemboss-narr-spin{width:10px;height:10px;border-width:1.5px;border-color:var(--gemboss-divider);border-top-color:currentColor}@media (max-width: 760px){.gemboss-editor-savestate.is-saved{display:none}}.gemboss-editor-tb-ghost{font-size:13px;color:var(--gemboss-text);text-decoration:none;padding:8px 12px;border:1px solid var(--gemboss-divider);border-radius:8px;white-space:nowrap;cursor:pointer;background:var(--gemboss-surface);transition:border-color var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease,background var(--gemboss-transition-fast) ease}.gemboss-editor-tb-ghost:hover{border-color:var(--gemboss-primary)}.gemboss-editor-tb-ghost:active{background:var(--gemboss-active-bg);border-color:var(--gemboss-primary);color:var(--gemboss-active-fg)}.gemboss-editor-tb-ghost:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-editor-tb-ghost:disabled{opacity:.5;cursor:default;border-color:var(--gemboss-divider);color:var(--gemboss-text-muted)}.gemboss-editor-tb-publish{background:var(--gemboss-primary);color:#fff;border:0;border-radius:8px;box-sizing:border-box;height:var(--ui-btn-h, 28px);padding:0 12px;font-size:12px;font-weight:550;line-height:16px;cursor:pointer;white-space:nowrap;transition:background var(--gemboss-transition-fast) ease,filter var(--gemboss-transition-fast) ease}.gemboss-editor-tb-publish:hover{background:var(--gemboss-primary-dark)}.gemboss-editor-tb-publish:active{background:var(--gemboss-primary-dark);filter:brightness(.94)}.gemboss-editor-tb-publish:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-editor-tb-publish:disabled{opacity:.5;cursor:default;filter:none}.gemboss-editor-tb-undo{font-size:15px}.gemboss-editor-publish{position:relative;display:inline-flex;align-items:stretch}.gemboss-editor-publish-main{border-radius:8px 0 0 8px}.gemboss-editor-publish-caret{border-radius:0 8px 8px 0;padding:0 8px;font-size:12px;line-height:1;border-left:1px solid color-mix(in srgb,#fff 24%,transparent);display:inline-flex;align-items:center;justify-content:center}.gemboss-editor-publish-caret.active{filter:brightness(.94)}.gemboss-editor-menu-label{padding:6px 12px 2px;font-size:11px;font-weight:600;letter-spacing:.02em;color:var(--gemboss-text-muted);white-space:nowrap}.gemboss-editor-overflow{position:relative;display:inline-flex}.gemboss-editor-overflow-trigger{font-size:18px;line-height:1}.gemboss-editor-menu{position:fixed;z-index:500;min-width:210px;max-height:calc(100vh - 16px);overflow-y:auto;padding:6px;animation:gemboss-flyout-in var(--gemboss-transition-fast) ease}@media (prefers-reduced-motion: reduce){.gemboss-editor-menu{animation:none}}.gemboss-editor-menu-item{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-height:44px;padding:8px 12px;border:0;border-radius:var(--gemboss-radius-md);background:transparent;font:inherit;font-size:13px;color:var(--gemboss-text);text-align:left;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease}.gemboss-editor-menu-item:hover{background:var(--gemboss-hover)}.gemboss-editor-menu-item:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:-2px;background:var(--gemboss-hover)}.gemboss-editor-menu-item:disabled{opacity:.45;cursor:default}.gemboss-editor-menu-item:disabled:hover{background:transparent}.gemboss-editor-menu-item[aria-disabled=true]{color:var(--gemboss-text-muted);cursor:default}.gemboss-editor-menu-item[aria-disabled=true]:hover{background:transparent}.gemboss-editor-menu-why{display:block;font-size:12px;line-height:16px;color:var(--gemboss-text-muted)}.gemboss-editor-menu-item.active{color:var(--gemboss-active-fg)}.gemboss-editor-menu-ext{color:var(--gemboss-text-muted)}.gemboss-editor-menu-check{color:var(--gemboss-active-fg);font-weight:600}.gemboss-editor-menu-val{font-size:11px;color:var(--gemboss-text-muted);border:1px solid var(--gemboss-divider);border-radius:var(--gemboss-radius-sm);padding:1px 8px}.gemboss-editor-menu-sep{height:1px;background:var(--gemboss-divider-soft);margin:6px}.gemboss-editor-body{flex:1;min-height:0;display:flex;gap:0;padding:var(--gemboss-editor-inset);box-sizing:border-box}.gemboss-editor-body>.gemboss-ec,.gemboss-editor-body>.gemboss-editor-preview-pane{border:1px solid var(--gemboss-divider);border-radius:16px;overflow:hidden}.gemboss-editor-body>.gemboss-ec{border-right:1px solid var(--gemboss-divider)}.gemboss-ec-tabs{display:flex;gap:var(--ui-space-1);padding:var(--ui-space-2) var(--gemboss-ec-inset, 12px);border-bottom:1px solid var(--gemboss-divider);flex:none;overflow-x:auto;scrollbar-width:thin;overscroll-behavior-x:contain}.gemboss-ec-tabs>[role=tab]{flex:1 1 0;min-width:max-content;white-space:nowrap;font:inherit;font-size:12px;font-weight:550;line-height:16px;cursor:pointer;box-sizing:border-box;min-height:var(--ui-btn-h, 28px);padding:0 var(--ui-space-3);border-radius:8px;display:flex;align-items:center;justify-content:center;gap:6px;border:1px solid transparent;background:transparent;color:var(--gemboss-text-muted);box-shadow:none}.gemboss-ec-tabs>[role=tab]:hover:not([aria-selected=true]){color:var(--gemboss-text);background:var(--gemboss-primary-soft)}.gemboss-ec-tabs>[role=tab]:focus-visible{outline:2px solid var(--ui-focus);outline-offset:-2px}.gemboss-ec-tabs>[role=tab][aria-selected=true]{border-color:var(--gemboss-divider);background:var(--gemboss-surface);color:var(--gemboss-text);box-shadow:inset 0 -2px 0 var(--gemboss-primary)}@media (max-width: 47.9975em){.gemboss-ec-tabs>[role=tab]{min-height:44px}}.gemboss-pv{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--gemboss-preview-canvas);overflow:hidden}.ui-seg.gemboss-pv-devices>button.gemboss-pv-device{width:calc(var(--ui-btn-h) - 2px);height:calc(var(--ui-btn-h) - 2px);border:0;border-radius:0}@media (pointer: coarse),(max-width: 47.9975em){.ui-seg.gemboss-pv-devices>button.gemboss-pv-device{width:44px;height:44px}}.gemboss-pv-device{border:1px solid var(--gemboss-divider);background:var(--gemboss-surface);cursor:pointer;width:28px;height:28px;border-radius:8px;color:var(--gemboss-text-muted);font-size:14px;display:inline-flex;align-items:center;justify-content:center;line-height:1;transition:border-color var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease,background var(--gemboss-transition-fast) ease}.gemboss-pv-device svg{display:block}.gemboss-editor-tb-tools{display:flex;align-items:center;gap:16px;min-width:0}@media (max-width: 1200px){.gemboss-editor-tb-tools{display:none}}.gemboss-pv-device:hover{border-color:var(--gemboss-primary);color:var(--gemboss-active-fg)}.gemboss-pv-device:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-pv-device.active{border-color:var(--gemboss-primary);color:var(--gemboss-active-fg);background:var(--gemboss-active-bg)}.gemboss-pagepicker{position:relative;display:inline-flex}.gemboss-pagepicker-trigger{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 8px 0 12px;border-radius:8px;border:1px solid var(--gemboss-divider);background:var(--gemboss-surface);cursor:pointer;font-size:13px;font-weight:600;color:var(--gemboss-text);line-height:1;transition:border-color var(--gemboss-transition-fast) ease,background var(--gemboss-transition-fast) ease}.gemboss-pagepicker-trigger:hover{border-color:var(--gemboss-primary)}.gemboss-pagepicker-trigger[aria-expanded=true]{border-color:var(--gemboss-primary);background:var(--gemboss-active-bg, var(--gemboss-danger-soft))}.gemboss-pagepicker-trigger-icon{display:inline-flex;color:var(--gemboss-text-muted)}.gemboss-pagepicker-trigger-icon svg{display:block}.gemboss-pagepicker-trigger-label{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gemboss-pagepicker-caret{font-size:9px;color:var(--gemboss-text-muted);margin-left:1px}.gemboss-pagepicker-menu{position:fixed;z-index:500;padding:8px;display:flex;flex-direction:column;gap:6px;animation:gemboss-pagepicker-in .14s cubic-bezier(.16,1,.3,1)}@media (prefers-reduced-motion: reduce){.gemboss-pagepicker-menu{animation:none}}.gemboss-pagepicker-search{position:relative;display:flex;align-items:center}.gemboss-pagepicker-search-icon{position:absolute;left:10px;display:inline-flex;color:var(--gemboss-text-muted);pointer-events:none}input.gemboss-pagepicker-search-input{width:100%;padding-left:32px}.gemboss-pagepicker-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px;max-height:320px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(31,30,29,.22) transparent}.gemboss-pagepicker-item{width:100%;display:flex;align-items:center;gap:12px;border:0;background:transparent;cursor:pointer;text-align:left;padding:8px 12px;border-radius:var(--gemboss-radius-md);font-size:var(--gemboss-fs-body);color:var(--gemboss-text)}.gemboss-pagepicker-item:hover,.gemboss-pagepicker-item:focus-visible{background:var(--gemboss-hover, rgba(0,0,0,.05));outline:none}.gemboss-pagepicker-item.active{background:var(--gemboss-active-bg, var(--gemboss-danger-soft));color:var(--gemboss-active-fg);font-weight:600}.gemboss-pagepicker-item-icon{display:inline-flex;color:var(--gemboss-text-muted);flex:0 0 auto}.gemboss-pagepicker-item.active .gemboss-pagepicker-item-icon{color:var(--gemboss-active-fg)}.gemboss-pagepicker-item-icon svg{display:block}.gemboss-pagepicker-item-label{flex:1;min-width:0}.gemboss-pagepicker-check{color:var(--gemboss-active-fg);font-size:13px;flex:0 0 auto}.gemboss-pagepicker-empty{padding:12px;font-size:13px;color:var(--gemboss-text-muted)}.gemboss-pagepicker-note{padding:8px 12px 12px;font-size:12px;line-height:1.5;color:var(--gemboss-text-muted);border-bottom:1px solid var(--gemboss-divider)}.gemboss-pagepicker-note-link{color:var(--gemboss-primary);font-weight:600;text-decoration:none}.gemboss-pagepicker-note-link:hover{text-decoration:underline}.gemboss-pagepicker-back{display:flex;align-items:center;gap:6px;width:100%;border:0;background:transparent;cursor:pointer;text-align:left;padding:4px 6px 8px;margin-bottom:2px;border-bottom:1px solid var(--gemboss-divider-soft, #edeff2);font-size:13px;font-weight:600;color:var(--gemboss-text)}.gemboss-pagepicker-back:hover{color:var(--gemboss-active-fg)}.gemboss-pagepicker-back:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-pagepicker-back-icon{display:inline-flex;color:var(--gemboss-text-muted)}.gemboss-pagepicker-back-icon svg{display:block}.gemboss-pagepicker-drill{display:inline-flex;color:var(--gemboss-text-muted);flex:0 0 auto}.gemboss-pagepicker-drill svg{display:block}.gemboss-pagepicker-thumb{width:30px;height:30px;flex:0 0 auto;border-radius:8px;object-fit:cover;border:1px solid var(--gemboss-divider);background:var(--gemboss-panel-bg, #ffffff)}.gemboss-pagepicker-thumb--default{display:inline-flex;align-items:center;justify-content:center;color:var(--gemboss-text-muted)}.gemboss-pagepicker-thumb--default svg{width:16px;height:16px}.gemboss-pv-stage{flex:1;min-height:0;overflow:hidden;display:flex;justify-content:center;padding:0}.gemboss-pv-frame{background:var(--gemboss-surface);overflow:hidden;height:100%;position:relative}.gemboss-pv-frame.desktop{width:100%;max-width:none}.gemboss-pv-frame.gemboss-pv-fit.desktop{position:absolute;top:0;left:0;width:var(--gemboss-pv-w, 100%);height:var(--gemboss-pv-h, 100%);transform:scale(calc(var(--gemboss-pv-scale, 1) * var(--gemboss-pv-user-zoom, 1)));transform-origin:top left}.gemboss-pv-frame.mobile{width:390px;flex:0 0 390px;align-self:center;margin:16px 0;border:1px solid var(--gemboss-divider);border-radius:20px;box-shadow:var(--gemboss-shadow-overlay)}.gemboss-pv-frame.tablet{width:768px;flex:0 0 768px;align-self:center;margin:16px 0;border:1px solid var(--gemboss-divider);border-radius:16px;box-shadow:var(--gemboss-shadow-overlay)}.gemboss-pv-iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:var(--gemboss-surface);transition:opacity .18s ease}.gemboss-pv-empty{margin:auto;text-align:center;max-width:340px;display:flex;flex-direction:column;align-items:center;gap:8px}.gemboss-pv-empty-art{font-size:40px;line-height:1;opacity:.7}.gemboss-pv-empty-title{font-family:var(--gemboss-serif);font-size:18px;margin:0}.gemboss-pv-empty-sub{font-size:13px;color:var(--gemboss-text-muted);margin:0;line-height:1.5}.gemboss-pv-empty-cta{margin-top:6px;font-size:13px;font-weight:600;color:var(--gemboss-active-fg);text-decoration:none}.gemboss-pv-empty-cta:hover{text-decoration:underline}.gemboss-pv-spin{width:22px;height:22px;border:2px solid var(--gemboss-divider-soft);border-top-color:var(--gemboss-primary);border-radius:50%;animation:gemboss-spin .7s linear infinite}.gemboss-editor-resizer{flex:0 0 var(--gemboss-editor-inset);align-self:stretch}body.ui-resizing .gemboss-pv-iframe{pointer-events:none}.gemboss-editor-chat-toggle{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--gemboss-divider);background:var(--gemboss-surface);border-radius:var(--gemboss-radius-md);cursor:pointer;font-size:14px;line-height:1;color:var(--gemboss-text-muted);transition:border-color var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease}.gemboss-editor-chat-toggle:hover{border-color:var(--gemboss-primary);color:var(--gemboss-active-fg)}.gemboss-editor-chat-toggle:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-editor-chat-toggle.collapsed{border-color:var(--gemboss-primary);color:var(--gemboss-active-fg)}.gemboss-editor-chat-toggle svg{display:block}.gemboss-editor-body .gemboss-ec{transition:flex-basis .28s cubic-bezier(.16,1,.3,1),width .28s cubic-bezier(.16,1,.3,1)}body.ui-resizing .gemboss-editor-body .gemboss-ec{transition:none;will-change:flex-basis,width}body.ui-resizing .gemboss-editor-body .gemboss-pv{will-change:flex-basis}.gemboss-editor-body.is-chat-collapsed .gemboss-ec{border-width:0;overflow:hidden}.gemboss-editor-body.is-chat-collapsed>.gemboss-ec{visibility:hidden}.gemboss-editor-body.is-chat-collapsed .gemboss-editor-resizer{display:none}.gemboss-pagepicker-list::-webkit-scrollbar{width:9px}.gemboss-pagepicker-list::-webkit-scrollbar-track{background:transparent}.gemboss-pagepicker-list::-webkit-scrollbar-thumb{background:#1f1e1d33;border-radius:6px;border:2px solid transparent;background-clip:content-box}@media (max-width: 1000px){.gemboss-editor-body{flex-direction:column;gap:var(--gemboss-editor-inset)}}@media (max-width: 1000px){.gemboss-editor-resizer{display:none}.gemboss-editor-body.is-chat-collapsed .gemboss-ec{max-height:0;min-height:0}.gemboss-editor-topbar{height:auto;grid-template-columns:auto minmax(0,1fr);grid-template-areas:"left right" "center center";gap:8px 12px;padding:8px 12px}.gemboss-editor-tb-left{grid-area:left}.gemboss-editor-tb-right{padding-block:6px;grid-area:right;min-width:0;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.gemboss-editor-tb-center{grid-area:center;justify-self:stretch;justify-content:flex-start;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.gemboss-editor-tb-right::-webkit-scrollbar,.gemboss-editor-tb-center::-webkit-scrollbar{display:none}.gemboss-editor-tb-right>*{flex:0 0 auto}.gemboss-editor-tb-right>.gemboss-editor-tb-publish{position:sticky;right:0;z-index:1;box-shadow:-8px 0 8px -6px color-mix(in srgb,var(--gemboss-text) 18%,transparent)}.gemboss-editor-tb-name{display:none}.gemboss-editor-tb-ghost{padding:6px 12px;font-size:12px}.gemboss-editor-tb-publish{padding:8px 16px;font-size:13px}}@media (max-width: 640px){.gemboss-pv-frame.mobile{width:100%;max-width:390px;flex:0 1 auto;margin:8px 0}.gemboss-pv-frame.tablet{width:100%;max-width:768px;flex:0 1 auto;margin:8px 0}}.gemboss-editor-preview-pane{display:flex}.gemboss-editor-mobile-tabs{display:none}.gemboss-editor-dock{position:absolute;top:0;right:0;bottom:0;width:320px;max-width:90%;z-index:5;overflow-y:auto;background:var(--gemboss-surface);border-left:1px solid var(--gemboss-divider);box-shadow:var(--gemboss-shadow-overlay)}.gemboss-editor-preview-pane:has(>.gemboss-editor-dock){position:relative}:where(.gemboss-editor-body>.gemboss-ec){position:relative;width:var(--gemboss-chat-w, 384px);flex:0 0 var(--gemboss-chat-w, 384px);display:flex;flex-direction:column;background:var(--gemboss-panel-bg);border-right:1px solid var(--gemboss-divider);overflow:hidden}:where(.gemboss-editor-preview-pane){flex:1;min-width:0}@media (max-width: 1000px){:where(.gemboss-editor-body>.gemboss-ec){width:auto;flex:0 0 auto;max-height:48%}}@media (max-width: 760px){.gemboss-editor-resizer{display:none}.gemboss-editor-body .gemboss-ec{flex:1 1 auto;width:100%;min-width:0;max-height:none;border-right:none}.gemboss-editor-body .gemboss-editor-preview-pane{flex:1 1 auto}.gemboss-editor-body[data-mobile-pane=chat] .gemboss-editor-preview-pane,.gemboss-editor-body[data-mobile-pane=preview] .gemboss-ec{display:none}.gemboss-editor-mobile-tabs{display:flex;flex:0 0 auto;gap:6px;padding:6px;padding-bottom:calc(6px + env(safe-area-inset-bottom));background:var(--gemboss-surface);border-top:1px solid var(--gemboss-divider)}.gemboss-editor-mobile-tab{flex:1 1 0;height:44px;border:0;border-radius:8px;background:transparent;color:var(--gemboss-text-muted);font:inherit;font-size:13px;font-weight:600;cursor:pointer}.gemboss-editor-mobile-tab.active{background:var(--gemboss-active-bg);color:var(--gemboss-active-fg)}}.gemboss-editor-statusbar{position:absolute;top:60px;right:14px;z-index:480;max-width:min(380px,calc(100vw - 28px));padding:8px 16px;font-size:12px;line-height:1.4;color:var(--gemboss-text-muted);background:var(--gemboss-surface);border:1px solid var(--gemboss-divider);border-radius:12px;box-shadow:var(--gemboss-shadow-raised);pointer-events:none;animation:gemboss-statusbar-in .18s cubic-bezier(.16,1,.3,1) both}.gemboss-editor-statusbar.done{background:#eaf6ef;color:#1f7a4d;border-color:var(--gemboss-success-border)}.gemboss-editor-statusbar.error{background:#fdecea;color:var(--gemboss-danger);border-color:#f3c2bb}@media (pointer: coarse){.gemboss-pv-device{width:38px;height:38px;font-size:16px}.gemboss-editor-back{width:44px;height:44px;font-size:20px}.gemboss-editor-chat-toggle{width:44px;height:44px;font-size:16px}}@media (pointer: coarse){.gemboss-editor-tb-ghost{padding:8px 16px;min-height:44px}.gemboss-editor-tb-publish{padding:12px 20px;min-height:44px}.gemboss-pagepicker-trigger{min-height:44px}}@media (pointer: coarse){.gemboss-ec-tab{min-height:44px}}@media (max-width: 760px){.gemboss-editor-chat-toggle{display:none}}.gemboss-pageedit{position:fixed;inset:0;display:flex;flex-direction:column;background:var(--gemboss-panel-bg,#ffffff);z-index:320}.gemboss-pageedit-top{background:#fff;border-bottom:1px solid var(--gemboss-divider,#e5e7ea)}.gemboss-pageedit .gemboss-editor-tb-center{display:flex;align-items:center;gap:12px;justify-content:center}.gemboss-pageedit .gemboss-editor-tb-right{display:flex;align-items:center;gap:12px;min-width:0}.gemboss-pageedit .gemboss-editor-tb-right>:first-child{margin-inline-start:auto}.gemboss-pageedit .gemboss-editor-tb-left{--gemboss-tb-gap:12px;display:flex;align-items:center;gap:var(--gemboss-tb-gap);min-width:0}.gemboss-pageedit-title{font-family:var(--gemboss-serif,inherit);font-size:15px;font-weight:600;color:var(--gemboss-text,#1b1c1e);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:32ch}.gemboss-pageedit-notice{display:flex;flex-wrap:wrap;align-items:center;gap:12px;flex:0 0 auto;padding:12px 16px;background:var(--gemboss-surface);border-bottom:1px solid var(--gemboss-divider);color:var(--gemboss-text);font-size:13px;line-height:1.5}.gemboss-pageedit-notice span{flex:1 1 240px;min-width:0}.gemboss-pageedit-notice button{min-height:44px;padding:8px 12px;flex:0 0 auto;border:1px solid var(--gemboss-divider);border-radius:8px;background:var(--gemboss-surface);color:var(--gemboss-text);cursor:pointer}@media (max-width:900px){.gemboss-pageedit-top{height:auto;grid-template-columns:minmax(0,1fr);grid-template-areas:"left" "right" "center";gap:8px;padding:8px 12px}.gemboss-pageedit-top .gemboss-editor-tb-right{flex-wrap:wrap;overflow:visible}.gemboss-pageedit-top .gemboss-editor-tb-right button{min-height:44px}.gemboss-pageedit .gemboss-editor-tb-left{width:100%;overflow:hidden;flex-wrap:wrap}.gemboss-pageedit .gemboss-editor-tb-right,.gemboss-pageedit .gemboss-editor-tb-center{justify-self:stretch;justify-content:flex-start;max-width:100%;overflow-x:auto}.gemboss-pageedit-top .gemboss-editor-tb-center{flex-wrap:wrap;row-gap:8px;overflow:visible}}.gemboss-sec-type{font-size:11px;font-weight:700;letter-spacing:.02em;padding:2px 8px;border-radius:12px;background:#f1efe9;color:var(--gemboss-text-muted);text-transform:capitalize}.gemboss-sec-insert-wrap{position:relative}.gemboss-sec-insert-menu{position:absolute;top:42px;right:0;width:280px;max-height:60vh;overflow-y:auto;padding:6px;z-index:80}.gemboss-sec-insert-item{width:100%;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 12px;border:0;background:transparent;border-radius:8px;cursor:pointer;text-align:left;font-size:13px;color:var(--gemboss-text,#1b1c1e);transition:background .12s ease,color .12s ease}.gemboss-sec-insert-item:hover{background:var(--gemboss-hover,rgba(0,0,0,.04))}.gemboss-sec-insert-item:focus-visible{outline:2px solid var(--gemboss-primary, #1b1c1e);outline-offset:-2px;background:var(--gemboss-hover,rgba(0,0,0,.04))}.gemboss-sec-insert-item:disabled{opacity:.6;cursor:default}.gemboss-sec-insert-item:disabled:hover{background:transparent}.gemboss-sec-insert-cat{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted,#686b71);text-transform:capitalize}.gemboss-sec-insert-empty{display:block;padding:16px;font-size:13px;color:var(--gemboss-text-muted,#686b71);text-decoration:none}.gemboss-pageedit-scope{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted,#686b71);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}@media (max-width:1200px){.gemboss-pageedit-scope{display:none}}.gemboss-pageedit-pv{flex:1;min-width:0;background:var(--gemboss-preview-canvas);display:flex;justify-content:center;overflow:auto;position:relative}.gemboss-pageedit-pv .gemboss-pv-frame iframe{width:100%;height:100%;border:0;background:#fff;display:block}.gemboss-pageedit-chip{display:flex;align-items:center;gap:8px;margin:0 12px 8px;padding:6px 12px;border-radius:8px;background:var(--gemboss-active-bg);border:1px solid var(--gemboss-divider);font-size:12px;color:var(--gemboss-active-fg)}.gemboss-pageedit-chip button{margin-left:auto;border:0;background:transparent;color:var(--gemboss-active-fg);cursor:pointer;font-size:12px}.gemboss-pageedit-standing{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:8px 16px;background:#b07d1817;border-bottom:1px solid rgba(176,125,24,.28);font-size:13px;line-height:1.5;color:#7a5710}.gemboss-pageedit-standing code{font-size:12px;background:#b07d1824;border-radius:4px;padding:2px 4px}.gemboss-pageedit-standing button{margin-left:auto;flex:0 0 auto;border:1px solid rgba(176,125,24,.4);background:#fff;color:#7a5710;border-radius:8px;padding:4px 12px;font:inherit;font-weight:600;cursor:pointer}.gemboss-pageedit-standing button:disabled{opacity:.6;cursor:default}.gemboss-picker-backdrop{position:fixed;inset:0;background:#1f1e1d38;z-index:70}.gemboss-picker-head{flex:0 0 auto;height:52px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid var(--gemboss-divider,#e5e7ea);font-weight:600;font-size:15px}.gemboss-picker-head button{border:0;background:transparent;font-size:15px;cursor:pointer;color:var(--gemboss-text-muted,#686b71)}.gemboss-picker-empty{padding:20px;text-align:center;color:var(--gemboss-text-muted,#686b71);font-size:13px}.gemboss-layers{position:fixed;top:0;left:0;bottom:0;width:300px;background:#fff;border-right:1px solid var(--gemboss-divider,#e5e7ea);box-shadow:8px 0 30px #1f1e1d1f;z-index:71;display:flex;flex-direction:column}.gemboss-layers-list{flex:1;min-height:0;overflow-y:auto;padding:8px 12px;display:flex;flex-direction:column;gap:4px}.gemboss-layer{display:flex;align-items:center;gap:4px;border:1px solid transparent;border-radius:8px;padding:0 4px 0 6px}.gemboss-layer:hover{background:var(--gemboss-hover,rgba(0,0,0,.04))}.gemboss-layer.is-sel{border-color:var(--gemboss-primary, #1b1c1e);background:var(--gemboss-active-bg)}.gemboss-layer-main{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:1px;background:transparent;border:0;cursor:pointer;text-align:left;padding:8px 4px}.gemboss-layer-type{font-size:13px;font-weight:600;color:var(--gemboss-text,#1b1c1e)}.gemboss-layer-head{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted,#686b71);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:195px}.gemboss-layer-acts{display:flex;gap:0;flex:0 0 auto}.gemboss-layer-acts button{width:26px;height:26px;border:0;background:transparent;border-radius:6px;cursor:pointer;color:var(--gemboss-text-muted,#686b71);font-size:13px;line-height:1}.gemboss-layer-acts button:hover:not(:disabled){background:var(--gemboss-hover,rgba(0,0,0,.07))}.gemboss-layer-acts button:disabled{opacity:.28;cursor:default}.gemboss-layer-del:hover:not(:disabled){color:#c0392b}@media (pointer: coarse){.gemboss-layer{flex-wrap:wrap}.gemboss-layer-acts{margin-left:auto}.gemboss-layer-acts button{width:44px;height:44px;font-size:15px}.gemboss-layer-main{flex:1 1 140px;min-height:44px;justify-content:center}.gemboss-layer-head{max-width:100%}}.gemboss-layer-grip{flex:0 0 auto;width:12px;margin-right:-2px;color:var(--gemboss-text-muted,#686b71);font-size:11px;letter-spacing:-2px;line-height:1;text-align:center;cursor:grab;user-select:none}.gemboss-layer[draggable=true]{cursor:grab}.gemboss-layer.is-dragging{opacity:.4}.gemboss-layer[data-drop=before]{box-shadow:0 -2px 0 var(--gemboss-primary, #1b1c1e)}.gemboss-layer[data-drop=after]{box-shadow:0 2px 0 var(--gemboss-primary, #1b1c1e)}.gemboss-layer.is-hidden .gemboss-layer-main{opacity:.5}.gemboss-layer-acts .gemboss-layer-eye{display:inline-grid;place-items:center}.gemboss-layer-acts .gemboss-layer-eye[aria-pressed=true]{color:var(--gemboss-text,#1b1c1e)}.gemboss-layers[hidden],.gemboss-settings[hidden],.gemboss-picker-backdrop[hidden]{display:none}.gemboss-settings{position:fixed;top:0;right:0;bottom:0;width:min(380px,100%);box-sizing:border-box;background:#fff;border-left:1px solid var(--gemboss-divider,#e5e7ea);box-shadow:-8px 0 30px #1f1e1d1f;z-index:71;display:flex;flex-direction:column}.gemboss-settings-body{flex:1;min-height:0;overflow-y:auto;padding:16px 20px;display:flex;flex-direction:column;gap:12px}.gemboss-settings-grouphead{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:4px;padding-top:16px;border-top:1px solid var(--gemboss-divider,#e5e7ea)}.gemboss-settings-grouphead>span{font-size:var(--gemboss-fs-caption);font-weight:700;color:var(--gemboss-text,#1b1c1e)}.gemboss-settings-gen{border:1px solid var(--gemboss-divider,#e5e7ea);background:var(--gemboss-surface,#fff);border-radius:999px;padding:4px 12px;font-size:12px;font-weight:600;font-family:inherit;color:var(--gemboss-text,#1b1c1e);cursor:pointer;white-space:nowrap}.gemboss-settings-gen:hover:not(:disabled){background:var(--gemboss-hover,#eceef2)}.gemboss-settings-gen:disabled{opacity:.55;cursor:default}.gemboss-settings-field{display:flex;flex-direction:column;gap:6px}.gemboss-settings-note{margin:0 0 4px;font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted);line-height:1.5}.gemboss-settings-error{margin:0 0 8px;padding:8px 12px;border-radius:8px;font-size:var(--gemboss-fs-caption);line-height:1.45;color:#8a1c1c;background:#fdecec;border:1px solid #f5c2c2}.gemboss-settings-field>span{font-size:13px;font-weight:450;color:var(--gemboss-text-muted)}.gemboss-settings-field :is(input,textarea,select):not([type=color]){width:100%}.gemboss-settings-field small{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted,#686b71)}.gemboss-settings-field textarea.gemboss-mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;line-height:1.5}.gemboss-settings-handle span{color:var(--gemboss-text-muted,#686b71);white-space:nowrap}.gemboss-settings-foot{flex:0 0 auto;display:flex;justify-content:flex-end;gap:12px;padding:12px 20px;border-top:1px solid var(--gemboss-divider,#e5e7ea)}.gemboss-settings-cancel{background:transparent;border:1px solid var(--gemboss-divider,#e5e7ea);border-radius:8px;font-size:13px;font-weight:600;padding:8px 16px;cursor:pointer;color:var(--gemboss-text,#1b1c1e)}.gemboss-settings-save{background:var(--gemboss-primary, #1b1c1e);color:#fff;border:0;border-radius:8px;font-size:13px;font-weight:700;padding:8px 20px;cursor:pointer}.gemboss-settings-save:disabled{opacity:.6;cursor:default}.gemboss-page-section-content :is(button:where(:not(.gemboss-ei-help)),input,textarea){min-height:44px;min-width:44px}.gemboss-pageedit .gemboss-pv-device{width:44px;height:44px;flex-shrink:0}.gemboss-pageedit .gemboss-ec-dock-body :is(button:where(:not(.gemboss-ei-help)),input,select){min-height:44px}.gemboss-bundle-look .gemboss-ei-body :is(button:where(:not(.gemboss-ei-help)),input){min-height:44px}.gemboss-bundle-look .gemboss-ei-body input[type=color]{min-width:44px}.gemboss-page-draft-status{flex:0 0 auto;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:8px;padding:8px 12px;border-radius:8px;background:var(--gemboss-surface,#fff);color:var(--gemboss-text,#1b1c1e);font-size:12px;line-height:1.5;box-shadow:0 1px 6px #0001}.gemboss-page-draft-status button{min-height:44px;min-width:44px;padding:8px 12px;border:1px solid var(--gemboss-divider);border-radius:6px;background:var(--gemboss-surface,#fff);cursor:pointer}.gemboss-page-draft-status button:hover{background:var(--gemboss-hover,#eceef2)}.gemboss-page-draft-status button:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.gemboss-page-draft-status[data-page-preview-state=ready]{pointer-events:none}.gemboss-pageedit .gemboss-pageedit-pv{flex-direction:column;min-height:0;justify-content:flex-start}.gemboss-page-draft-stage{flex:1;min-height:0;position:relative;overflow:hidden;display:flex;justify-content:center}@media (max-width:1000px){.gemboss-pageedit .gemboss-editor-body>.gemboss-ec{flex:0 0 auto;height:44%;min-height:min(520px,76%);max-height:76%}}.gemboss-ei{position:absolute;top:12px;right:12px;z-index:6;width:320px;max-width:calc(100% - 24px);display:flex;flex-direction:column;max-height:calc(100% - 24px);background:var(--gemboss-surface);border:1px solid var(--gemboss-divider);border-radius:var(--gemboss-radius-xl);box-shadow:var(--gemboss-shadow-overlay);overflow:hidden}.gemboss-ei--docked{position:static;top:auto;right:auto;width:100%;max-width:none;height:100%;max-height:none;border:0;border-radius:0;box-shadow:none;background:transparent;flex:1;min-height:0}.gemboss-ei-head{display:flex;align-items:center;gap:8px;padding:12px;border-bottom:1px solid var(--gemboss-divider)}.gemboss-ec>.gemboss-ei-head{padding-inline:var(--gemboss-ec-inset,12px)}.gemboss-ec .gemboss-ei--docked .gemboss-ei-head{padding-inline:var(--gemboss-ec-inset,12px)}.gemboss-ec .gemboss-ei--docked .gemboss-ei-tabs{margin-inline:var(--gemboss-ec-inset,12px)}:is(.gemboss-settings-body,.gemboss-ec-dock-body) .gemboss-ei-tabs{margin-inline:0}.gemboss-ec .gemboss-ei--docked .gemboss-ei-pane{padding-inline:var(--gemboss-ec-inset,16px)}.gemboss-ei-title{font-size:var(--gemboss-fs-body);font-weight:700;line-height:1.2;min-width:0;overflow:hidden}.gemboss-ei-title small{display:block;font-weight:500;font-size:11px;color:var(--gemboss-text-muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gemboss-ei-act,.gemboss-ei-x{margin-left:auto;width:26px;height:26px;flex:none;border:0;background:transparent;cursor:pointer;color:var(--gemboss-text-muted);border-radius:6px;display:grid;place-items:center;font-size:14px}.gemboss-ei-x{margin-left:2px;font-size:13px}.gemboss-ei-act:hover,.gemboss-ei-x:hover{background:var(--gemboss-hover);color:var(--gemboss-text)}.gemboss-ei-act:disabled{opacity:.5;cursor:default}.gemboss-ei-tabs{display:flex;gap:2px;margin:8px 12px 0;background:var(--gemboss-panel-bg);padding:4px;border-radius:8px}.gemboss-ei-tab{flex:1;border:0;background:transparent;cursor:pointer;color:var(--gemboss-text-muted);font-weight:550;font-size:12px;line-height:16px;padding:6px 4px;border-radius:6px;display:flex;align-items:center;justify-content:center;gap:6px}.gemboss-ei-tab.on{background:var(--gemboss-surface);color:var(--gemboss-text);box-shadow:var(--gemboss-shadow-resting)}.gemboss-ei-body{flex:1;min-height:0;overflow-y:auto;scrollbar-width:thin;padding:2px 0 4px}.gemboss-ei-body::-webkit-scrollbar{width:9px}.gemboss-ei-body::-webkit-scrollbar-thumb{background:#1f1e1d33;border-radius:6px;border:2px solid var(--gemboss-surface);background-clip:content-box}.gemboss-ei-pane{padding:4px 16px 6px}.gemboss-ei-note{margin:0 0 8px;padding:8px 12px;border-radius:8px;background:var(--gemboss-hover,#eceef2);border:1px solid var(--gemboss-divider,#e5e7ea);color:var(--gemboss-text-muted,#686b71);font-size:12px;line-height:1.45}.gemboss-ei-grp{border-bottom:1px solid var(--gemboss-divider-soft);padding:16px 0}.gemboss-ei-grp:last-child{border-bottom:none}.gemboss-ei-gh{font-size:13px;line-height:20px;color:var(--gemboss-text);font-weight:650;margin-bottom:8px;display:flex;align-items:center;gap:6px;width:100%;border:0;background:transparent;cursor:pointer;text-align:left;padding:0;-webkit-appearance:none}.gemboss-ei-chev{order:1;flex:none;margin:0 4px 0 auto;width:6px;height:6px;font-size:0;border:solid var(--gemboss-text-muted);border-width:0 1.5px 1.5px 0;transform:rotate(45deg)}.gemboss-ei-gh[data-open=closed]>.gemboss-ei-chev{transform:rotate(-45deg)}.gemboss-ei-gh-note{margin-left:6px;font-size:12px;font-weight:450;opacity:.55}.gemboss-ei-gh[data-open=closed]{margin-bottom:0}.gemboss-ei-gh[data-open=closed]~*{display:none}.gemboss-ei-fld{margin-bottom:12px}.gemboss-ei-fld:last-child{margin-bottom:0}.gemboss-ei-grp>:not(.gemboss-ei-gh)+:not(.gemboss-ei-hint){margin-top:12px}.gemboss-ei-fld>label:where(:not(.gemboss-field)),.gemboss-ei-lbl{display:block;font-size:13px;font-weight:500;color:var(--gemboss-text);margin-bottom:6px}.gemboss-ei-lbl>label{margin:0}.gemboss-ei-help{display:none}:is(.gemboss-ei-grp,.gemboss-ei-group) :is(.gemboss-ei-fld>label:where(:not(.gemboss-field)),.gemboss-ei-lbl){font-weight:450;color:var(--gemboss-text-muted)}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-lbl{display:flex;gap:4px;align-items:start}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-fld--row{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,3fr);gap:0 8px;align-items:start}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-fld--row>:not(:first-child){grid-column:2}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-fld--row>:first-child{margin:0;padding-top:6px}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-help{display:block;flex:none;width:16px;height:16px;padding:0;border:0;border-radius:50%;box-shadow:inset 0 0 0 1px;background:none;color:inherit;font:650 10px/16px var(--gemboss-font-sans);cursor:help;position:relative}.gemboss-ei-help:after{content:"";position:absolute;inset:-4px;border-radius:50%}.gemboss-ei-help:is(:hover,[aria-expanded=true]){color:var(--gemboss-text)}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-fld:has(>.gemboss-ei-lbl>.gemboss-ei-help[aria-expanded=false])>.gemboss-ei-help-text{display:none}.gemboss-ei-inp{width:100%}.gemboss-ei-mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;line-height:1.5}select.gemboss-ei-inp{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--gemboss-text-muted) 50%),linear-gradient(135deg,var(--gemboss-text-muted) 50%,transparent 50%);background-position:calc(100% - 15px) center,calc(100% - 10px) center;background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:32px}.gemboss-ei-swatches{display:flex;gap:8px}.gemboss-ei-sw{width:30px;height:30px;border-radius:8px;border:2px solid transparent;cursor:pointer;padding:0;box-shadow:inset 0 0 0 1px #1f1e1d1a}.gemboss-ei-sw.on{border-color:var(--gemboss-text);box-shadow:0 0 0 2px var(--gemboss-surface),0 0 0 3px var(--gemboss-primary)}.gemboss-ei-sw:disabled{cursor:default;opacity:.7}@media (pointer: coarse),(max-width:47.9975em){.gemboss-ei-tab{min-height:44px}.gemboss-ei-gh{min-height:44px;margin-bottom:4px}.gemboss-ei-sw{width:44px;height:44px}.gemboss-ei-swatches{flex-wrap:wrap}}@media (pointer: coarse),(max-width:47.9975em){.gemboss-ei-fld :is(input:not([type=checkbox]):not([type=radio]),select,button:not(.gemboss-ei-help)){min-height:44px}.gemboss-ei-fld :is(button:not(.gemboss-ei-help),input[type=color]){min-width:44px}.gemboss-ei-help:after{inset:-14px}}.gemboss-ei-apply{margin-top:2px;background:var(--gemboss-primary);color:#fff;border:0;border-radius:8px;font-size:var(--gemboss-fs-caption);font-weight:700;padding:8px 16px;cursor:pointer}.gemboss-ei-apply:hover{background:var(--gemboss-primary-dark)}.gemboss-ei-apply:disabled{opacity:.6;cursor:default}.gemboss-ei-hint{margin:4px 0 0;font-size:12px;line-height:16px;color:var(--gemboss-text-muted)}.gemboss-ei-empty{padding:24px 16px;text-align:center;font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted);display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap}.gemboss-ei-foot{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:8px 16px;border-top:1px solid var(--gemboss-divider);font-size:11px;color:var(--gemboss-text-muted)}.gemboss-ei-savedot{width:6px;height:6px;border-radius:50%;background:var(--gemboss-success);box-shadow:0 0 0 3px #2e8b572e}.gemboss-ei-savedot.busy{background:var(--gemboss-primary);box-shadow:0 0 0 3px var(--gemboss-primary-soft)}.gemboss-ei-foot.is-error{color:var(--gemboss-danger)}.gemboss-ei-foot.is-error .gemboss-ei-savedot{background:var(--gemboss-danger);box-shadow:0 0 0 3px #d72c0d29}.gemboss-ei-drag{cursor:grab;user-select:none}.gemboss-ei-drag:active{cursor:grabbing}.gemboss-ei-dragmask{position:fixed;inset:0;z-index:9998;cursor:grabbing}.gemboss-ei-block{border:1px solid var(--gemboss-divider);border-radius:12px;padding:12px;margin-bottom:12px;background:var(--gemboss-panel-bg)}.gemboss-ei-block:last-child{margin-bottom:0}.gemboss-ei-block-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px;font-size:12px;font-weight:700;color:var(--gemboss-text)}.gemboss-ei-block-x{border:0;background:transparent;cursor:pointer;color:var(--gemboss-text-muted);width:22px;height:22px;border-radius:6px;font-size:11px;flex:none}.gemboss-ei-block-x:hover{background:var(--gemboss-hover);color:var(--gemboss-danger-strong)}.gemboss-ei-block-x:disabled{opacity:.5;cursor:default}.gemboss-ei-block .gemboss-ei-inp{background:var(--gemboss-surface)}.gemboss-ei-addrow{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px}.gemboss-ei-img{display:flex;gap:8px;align-items:flex-start}.gemboss-ei-img-thumb{flex:none;width:52px;height:52px;border-radius:8px;border:1px solid var(--gemboss-divider);background:var(--gemboss-panel-bg) center/cover no-repeat;display:grid;place-items:center;color:var(--gemboss-text-muted);font-size:16px}.gemboss-ei-img-ctl{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.gemboss-ei-img-actions{display:flex;gap:6px}.gemboss-ei-gen{display:flex;flex-direction:column;gap:8px;margin-top:8px;padding:8px;border:1px solid var(--gemboss-divider);border-radius:12px;background:var(--gemboss-panel-bg)}.gemboss-ei-gen .gemboss-ei-apply{align-self:flex-start;display:inline-flex;align-items:center;gap:6px}.gemboss-ei-gen .gemboss-narr-spin{width:11px;height:11px}.gemboss-ei-oos{margin:4px 16px 12px;padding:12px;border:1px solid var(--gemboss-divider);border-left:3px solid var(--gemboss-text-muted);border-radius:8px;background:var(--gemboss-panel-bg)}.gemboss-ei-oos-h{font-size:var(--gemboss-fs-micro);letter-spacing:.1em;text-transform:uppercase;color:var(--gemboss-text-muted);font-weight:700;margin-bottom:8px}.gemboss-ei-oos p{margin:0 0 6px;font-size:12px;color:var(--gemboss-text-muted);line-height:1.45}.gemboss-ei-oos p:last-child{margin-bottom:0}.gemboss-ei-oos b{color:var(--gemboss-text);font-weight:600}.gemboss-ei-edgebox{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}.gemboss-ei-value{display:grid;gap:8px}.gemboss-ei-value-row{display:flex;align-items:center;gap:12px}.gemboss-ei-value-box{flex:0 0 7em}.gemboss-ei-value-box input{text-align:right;font-variant-numeric:tabular-nums}.gemboss-ei-value-row .gemboss-ei-range{flex:1 1 auto;min-width:0}.gemboss-ei-edge{display:flex;flex-direction:column;align-items:center;gap:4px}.gemboss-ei-edge input{width:100%;text-align:center;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-variant-numeric:tabular-nums}.gemboss-ei-edge span{font-size:var(--gemboss-fs-micro);letter-spacing:.06em;color:var(--gemboss-text-muted);font-weight:700}.gemboss-ei-edge-scrub{align-self:stretch;min-height:24px;margin-top:4px;display:flex;align-items:center;justify-content:center;border-radius:var(--gemboss-radius-sm);cursor:ew-resize;user-select:none;touch-action:pan-y}@media (hover: hover){.gemboss-ei-edge-scrub:not([aria-disabled]):hover{background:var(--gemboss-hover);color:var(--gemboss-text)}}.gemboss-ei-edge-scrub[aria-disabled]{cursor:default}.gemboss-ec-dock-body{flex:1;min-height:0;overflow-y:auto;padding:var(--gemboss-ec-inset,12px)}.gemboss-ei-group{padding:16px 0}.gemboss-ei-group+.gemboss-ei-group{border-top:1px solid var(--gemboss-divider)}.gemboss-ei-grouphead{margin:0 0 12px;font-size:var(--gemboss-fs-micro,11px);font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--gemboss-text-muted)}.gemboss-ei-color{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.gemboss-ei-color-why{display:block;flex:1 0 100%;margin:-4px 0 0;font-size:12px;line-height:16px;color:var(--gemboss-text-muted)}.gemboss-ei-color .gemboss-ei-inp{flex:1;min-width:0}.gemboss-ei-swatch{flex:none;width:32px;height:32px;padding:0;border:1px solid var(--gemboss-divider);border-radius:8px;background:var(--gemboss-surface);cursor:pointer}.gemboss-ei-swatch::-webkit-color-swatch-wrapper{padding:2px}.gemboss-ei-swatch::-webkit-color-swatch{border:none;border-radius:6px}.gemboss-ei-swatch[data-empty]::-webkit-color-swatch{background-image:linear-gradient(to top right,#0000 46%,var(--gemboss-text-muted,#686b71) 46% 54%,#0000 54%)}.gemboss-ei-swatch:disabled{cursor:default;opacity:.7}:is(.gemboss-ei-fld,.gemboss-ei-lbl)>label>.gemboss-ei-rangeval{float:right;font-weight:700;color:var(--gemboss-text);font-variant-numeric:tabular-nums}.gemboss-ei-range{width:100%;accent-color:var(--gemboss-primary);cursor:pointer}.gemboss-ei-range:disabled{cursor:default;opacity:.7}@media (max-width:760px){.gemboss-ei{position:static;width:auto;max-width:none;max-height:none;margin:8px;box-shadow:var(--gemboss-shadow-raised)}}.gemboss-ei-tree{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px}.gemboss-ei-tnode{display:flex;align-items:center;gap:4px;flex-wrap:wrap;border-radius:6px;padding-right:4px}.gemboss-ei-tnode:hover{background:var(--gemboss-surface)}.gemboss-ei-tnode.on{background:var(--gemboss-primary-soft,var(--gemboss-surface));box-shadow:inset 2px 0 0 var(--gemboss-primary)}.gemboss-ei-tname{flex:1;min-width:0;display:flex;align-items:baseline;gap:6px;border:0;background:transparent;cursor:pointer;text-align:left;padding:6px 2px;color:var(--gemboss-text);font-size:12px;font-weight:600}.gemboss-ei-tname small{font-weight:400;font-size:10px;color:var(--gemboss-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gemboss-ei-tacts{flex:none;display:flex;gap:1px;opacity:0;transition:opacity .12s}.gemboss-ei-tnode:hover .gemboss-ei-tacts,.gemboss-ei-tnode.on .gemboss-ei-tacts,.gemboss-ei-tacts:focus-within{opacity:1}.gemboss-ei-tacts button{border:0;background:transparent;cursor:pointer;color:var(--gemboss-text-muted);font-size:11px;line-height:1;padding:4px 6px;border-radius:6px}.gemboss-ei-tacts button:hover:not(:disabled){background:var(--gemboss-surface);color:var(--gemboss-text)}.gemboss-ei-tacts button:disabled{opacity:.3;cursor:default}.gemboss-ei-tadd{flex-basis:100%;padding:4px 2px 6px}.gemboss-editor-topbar--guest{grid-template-columns:1fr auto 1fr}.gemboss-guest-mark{flex:0 0 auto;display:block}.gemboss-guest-brand{font-weight:700;letter-spacing:-.02em;font-size:15px;margin-left:8px}.gemboss-guest-note{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted);border:1px solid var(--gemboss-divider-soft);border-radius:999px;padding:4px 12px;white-space:nowrap}.gemboss-editor-topbar--guest .gemboss-editor-tb-right{display:flex;align-items:center;gap:16px;justify-content:flex-end}.gemboss-guest-signin{font-size:var(--gemboss-fs-body);font-weight:600;color:var(--gemboss-text-muted);text-decoration:none}.gemboss-guest-signin:hover{color:var(--gemboss-text)}.gemboss-guest-keep{border:0;border-radius:999px;background:var(--gemboss-primary);color:var(--gemboss-on-primary);cursor:pointer;font:inherit;font-size:var(--gemboss-fs-caption);font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:8px 20px;white-space:nowrap}.gemboss-guest-keep:hover{background:var(--gemboss-primary-dark)}@media (max-width: 720px){.gemboss-guest-note{display:none}}@media (max-width: 1000px){.gemboss-editor-topbar--guest{grid-template-columns:auto minmax(0,1fr)}}@media (max-width: 460px){.gemboss-guest-brand{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.gemboss-editor-topbar--guest .gemboss-editor-tb-right{gap:8px}.gemboss-editor-topbar--guest .gemboss-guest-keep{padding-inline:12px}}@media (max-width: 400px){.gemboss-editor-topbar--guest{padding-inline:8px;column-gap:8px}}
|
|
1
|
+
@keyframes gemboss-editor-enter{0%{opacity:0}to{opacity:1}}@keyframes gemboss-editor-toast-in{0%{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%)}}@keyframes gemboss-pagepicker-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes gemboss-flyout-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}@keyframes gemboss-statusbar-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}.gemboss-platform-main:has(.gemboss-editor){box-sizing:border-box;height:100dvh;min-height:0;padding-top:0;padding-bottom:0;overflow:hidden}.gemboss-editor{--gemboss-editor-inset: 5px;position:fixed;inset:0;box-sizing:border-box;display:flex;flex-direction:column;background:var(--gemboss-canvas);overflow:hidden;z-index:400;animation:gemboss-editor-enter .26s cubic-bezier(.16,1,.3,1)}@media (prefers-reduced-motion: reduce){.gemboss-editor{animation:none}}.gemboss-editor--embedded{position:relative;inset:auto;height:100%;min-height:0;z-index:auto;animation:none}.gemboss-editor-toast{position:absolute;top:62px;left:50%;transform:translate(-50%);z-index:500;display:flex;align-items:center;gap:12px;max-width:min(560px,92vw);padding:12px 12px 12px 16px;background:var(--gemboss-text);color:#fff;border-radius:12px;font-size:13px;line-height:1.4;box-shadow:var(--gemboss-shadow-overlay);animation:gemboss-editor-toast-in .24s cubic-bezier(.16,1,.3,1)}.gemboss-editor-toast strong{font-weight:600}.gemboss-editor-toast button{flex:0 0 auto;border:0;background:#ffffff29;color:#fff;width:22px;height:22px;border-radius:8px;cursor:pointer;font-size:12px;line-height:1;transition:background var(--gemboss-transition-fast) ease}.gemboss-editor-toast button:hover{background:#ffffff47}.gemboss-editor-toast button:focus-visible{outline:2px solid #fff;outline-offset:2px}@media (prefers-reduced-motion: reduce){.gemboss-editor-toast{animation:none}}.gemboss-editor-topbar{flex:0 0 auto;height:var(--gemboss-editor-topbar-h, 52px);display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:12px;padding:0 16px;background:var(--gemboss-surface);border-bottom:1px solid var(--gemboss-divider)}@media (min-width: 1001px){.gemboss-editor-topbar--theme{grid-template-columns:auto auto auto;justify-content:space-between}.gemboss-editor-topbar.gemboss-pageedit-top{grid-template-columns:auto fit-content(100%) auto}}.gemboss-editor-tb-left{display:flex;align-items:center;gap:12px;min-width:0}.gemboss-editor-tb-center{display:flex;align-items:center;gap:12px;justify-self:center}.gemboss-editor-topbar--theme .gemboss-editor-tb-center,.gemboss-editor-topbar.gemboss-pageedit-top .gemboss-editor-tb-center{min-width:0}.gemboss-editor-topbar.gemboss-pageedit-top .gemboss-pageedit-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}@media (max-width: 1200px){.gemboss-editor-topbar.gemboss-pageedit-top .gemboss-editor-tb-name,.gemboss-editor-topbar.gemboss-pageedit-top .gemboss-sec-type{display:none}}.gemboss-editor-tb-right{display:flex;align-items:center;gap:16px;min-width:0;justify-self:end}.gemboss-editor-back{border:0;background:transparent;padding:0;font-family:inherit;font-size:18px;line-height:1;color:var(--gemboss-text);text-decoration:none;cursor:pointer;width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border-radius:var(--gemboss-radius-md);transition:background var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease}.gemboss-editor-back:hover{background:var(--gemboss-hover)}.gemboss-editor-back:active{background:var(--gemboss-active-bg);color:var(--gemboss-active-fg)}.gemboss-editor-back:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-editor-tb-name{font-family:var(--gemboss-serif);font-size:15px;font-weight:600}.gemboss-editor-savestate{display:inline-flex;align-items:center;gap:6px;font-size:var(--gemboss-fs-micro);font-weight:500;line-height:1;padding:4px 8px;border-radius:var(--gemboss-radius-full);white-space:nowrap;transition:opacity .2s ease}.gemboss-editor-savestate.is-idle,.gemboss-editor-savestate.is-saving{color:var(--gemboss-text-muted)}.gemboss-editor-savestate.is-saved{color:var(--gemboss-success-strong);background:var(--gemboss-success-soft)}.gemboss-editor-savestate .gemboss-narr-spin{width:10px;height:10px;border-width:1.5px;border-color:var(--gemboss-divider);border-top-color:currentColor}@media (max-width: 760px){.gemboss-editor-savestate.is-saved{display:none}}.gemboss-editor-tb-ghost{font-size:13px;color:var(--gemboss-text);text-decoration:none;padding:8px 12px;border:1px solid var(--gemboss-divider);border-radius:8px;white-space:nowrap;cursor:pointer;background:var(--gemboss-surface);transition:border-color var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease,background var(--gemboss-transition-fast) ease}.gemboss-editor-tb-ghost:hover{border-color:var(--gemboss-primary)}.gemboss-editor-tb-ghost:active{background:var(--gemboss-active-bg);border-color:var(--gemboss-primary);color:var(--gemboss-active-fg)}.gemboss-editor-tb-ghost:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-editor-tb-ghost:disabled{opacity:.5;cursor:default;border-color:var(--gemboss-divider);color:var(--gemboss-text-muted)}.gemboss-editor-tb-publish{background:var(--gemboss-primary);color:#fff;border:0;border-radius:8px;box-sizing:border-box;height:var(--ui-btn-h, 28px);padding:0 12px;font-size:12px;font-weight:550;line-height:16px;cursor:pointer;white-space:nowrap;transition:background var(--gemboss-transition-fast) ease,filter var(--gemboss-transition-fast) ease}.gemboss-editor-tb-publish:hover{background:var(--gemboss-primary-dark)}.gemboss-editor-tb-publish:active{background:var(--gemboss-primary-dark);filter:brightness(.94)}.gemboss-editor-tb-publish:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-editor-tb-publish:disabled{opacity:.5;cursor:default;filter:none}.gemboss-editor-tb-undo{font-size:15px}.gemboss-editor-publish{position:relative;display:inline-flex;align-items:stretch}.gemboss-editor-publish-main{border-radius:8px 0 0 8px}.gemboss-editor-publish-caret{border-radius:0 8px 8px 0;padding:0 8px;font-size:12px;line-height:1;border-left:1px solid color-mix(in srgb,#fff 24%,transparent);display:inline-flex;align-items:center;justify-content:center}.gemboss-editor-publish-caret.active{filter:brightness(.94)}.gemboss-editor-menu-label{padding:6px 6px 2px;font-size:11px;font-weight:600;letter-spacing:.02em;color:var(--gemboss-text-muted);white-space:nowrap}.gemboss-editor-overflow{position:relative;display:inline-flex}.gemboss-editor-overflow-trigger{font-size:18px;line-height:1}.gemboss-editor-menu{position:fixed;z-index:500;min-width:210px;max-height:calc(100vh - 16px);overflow-y:auto;padding:6px;animation:gemboss-flyout-in var(--gemboss-transition-fast) ease}@media (prefers-reduced-motion: reduce){.gemboss-editor-menu{animation:none}}.gemboss-editor-menu-item{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-height:32px;padding:4px 6px;border:0;border-radius:var(--gemboss-radius-md);background:transparent;font:inherit;font-size:13px;color:var(--gemboss-text);text-align:left;text-decoration:none;white-space:nowrap;cursor:pointer;transition:background var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease}@media (pointer: coarse),(max-width: 47.9975em){.gemboss-editor-menu-item{min-height:44px;padding:8px 12px}.gemboss-editor-menu-label{padding:6px 12px 2px}}.gemboss-editor-menu-item:hover{background:var(--gemboss-hover)}.gemboss-editor-menu-item:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:-2px;background:var(--gemboss-hover)}.gemboss-editor-menu-item:disabled{opacity:.45;cursor:default}.gemboss-editor-menu-item:disabled:hover{background:transparent}.gemboss-editor-menu-item[aria-disabled=true]{color:var(--gemboss-text-muted);cursor:default}.gemboss-editor-menu-item[aria-disabled=true]:hover{background:transparent}.gemboss-editor-menu-why{display:block;font-size:12px;line-height:16px;color:var(--gemboss-text-muted)}.gemboss-editor-menu-item.active{color:var(--gemboss-active-fg)}.gemboss-editor-menu-ext{color:var(--gemboss-text-muted)}.gemboss-editor-menu-check{color:var(--gemboss-active-fg);font-weight:600}.gemboss-editor-menu-val{font-size:11px;color:var(--gemboss-text-muted);border:1px solid var(--gemboss-divider);border-radius:var(--gemboss-radius-sm);padding:1px 8px}.gemboss-editor-menu-sep{height:1px;background:var(--gemboss-divider-soft);margin:6px}.gemboss-editor-body{flex:1;min-height:0;display:flex;gap:0;padding:var(--gemboss-editor-inset);box-sizing:border-box}.gemboss-editor-body>.gemboss-ec,.gemboss-editor-body>.gemboss-editor-preview-pane{border:1px solid var(--gemboss-divider);border-radius:16px;overflow:hidden}.gemboss-editor-body>.gemboss-ec{border-right:1px solid var(--gemboss-divider)}.gemboss-ec-tabs{display:flex;gap:var(--ui-space-1);padding:var(--ui-space-2) var(--gemboss-ec-inset, 12px);border-bottom:1px solid var(--gemboss-divider);flex:none;overflow-x:auto;scrollbar-width:thin;overscroll-behavior-x:contain}.gemboss-ec-tabs>[role=tab]{flex:1 1 0;min-width:max-content;white-space:nowrap;font:inherit;font-size:12px;font-weight:550;line-height:16px;cursor:pointer;box-sizing:border-box;min-height:var(--ui-btn-h, 28px);padding:0 var(--ui-space-3);border-radius:8px;display:flex;align-items:center;justify-content:center;gap:6px;border:1px solid transparent;background:transparent;color:var(--gemboss-text-muted);box-shadow:none}.gemboss-ec-tabs>[role=tab]:hover:not([aria-selected=true]){color:var(--gemboss-text);background:var(--gemboss-primary-soft)}.gemboss-ec-tabs>[role=tab]:focus-visible{outline:2px solid var(--ui-focus);outline-offset:-2px}.gemboss-ec-tabs>[role=tab][aria-selected=true]{border-color:var(--gemboss-divider);background:var(--gemboss-surface);color:var(--gemboss-text);box-shadow:inset 0 -2px 0 var(--gemboss-primary)}@media (max-width: 47.9975em){.gemboss-ec-tabs>[role=tab]{min-height:44px}}.gemboss-pv{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--gemboss-preview-canvas);overflow:hidden}.ui-seg.gemboss-pv-devices>button.gemboss-pv-device{width:calc(var(--ui-btn-h) - 2px);height:calc(var(--ui-btn-h) - 2px);border:0;border-radius:0}@media (pointer: coarse),(max-width: 47.9975em){.ui-seg.gemboss-pv-devices>button.gemboss-pv-device{width:44px;height:44px}}.gemboss-pv-device{border:1px solid var(--gemboss-divider);background:var(--gemboss-surface);cursor:pointer;width:28px;height:28px;border-radius:8px;color:var(--gemboss-text-muted);font-size:14px;display:inline-flex;align-items:center;justify-content:center;line-height:1;transition:border-color var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease,background var(--gemboss-transition-fast) ease}.gemboss-pv-device svg{display:block}.gemboss-editor-tb-tools{display:flex;align-items:center;gap:16px;min-width:0}@media (max-width: 1200px){.gemboss-editor-tb-tools{display:none}}.gemboss-pv-device:hover{border-color:var(--gemboss-primary);color:var(--gemboss-active-fg)}.gemboss-pv-device:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-pv-device.active{border-color:var(--gemboss-primary);color:var(--gemboss-active-fg);background:var(--gemboss-active-bg)}.gemboss-pagepicker{position:relative;display:inline-flex}.gemboss-pagepicker-trigger{display:inline-flex;align-items:center;gap:8px;height:32px;padding:0 8px 0 12px;border-radius:8px;border:1px solid var(--gemboss-divider);background:var(--gemboss-surface);cursor:pointer;font-size:13px;font-weight:600;color:var(--gemboss-text);line-height:1;transition:border-color var(--gemboss-transition-fast) ease,background var(--gemboss-transition-fast) ease}.gemboss-pagepicker-trigger:hover{border-color:var(--gemboss-primary)}.gemboss-pagepicker-trigger[aria-expanded=true]{border-color:var(--gemboss-primary);background:var(--gemboss-active-bg, var(--gemboss-danger-soft))}.gemboss-pagepicker-trigger-icon{display:inline-flex;color:var(--gemboss-text-muted)}.gemboss-pagepicker-trigger-icon svg{display:block}.gemboss-pagepicker-trigger-label{max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gemboss-pagepicker-caret{font-size:9px;color:var(--gemboss-text-muted);margin-left:1px}.gemboss-pagepicker-menu{position:fixed;z-index:500;padding:8px;display:flex;flex-direction:column;gap:6px;animation:gemboss-pagepicker-in .14s cubic-bezier(.16,1,.3,1)}@media (prefers-reduced-motion: reduce){.gemboss-pagepicker-menu{animation:none}}.gemboss-pagepicker-search{position:relative;display:flex;align-items:center}.gemboss-pagepicker-search-icon{position:absolute;left:10px;display:inline-flex;color:var(--gemboss-text-muted);pointer-events:none}input.gemboss-pagepicker-search-input{width:100%;padding-left:32px}.gemboss-pagepicker-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px;max-height:320px;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(31,30,29,.22) transparent}.gemboss-pagepicker-item{width:100%;display:flex;align-items:center;gap:12px;border:0;background:transparent;cursor:pointer;text-align:left;padding:8px 12px;border-radius:var(--gemboss-radius-md);font-size:var(--gemboss-fs-body);color:var(--gemboss-text)}.gemboss-pagepicker-item:hover,.gemboss-pagepicker-item:focus-visible{background:var(--gemboss-hover, rgba(0,0,0,.05));outline:none}.gemboss-pagepicker-item.active{background:var(--gemboss-active-bg, var(--gemboss-danger-soft));color:var(--gemboss-active-fg);font-weight:600}.gemboss-pagepicker-item-icon{display:inline-flex;color:var(--gemboss-text-muted);flex:0 0 auto}.gemboss-pagepicker-item.active .gemboss-pagepicker-item-icon{color:var(--gemboss-active-fg)}.gemboss-pagepicker-item-icon svg{display:block}.gemboss-pagepicker-item-label{flex:1;min-width:0}.gemboss-pagepicker-check{color:var(--gemboss-active-fg);font-size:13px;flex:0 0 auto}.gemboss-pagepicker-empty{padding:12px;font-size:13px;color:var(--gemboss-text-muted)}.gemboss-pagepicker-note{padding:8px 12px 12px;font-size:12px;line-height:1.5;color:var(--gemboss-text-muted);border-bottom:1px solid var(--gemboss-divider)}.gemboss-pagepicker-note-link{color:var(--gemboss-primary);font-weight:600;text-decoration:none}.gemboss-pagepicker-note-link:hover{text-decoration:underline}.gemboss-pagepicker-back{display:flex;align-items:center;gap:6px;width:100%;border:0;background:transparent;cursor:pointer;text-align:left;padding:4px 6px 8px;margin-bottom:2px;border-bottom:1px solid var(--gemboss-divider-soft, #edeff2);font-size:13px;font-weight:600;color:var(--gemboss-text)}.gemboss-pagepicker-back:hover{color:var(--gemboss-active-fg)}.gemboss-pagepicker-back:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-pagepicker-back-icon{display:inline-flex;color:var(--gemboss-text-muted)}.gemboss-pagepicker-back-icon svg{display:block}.gemboss-pagepicker-drill{display:inline-flex;color:var(--gemboss-text-muted);flex:0 0 auto}.gemboss-pagepicker-drill svg{display:block}.gemboss-pagepicker-thumb{width:30px;height:30px;flex:0 0 auto;border-radius:8px;object-fit:cover;border:1px solid var(--gemboss-divider);background:var(--gemboss-panel-bg, #ffffff)}.gemboss-pagepicker-thumb--default{display:inline-flex;align-items:center;justify-content:center;color:var(--gemboss-text-muted)}.gemboss-pagepicker-thumb--default svg{width:16px;height:16px}.gemboss-pv-stage{flex:1;min-height:0;overflow:hidden;display:flex;justify-content:center;padding:0}.gemboss-pv-frame{background:var(--gemboss-surface);overflow:hidden;height:100%;position:relative}.gemboss-pv-frame.desktop{width:100%;max-width:none}.gemboss-pv-frame.gemboss-pv-fit.desktop{position:absolute;top:0;left:0;width:var(--gemboss-pv-w, 100%);height:var(--gemboss-pv-h, 100%);transform:scale(calc(var(--gemboss-pv-scale, 1) * var(--gemboss-pv-user-zoom, 1)));transform-origin:top left}.gemboss-pv-frame.mobile{width:390px;flex:0 0 390px;align-self:center;margin:16px 0;border:1px solid var(--gemboss-divider);border-radius:20px;box-shadow:var(--gemboss-shadow-overlay)}.gemboss-pv-frame.tablet{width:768px;flex:0 0 768px;align-self:center;margin:16px 0;border:1px solid var(--gemboss-divider);border-radius:16px;box-shadow:var(--gemboss-shadow-overlay)}.gemboss-pv-iframe{position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:var(--gemboss-surface);transition:opacity .18s ease}.gemboss-pv-empty{margin:auto;text-align:center;max-width:340px;display:flex;flex-direction:column;align-items:center;gap:8px}.gemboss-pv-empty-art{font-size:40px;line-height:1;opacity:.7}.gemboss-pv-empty-title{font-family:var(--gemboss-serif);font-size:18px;margin:0}.gemboss-pv-empty-sub{font-size:13px;color:var(--gemboss-text-muted);margin:0;line-height:1.5}.gemboss-pv-empty-cta{margin-top:6px;font-size:13px;font-weight:600;color:var(--gemboss-active-fg);text-decoration:none}.gemboss-pv-empty-cta:hover{text-decoration:underline}.gemboss-pv-spin{width:22px;height:22px;border:2px solid var(--gemboss-divider-soft);border-top-color:var(--gemboss-primary);border-radius:50%;animation:gemboss-spin .7s linear infinite}.gemboss-editor-resizer{flex:0 0 var(--gemboss-editor-inset);align-self:stretch}body.ui-resizing .gemboss-pv-iframe{pointer-events:none}.gemboss-editor-chat-toggle{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--gemboss-divider);background:var(--gemboss-surface);border-radius:var(--gemboss-radius-md);cursor:pointer;font-size:14px;line-height:1;color:var(--gemboss-text-muted);transition:border-color var(--gemboss-transition-fast) ease,color var(--gemboss-transition-fast) ease}.gemboss-editor-chat-toggle:hover{border-color:var(--gemboss-primary);color:var(--gemboss-active-fg)}.gemboss-editor-chat-toggle:focus-visible{outline:2px solid var(--gemboss-primary);outline-offset:2px}.gemboss-editor-chat-toggle.collapsed{border-color:var(--gemboss-primary);color:var(--gemboss-active-fg)}.gemboss-editor-chat-toggle svg{display:block}.gemboss-editor-body .gemboss-ec{transition:flex-basis .28s cubic-bezier(.16,1,.3,1),width .28s cubic-bezier(.16,1,.3,1)}body.ui-resizing .gemboss-editor-body .gemboss-ec{transition:none;will-change:flex-basis,width}body.ui-resizing .gemboss-editor-body .gemboss-pv{will-change:flex-basis}.gemboss-editor-body.is-chat-collapsed .gemboss-ec{border-width:0;overflow:hidden}.gemboss-editor-body.is-chat-collapsed>.gemboss-ec{visibility:hidden}.gemboss-editor-body.is-chat-collapsed .gemboss-editor-resizer{display:none}.gemboss-pagepicker-list::-webkit-scrollbar{width:9px}.gemboss-pagepicker-list::-webkit-scrollbar-track{background:transparent}.gemboss-pagepicker-list::-webkit-scrollbar-thumb{background:#1f1e1d33;border-radius:6px;border:2px solid transparent;background-clip:content-box}@media (max-width: 1000px){.gemboss-editor-body{flex-direction:column;gap:var(--gemboss-editor-inset)}}@media (max-width: 1000px){.gemboss-editor-resizer{display:none}.gemboss-editor-body.is-chat-collapsed .gemboss-ec{max-height:0;min-height:0}.gemboss-editor-topbar{height:auto;grid-template-columns:auto minmax(0,1fr);grid-template-areas:"left right" "center center";gap:8px 12px;padding:8px 12px}.gemboss-editor-tb-left{grid-area:left}.gemboss-editor-tb-right{padding-block:6px;grid-area:right;min-width:0;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.gemboss-editor-tb-center{grid-area:center;justify-self:stretch;justify-content:flex-start;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.gemboss-editor-tb-right::-webkit-scrollbar,.gemboss-editor-tb-center::-webkit-scrollbar{display:none}.gemboss-editor-tb-right>*{flex:0 0 auto}.gemboss-editor-tb-right>.gemboss-editor-tb-publish{position:sticky;right:0;z-index:1;box-shadow:-8px 0 8px -6px color-mix(in srgb,var(--gemboss-text) 18%,transparent)}.gemboss-editor-tb-name{display:none}.gemboss-editor-tb-ghost{padding:6px 12px;font-size:12px}.gemboss-editor-tb-publish{padding:8px 16px;font-size:13px}}@media (max-width: 640px){.gemboss-pv-frame.mobile{width:100%;max-width:390px;flex:0 1 auto;margin:8px 0}.gemboss-pv-frame.tablet{width:100%;max-width:768px;flex:0 1 auto;margin:8px 0}}.gemboss-editor-preview-pane{display:flex}.gemboss-editor-mobile-tabs{display:none}.gemboss-editor-dock{position:absolute;top:0;right:0;bottom:0;width:320px;max-width:90%;z-index:5;overflow-y:auto;background:var(--gemboss-surface);border-left:1px solid var(--gemboss-divider);box-shadow:var(--gemboss-shadow-overlay)}.gemboss-editor-preview-pane:has(>.gemboss-editor-dock){position:relative}:where(.gemboss-editor-body>.gemboss-ec){position:relative;width:var(--gemboss-chat-w, 384px);flex:0 0 var(--gemboss-chat-w, 384px);display:flex;flex-direction:column;background:var(--gemboss-panel-bg);border-right:1px solid var(--gemboss-divider);overflow:hidden}:where(.gemboss-editor-preview-pane){flex:1;min-width:0}@media (max-width: 1000px){:where(.gemboss-editor-body>.gemboss-ec){width:auto;flex:0 0 auto;max-height:48%}}@media (max-width: 760px){.gemboss-editor-resizer{display:none}.gemboss-editor-body .gemboss-ec{flex:1 1 auto;width:100%;min-width:0;max-height:none;border-right:none}.gemboss-editor-body .gemboss-editor-preview-pane{flex:1 1 auto}.gemboss-editor-body[data-mobile-pane=chat] .gemboss-editor-preview-pane,.gemboss-editor-body[data-mobile-pane=preview] .gemboss-ec{display:none}.gemboss-editor-mobile-tabs{display:flex;flex:0 0 auto;gap:6px;padding:6px;padding-bottom:calc(6px + env(safe-area-inset-bottom));background:var(--gemboss-surface);border-top:1px solid var(--gemboss-divider)}.gemboss-editor-mobile-tab{flex:1 1 0;height:44px;border:0;border-radius:8px;background:transparent;color:var(--gemboss-text-muted);font:inherit;font-size:13px;font-weight:600;cursor:pointer}.gemboss-editor-mobile-tab.active{background:var(--gemboss-active-bg);color:var(--gemboss-active-fg)}}.gemboss-editor-statusbar{position:absolute;top:60px;right:14px;z-index:480;max-width:min(380px,calc(100vw - 28px));padding:8px 16px;font-size:12px;line-height:1.4;color:var(--gemboss-text-muted);background:var(--gemboss-surface);border:1px solid var(--gemboss-divider);border-radius:12px;box-shadow:var(--gemboss-shadow-raised);pointer-events:none;animation:gemboss-statusbar-in .18s cubic-bezier(.16,1,.3,1) both}.gemboss-editor-statusbar.done{background:#eaf6ef;color:#1f7a4d;border-color:var(--gemboss-success-border)}.gemboss-editor-statusbar.error{background:#fdecea;color:var(--gemboss-danger);border-color:#f3c2bb}@media (pointer: coarse){.gemboss-pv-device{width:38px;height:38px;font-size:16px}.gemboss-editor-back{width:44px;height:44px;font-size:20px}.gemboss-editor-chat-toggle{width:44px;height:44px;font-size:16px}}@media (pointer: coarse){.gemboss-editor-tb-ghost{padding:8px 16px;min-height:44px}.gemboss-editor-tb-publish{padding:12px 20px;min-height:44px}.gemboss-pagepicker-trigger{min-height:44px}}@media (pointer: coarse){.gemboss-ec-tab{min-height:44px}}@media (max-width: 760px){.gemboss-editor-chat-toggle{display:none}}.gemboss-pageedit{position:fixed;inset:0;display:flex;flex-direction:column;background:var(--gemboss-panel-bg,#ffffff);z-index:320}.gemboss-pageedit-top{background:#fff;border-bottom:1px solid var(--gemboss-divider,#e5e7ea)}.gemboss-pageedit .gemboss-editor-tb-center{display:flex;align-items:center;gap:12px;justify-content:center}.gemboss-pageedit .gemboss-editor-tb-right{display:flex;align-items:center;gap:12px;min-width:0}.gemboss-pageedit .gemboss-editor-tb-right>:first-child{margin-inline-start:auto}.gemboss-pageedit .gemboss-editor-tb-left{--gemboss-tb-gap:12px;display:flex;align-items:center;gap:var(--gemboss-tb-gap);min-width:0}.gemboss-pageedit-title{font-family:var(--gemboss-serif,inherit);font-size:15px;font-weight:600;color:var(--gemboss-text,#1b1c1e);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:32ch}.gemboss-pageedit-notice{display:flex;flex-wrap:wrap;align-items:center;gap:12px;flex:0 0 auto;padding:12px 16px;background:var(--gemboss-surface);border-bottom:1px solid var(--gemboss-divider);color:var(--gemboss-text);font-size:13px;line-height:1.5}.gemboss-pageedit-notice span{flex:1 1 240px;min-width:0}.gemboss-pageedit-notice button{min-height:44px;padding:8px 12px;flex:0 0 auto;border:1px solid var(--gemboss-divider);border-radius:8px;background:var(--gemboss-surface);color:var(--gemboss-text);cursor:pointer}@media (max-width:900px){.gemboss-pageedit-top{height:auto;grid-template-columns:minmax(0,1fr);grid-template-areas:"left" "right" "center";gap:8px;padding:8px 12px}.gemboss-pageedit-top .gemboss-editor-tb-right{flex-wrap:wrap;overflow:visible}.gemboss-pageedit-top .gemboss-editor-tb-right button{min-height:44px}.gemboss-pageedit .gemboss-editor-tb-left{width:100%;overflow:hidden;flex-wrap:wrap}.gemboss-pageedit .gemboss-editor-tb-right,.gemboss-pageedit .gemboss-editor-tb-center{justify-self:stretch;justify-content:flex-start;max-width:100%;overflow-x:auto}.gemboss-pageedit-top .gemboss-editor-tb-center{flex-wrap:wrap;row-gap:8px;overflow:visible}}.gemboss-sec-type{font-size:11px;font-weight:700;letter-spacing:.02em;padding:2px 8px;border-radius:12px;background:#f1efe9;color:var(--gemboss-text-muted);text-transform:capitalize}.gemboss-sec-insert-wrap{position:relative}.gemboss-sec-insert-menu{position:absolute;top:42px;right:0;width:280px;max-height:60vh;overflow-y:auto;padding:6px;z-index:80}.gemboss-sec-insert-item{width:100%;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 12px;border:0;background:transparent;border-radius:8px;cursor:pointer;text-align:left;font-size:13px;color:var(--gemboss-text,#1b1c1e);transition:background .12s ease,color .12s ease}.gemboss-sec-insert-item:hover{background:var(--gemboss-hover,rgba(0,0,0,.04))}.gemboss-sec-insert-item:focus-visible{outline:2px solid var(--gemboss-primary, #1b1c1e);outline-offset:-2px;background:var(--gemboss-hover,rgba(0,0,0,.04))}.gemboss-sec-insert-item:disabled{opacity:.6;cursor:default}.gemboss-sec-insert-item:disabled:hover{background:transparent}.gemboss-sec-insert-cat{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted,#686b71);text-transform:capitalize}.gemboss-sec-insert-empty{display:block;padding:16px;font-size:13px;color:var(--gemboss-text-muted,#686b71);text-decoration:none}.gemboss-pageedit-scope{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted,#686b71);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}@media (max-width:1200px){.gemboss-pageedit-scope{display:none}}.gemboss-pageedit-pv{flex:1;min-width:0;background:var(--gemboss-preview-canvas);display:flex;justify-content:center;overflow:auto;position:relative}.gemboss-pageedit-pv .gemboss-pv-frame iframe{width:100%;height:100%;border:0;background:#fff;display:block}.gemboss-pageedit-chip{display:flex;align-items:center;gap:8px;margin:0 12px 8px;padding:6px 12px;border-radius:8px;background:var(--gemboss-active-bg);border:1px solid var(--gemboss-divider);font-size:12px;color:var(--gemboss-active-fg)}.gemboss-pageedit-chip button{margin-left:auto;border:0;background:transparent;color:var(--gemboss-active-fg);cursor:pointer;font-size:12px}.gemboss-pageedit-standing{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:8px 16px;background:#b07d1817;border-bottom:1px solid rgba(176,125,24,.28);font-size:13px;line-height:1.5;color:#7a5710}.gemboss-pageedit-standing code{font-size:12px;background:#b07d1824;border-radius:4px;padding:2px 4px}.gemboss-pageedit-standing button{margin-left:auto;flex:0 0 auto;border:1px solid rgba(176,125,24,.4);background:#fff;color:#7a5710;border-radius:8px;padding:4px 12px;font:inherit;font-weight:600;cursor:pointer}.gemboss-pageedit-standing button:disabled{opacity:.6;cursor:default}.gemboss-picker-backdrop{position:fixed;inset:0;background:#1f1e1d38;z-index:70}.gemboss-picker-head{flex:0 0 auto;height:52px;display:flex;align-items:center;justify-content:space-between;padding:0 16px;border-bottom:1px solid var(--gemboss-divider,#e5e7ea);font-weight:600;font-size:15px}.gemboss-picker-head button{border:0;background:transparent;font-size:15px;cursor:pointer;color:var(--gemboss-text-muted,#686b71)}.gemboss-picker-empty{padding:20px;text-align:center;color:var(--gemboss-text-muted,#686b71);font-size:13px}.gemboss-layers{position:fixed;top:0;left:0;bottom:0;width:300px;background:#fff;border-right:1px solid var(--gemboss-divider,#e5e7ea);box-shadow:8px 0 30px #1f1e1d1f;z-index:71;display:flex;flex-direction:column}.gemboss-layers-list{flex:1;min-height:0;overflow-y:auto;padding:8px 12px;display:flex;flex-direction:column;gap:4px}.gemboss-layer{display:flex;align-items:center;gap:4px;border:1px solid transparent;border-radius:8px;padding:0 4px 0 6px}.gemboss-layer:hover{background:var(--gemboss-hover,rgba(0,0,0,.04))}.gemboss-layer.is-sel{border-color:var(--gemboss-primary, #1b1c1e);background:var(--gemboss-active-bg)}.gemboss-layer-main{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:1px;background:transparent;border:0;cursor:pointer;text-align:left;padding:8px 4px}.gemboss-layer-type{font-size:13px;font-weight:600;color:var(--gemboss-text,#1b1c1e)}.gemboss-layer-head{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted,#686b71);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:195px}.gemboss-layer-acts{display:flex;gap:0;flex:0 0 auto}.gemboss-layer-acts button{width:26px;height:26px;border:0;background:transparent;border-radius:6px;cursor:pointer;color:var(--gemboss-text-muted,#686b71);font-size:13px;line-height:1}.gemboss-layer-acts button:hover:not(:disabled){background:var(--gemboss-hover,rgba(0,0,0,.07))}.gemboss-layer-acts button:disabled{opacity:.28;cursor:default}.gemboss-layer-del:hover:not(:disabled){color:#c0392b}@media (pointer: coarse){.gemboss-layer{flex-wrap:wrap}.gemboss-layer-acts{margin-left:auto}.gemboss-layer-acts button{width:44px;height:44px;font-size:15px}.gemboss-layer-main{flex:1 1 140px;min-height:44px;justify-content:center}.gemboss-layer-head{max-width:100%}}.gemboss-layer-grip{flex:0 0 auto;width:12px;margin-right:-2px;color:var(--gemboss-text-muted,#686b71);font-size:11px;letter-spacing:-2px;line-height:1;text-align:center;cursor:grab;user-select:none}.gemboss-layer[draggable=true]{cursor:grab}.gemboss-layer.is-dragging{opacity:.4}.gemboss-layer[data-drop=before]{box-shadow:0 -2px 0 var(--gemboss-primary, #1b1c1e)}.gemboss-layer[data-drop=after]{box-shadow:0 2px 0 var(--gemboss-primary, #1b1c1e)}.gemboss-layer.is-hidden .gemboss-layer-main{opacity:.5}.gemboss-layer-acts .gemboss-layer-eye{display:inline-grid;place-items:center}.gemboss-layer-acts .gemboss-layer-eye[aria-pressed=true]{color:var(--gemboss-text,#1b1c1e)}.gemboss-layers[hidden],.gemboss-settings[hidden],.gemboss-picker-backdrop[hidden]{display:none}.gemboss-settings{position:fixed;top:0;right:0;bottom:0;width:min(380px,100%);box-sizing:border-box;background:#fff;border-left:1px solid var(--gemboss-divider,#e5e7ea);box-shadow:-8px 0 30px #1f1e1d1f;z-index:71;display:flex;flex-direction:column}.gemboss-settings-body{flex:1;min-height:0;overflow-y:auto;padding:16px 20px;display:flex;flex-direction:column;gap:12px}.gemboss-settings-grouphead{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:4px;padding-top:16px;border-top:1px solid var(--gemboss-divider,#e5e7ea)}.gemboss-settings-grouphead>span{font-size:var(--gemboss-fs-caption);font-weight:700;color:var(--gemboss-text,#1b1c1e)}.gemboss-settings-gen{border:1px solid var(--gemboss-divider,#e5e7ea);background:var(--gemboss-surface,#fff);border-radius:999px;padding:4px 12px;font-size:12px;font-weight:600;font-family:inherit;color:var(--gemboss-text,#1b1c1e);cursor:pointer;white-space:nowrap}.gemboss-settings-gen:hover:not(:disabled){background:var(--gemboss-hover,#eceef2)}.gemboss-settings-gen:disabled{opacity:.55;cursor:default}.gemboss-settings-field{display:flex;flex-direction:column;gap:6px}.gemboss-settings-note{margin:0 0 4px;font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted);line-height:1.5}.gemboss-settings-error{margin:0 0 8px;padding:8px 12px;border-radius:8px;font-size:var(--gemboss-fs-caption);line-height:1.45;color:#8a1c1c;background:#fdecec;border:1px solid #f5c2c2}.gemboss-settings-field>span{font-size:13px;font-weight:450;color:var(--gemboss-text-muted)}.gemboss-settings-field :is(input,textarea,select):not([type=color]){width:100%}.gemboss-settings-field small{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted,#686b71)}.gemboss-settings-field textarea.gemboss-mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;line-height:1.5}.gemboss-settings-handle span{color:var(--gemboss-text-muted,#686b71);white-space:nowrap}.gemboss-settings-foot{flex:0 0 auto;display:flex;justify-content:flex-end;gap:12px;padding:12px 20px;border-top:1px solid var(--gemboss-divider,#e5e7ea)}.gemboss-settings-cancel{background:transparent;border:1px solid var(--gemboss-divider,#e5e7ea);border-radius:8px;font-size:13px;font-weight:600;padding:8px 16px;cursor:pointer;color:var(--gemboss-text,#1b1c1e)}.gemboss-settings-save{background:var(--gemboss-primary, #1b1c1e);color:#fff;border:0;border-radius:8px;font-size:13px;font-weight:700;padding:8px 20px;cursor:pointer}.gemboss-settings-save:disabled{opacity:.6;cursor:default}.gemboss-page-section-content :is(button:where(:not(.gemboss-ei-help)),input,textarea){min-height:44px;min-width:44px}.gemboss-pageedit .gemboss-pv-device{width:44px;height:44px;flex-shrink:0}.gemboss-pageedit .gemboss-ec-dock-body :is(button:where(:not(.gemboss-ei-help)),input,select){min-height:44px}.gemboss-bundle-look .gemboss-ei-body :is(button:where(:not(.gemboss-ei-help)),input){min-height:44px}.gemboss-bundle-look .gemboss-ei-body input[type=color]{min-width:44px}.gemboss-page-draft-status{flex:0 0 auto;display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:8px;padding:8px 12px;border-radius:8px;background:var(--gemboss-surface,#fff);color:var(--gemboss-text,#1b1c1e);font-size:12px;line-height:1.5;box-shadow:0 1px 6px #0001}.gemboss-page-draft-status button{min-height:44px;min-width:44px;padding:8px 12px;border:1px solid var(--gemboss-divider);border-radius:6px;background:var(--gemboss-surface,#fff);cursor:pointer}.gemboss-page-draft-status button:hover{background:var(--gemboss-hover,#eceef2)}.gemboss-page-draft-status button:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.gemboss-page-draft-status[data-page-preview-state=ready]{pointer-events:none}.gemboss-pageedit .gemboss-pageedit-pv{flex-direction:column;min-height:0;justify-content:flex-start}.gemboss-page-draft-stage{flex:1;min-height:0;position:relative;overflow:hidden;display:flex;justify-content:center}@media (max-width:1000px){.gemboss-pageedit .gemboss-editor-body>.gemboss-ec{flex:0 0 auto;height:44%;min-height:min(520px,76%);max-height:76%}}.gemboss-ei{position:absolute;top:12px;right:12px;z-index:6;width:320px;max-width:calc(100% - 24px);display:flex;flex-direction:column;max-height:calc(100% - 24px);background:var(--gemboss-surface);border:1px solid var(--gemboss-divider);border-radius:var(--gemboss-radius-xl);box-shadow:var(--gemboss-shadow-overlay);overflow:hidden}.gemboss-ei--docked{position:static;top:auto;right:auto;width:100%;max-width:none;height:100%;max-height:none;border:0;border-radius:0;box-shadow:none;background:transparent;flex:1;min-height:0}.gemboss-ei-head{display:flex;align-items:center;gap:8px;padding:12px;border-bottom:1px solid var(--gemboss-divider)}.gemboss-ec>.gemboss-ei-head{padding-inline:var(--gemboss-ec-inset,12px)}.gemboss-ec .gemboss-ei--docked .gemboss-ei-head{padding-inline:var(--gemboss-ec-inset,12px)}.gemboss-ec .gemboss-ei--docked .gemboss-ei-tabs{margin-inline:var(--gemboss-ec-inset,12px)}:is(.gemboss-settings-body,.gemboss-ec-dock-body) .gemboss-ei-tabs{margin-inline:0}.gemboss-ec .gemboss-ei--docked .gemboss-ei-pane{padding-inline:var(--gemboss-ec-inset,16px)}.gemboss-ei-title{font-size:var(--gemboss-fs-body);font-weight:700;line-height:1.2;min-width:0;overflow:hidden}.gemboss-ei-title small{display:block;font-weight:500;font-size:11px;color:var(--gemboss-text-muted);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gemboss-ei-act,.gemboss-ei-x{margin-left:auto;width:26px;height:26px;flex:none;border:0;background:transparent;cursor:pointer;color:var(--gemboss-text-muted);border-radius:6px;display:grid;place-items:center;font-size:14px}.gemboss-ei-x{margin-left:2px;font-size:13px}.gemboss-ei-act:hover,.gemboss-ei-x:hover{background:var(--gemboss-hover);color:var(--gemboss-text)}.gemboss-ei-act:disabled{opacity:.5;cursor:default}.gemboss-ei-tabs{display:flex;gap:2px;margin:8px 12px 0;background:var(--gemboss-panel-bg);padding:4px;border-radius:8px}.gemboss-ei-tab{flex:1;border:0;background:transparent;cursor:pointer;color:var(--gemboss-text-muted);font-weight:550;font-size:12px;line-height:16px;padding:6px 4px;border-radius:6px;display:flex;align-items:center;justify-content:center;gap:6px}.gemboss-ei-tab.on{background:var(--gemboss-surface);color:var(--gemboss-text);box-shadow:var(--gemboss-shadow-resting)}.gemboss-ei-body{flex:1;min-height:0;overflow-y:auto;scrollbar-width:thin;padding:2px 0 4px}.gemboss-ei-body::-webkit-scrollbar{width:9px}.gemboss-ei-body::-webkit-scrollbar-thumb{background:#1f1e1d33;border-radius:6px;border:2px solid var(--gemboss-surface);background-clip:content-box}.gemboss-ei-pane{padding:4px 16px 6px}.gemboss-ei-note{margin:0 0 8px;padding:8px 12px;border-radius:8px;background:var(--gemboss-hover,#eceef2);border:1px solid var(--gemboss-divider,#e5e7ea);color:var(--gemboss-text-muted,#686b71);font-size:12px;line-height:1.45}.gemboss-ei-grp{border-bottom:1px solid var(--gemboss-divider-soft);padding:16px 0}.gemboss-ei-grp:last-child{border-bottom:none}.gemboss-ei-gh{font-size:13px;line-height:20px;color:var(--gemboss-text);font-weight:650;margin-bottom:8px;display:flex;align-items:center;gap:6px;width:100%;border:0;background:transparent;cursor:pointer;text-align:left;padding:0;-webkit-appearance:none}.gemboss-ei-chev{order:1;flex:none;margin:0 4px 0 auto;width:6px;height:6px;font-size:0;border:solid var(--gemboss-text-muted);border-width:0 1.5px 1.5px 0;transform:rotate(45deg)}.gemboss-ei-gh[data-open=closed]>.gemboss-ei-chev{transform:rotate(-45deg)}.gemboss-ei-gh-note{margin-left:6px;font-size:12px;font-weight:450;opacity:.55}.gemboss-ei-gh[data-open=closed]{margin-bottom:0}.gemboss-ei-gh[data-open=closed]~*{display:none}.gemboss-ei-fld{margin-bottom:12px}.gemboss-ei-fld:last-child{margin-bottom:0}.gemboss-ei-grp>:not(.gemboss-ei-gh)+:not(.gemboss-ei-hint){margin-top:12px}.gemboss-ei-fld>label:where(:not(.gemboss-field)),.gemboss-ei-lbl{display:block;font-size:13px;font-weight:500;color:var(--gemboss-text);margin-bottom:6px}.gemboss-ei-lbl>label{margin:0}.gemboss-ei-help{display:none}:is(.gemboss-ei-grp,.gemboss-ei-group) :is(.gemboss-ei-fld>label:where(:not(.gemboss-field)),.gemboss-ei-lbl){font-weight:450;color:var(--gemboss-text-muted)}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-lbl{display:flex;gap:4px;align-items:start}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-fld--row{display:grid;grid-template-columns:minmax(0,2fr) minmax(0,3fr);gap:0 8px;align-items:start}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-fld--row>:not(:first-child){grid-column:2}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-fld--row>:first-child{margin:0;padding-top:6px}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-help{display:block;flex:none;width:16px;height:16px;padding:0;border:0;border-radius:50%;box-shadow:inset 0 0 0 1px;background:none;color:inherit;font:650 10px/16px var(--gemboss-font-sans);cursor:help;position:relative}.gemboss-ei-help:after{content:"";position:absolute;inset:-4px;border-radius:50%}.gemboss-ei-help:is(:hover,[aria-expanded=true]){color:var(--gemboss-text)}:is(.gemboss-ei-grp,.gemboss-ei-group) .gemboss-ei-fld:has(>.gemboss-ei-lbl>.gemboss-ei-help[aria-expanded=false])>.gemboss-ei-help-text{display:none}.gemboss-ei-inp{width:100%}.gemboss-ei-mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;line-height:1.5}select.gemboss-ei-inp{appearance:none;background-image:linear-gradient(45deg,transparent 50%,var(--gemboss-text-muted) 50%),linear-gradient(135deg,var(--gemboss-text-muted) 50%,transparent 50%);background-position:calc(100% - 15px) center,calc(100% - 10px) center;background-size:5px 5px,5px 5px;background-repeat:no-repeat;padding-right:32px}.gemboss-ei-swatches{display:flex;gap:8px}.gemboss-ei-sw{width:30px;height:30px;border-radius:8px;border:2px solid transparent;cursor:pointer;padding:0;box-shadow:inset 0 0 0 1px #1f1e1d1a}.gemboss-ei-sw.on{border-color:var(--gemboss-text);box-shadow:0 0 0 2px var(--gemboss-surface),0 0 0 3px var(--gemboss-primary)}.gemboss-ei-sw:disabled{cursor:default;opacity:.7}@media (pointer: coarse),(max-width:47.9975em){.gemboss-ei-tab{min-height:44px}.gemboss-ei-gh{min-height:44px;margin-bottom:4px}.gemboss-ei-sw{width:44px;height:44px}.gemboss-ei-swatches{flex-wrap:wrap}}@media (pointer: coarse),(max-width:47.9975em){.gemboss-ei-fld :is(input:not([type=checkbox]):not([type=radio]),select,button:not(.gemboss-ei-help)){min-height:44px}.gemboss-ei-fld :is(button:not(.gemboss-ei-help),input[type=color]){min-width:44px}.gemboss-ei-help:after{inset:-14px}}.gemboss-ei-apply{margin-top:2px;background:var(--gemboss-primary);color:#fff;border:0;border-radius:8px;font-size:var(--gemboss-fs-caption);font-weight:700;padding:8px 16px;cursor:pointer}.gemboss-ei-apply:hover{background:var(--gemboss-primary-dark)}.gemboss-ei-apply:disabled{opacity:.6;cursor:default}.gemboss-ei-hint{margin:4px 0 0;font-size:12px;line-height:16px;color:var(--gemboss-text-muted)}.gemboss-ei-empty{padding:24px 16px;text-align:center;font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted);display:flex;align-items:center;justify-content:center;gap:8px;flex-wrap:wrap}.gemboss-ei-foot{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:8px 16px;border-top:1px solid var(--gemboss-divider);font-size:11px;color:var(--gemboss-text-muted)}.gemboss-ei-savedot{width:6px;height:6px;border-radius:50%;background:var(--gemboss-success);box-shadow:0 0 0 3px #2e8b572e}.gemboss-ei-savedot.busy{background:var(--gemboss-primary);box-shadow:0 0 0 3px var(--gemboss-primary-soft)}.gemboss-ei-foot.is-error{color:var(--gemboss-danger)}.gemboss-ei-foot.is-error .gemboss-ei-savedot{background:var(--gemboss-danger);box-shadow:0 0 0 3px #d72c0d29}.gemboss-ei-drag{cursor:grab;user-select:none}.gemboss-ei-drag:active{cursor:grabbing}.gemboss-ei-dragmask{position:fixed;inset:0;z-index:9998;cursor:grabbing}.gemboss-ei-block{border:1px solid var(--gemboss-divider);border-radius:12px;padding:12px;margin-bottom:12px;background:var(--gemboss-panel-bg)}.gemboss-ei-block:last-child{margin-bottom:0}.gemboss-ei-block-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px;font-size:12px;font-weight:700;color:var(--gemboss-text)}.gemboss-ei-block-x{border:0;background:transparent;cursor:pointer;color:var(--gemboss-text-muted);width:22px;height:22px;border-radius:6px;font-size:11px;flex:none}.gemboss-ei-block-x:hover{background:var(--gemboss-hover);color:var(--gemboss-danger-strong)}.gemboss-ei-block-x:disabled{opacity:.5;cursor:default}.gemboss-ei-block .gemboss-ei-inp{background:var(--gemboss-surface)}.gemboss-ei-addrow{display:flex;flex-wrap:wrap;gap:6px;margin-top:2px}.gemboss-ei-img{display:flex;gap:8px;align-items:flex-start}.gemboss-ei-img-thumb{flex:none;width:52px;height:52px;border-radius:8px;border:1px solid var(--gemboss-divider);background:var(--gemboss-panel-bg) center/cover no-repeat;display:grid;place-items:center;color:var(--gemboss-text-muted);font-size:16px}.gemboss-ei-img-ctl{flex:1;min-width:0;display:flex;flex-direction:column;gap:6px}.gemboss-ei-img-actions{display:flex;gap:6px}.gemboss-ei-gen{display:flex;flex-direction:column;gap:8px;margin-top:8px;padding:8px;border:1px solid var(--gemboss-divider);border-radius:12px;background:var(--gemboss-panel-bg)}.gemboss-ei-gen .gemboss-ei-apply{align-self:flex-start;display:inline-flex;align-items:center;gap:6px}.gemboss-ei-gen .gemboss-narr-spin{width:11px;height:11px}.gemboss-ei-oos{margin:4px 16px 12px;padding:12px;border:1px solid var(--gemboss-divider);border-left:3px solid var(--gemboss-text-muted);border-radius:8px;background:var(--gemboss-panel-bg)}.gemboss-ei-oos-h{font-size:var(--gemboss-fs-micro);letter-spacing:.1em;text-transform:uppercase;color:var(--gemboss-text-muted);font-weight:700;margin-bottom:8px}.gemboss-ei-oos p{margin:0 0 6px;font-size:12px;color:var(--gemboss-text-muted);line-height:1.45}.gemboss-ei-oos p:last-child{margin-bottom:0}.gemboss-ei-oos b{color:var(--gemboss-text);font-weight:600}.gemboss-ei-edgebox{display:grid;grid-template-columns:repeat(4,1fr);gap:6px}.gemboss-ei-value{display:grid;gap:8px}.gemboss-ei-value-row{display:flex;align-items:center;gap:12px}.gemboss-ei-value-box{flex:0 0 7em}.gemboss-ei-value-box input{text-align:right;font-variant-numeric:tabular-nums}.gemboss-ei-value-row .gemboss-ei-range{flex:1 1 auto;min-width:0}.gemboss-ei-edge{display:flex;flex-direction:column;align-items:center;gap:4px}.gemboss-ei-edge input{width:100%;text-align:center;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-variant-numeric:tabular-nums}.gemboss-ei-edge span{font-size:var(--gemboss-fs-micro);letter-spacing:.06em;color:var(--gemboss-text-muted);font-weight:700}.gemboss-ei-edge-scrub{align-self:stretch;min-height:24px;margin-top:4px;display:flex;align-items:center;justify-content:center;border-radius:var(--gemboss-radius-sm);cursor:ew-resize;user-select:none;touch-action:pan-y}@media (hover: hover){.gemboss-ei-edge-scrub:not([aria-disabled]):hover{background:var(--gemboss-hover);color:var(--gemboss-text)}}.gemboss-ei-edge-scrub[aria-disabled]{cursor:default}.gemboss-ec-dock-body{flex:1;min-height:0;overflow-y:auto;padding:var(--gemboss-ec-inset,12px)}.gemboss-ei-group{padding:16px 0}.gemboss-ei-group+.gemboss-ei-group{border-top:1px solid var(--gemboss-divider)}.gemboss-ei-grouphead{margin:0 0 12px;font-size:var(--gemboss-fs-micro,11px);font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--gemboss-text-muted)}.gemboss-ei-color{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.gemboss-ei-color-why{display:block;flex:1 0 100%;margin:-4px 0 0;font-size:12px;line-height:16px;color:var(--gemboss-text-muted)}.gemboss-ei-color .gemboss-ei-inp{flex:1;min-width:0}.gemboss-ei-swatch{flex:none;width:32px;height:32px;padding:0;border:1px solid var(--gemboss-divider);border-radius:8px;background:var(--gemboss-surface);cursor:pointer}.gemboss-ei-swatch::-webkit-color-swatch-wrapper{padding:2px}.gemboss-ei-swatch::-webkit-color-swatch{border:none;border-radius:6px}.gemboss-ei-swatch[data-empty]::-webkit-color-swatch{background-image:linear-gradient(to top right,#0000 46%,var(--gemboss-text-muted,#686b71) 46% 54%,#0000 54%)}.gemboss-ei-swatch:disabled{cursor:default;opacity:.7}:is(.gemboss-ei-fld,.gemboss-ei-lbl)>label>.gemboss-ei-rangeval{float:right;font-weight:700;color:var(--gemboss-text);font-variant-numeric:tabular-nums}.gemboss-ei-range{width:100%;accent-color:var(--gemboss-primary);cursor:pointer}.gemboss-ei-range:disabled{cursor:default;opacity:.7}@media (max-width:760px){.gemboss-ei{position:static;width:auto;max-width:none;max-height:none;margin:8px;box-shadow:var(--gemboss-shadow-raised)}}.gemboss-ei-tree{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:1px}.gemboss-ei-tnode{display:flex;align-items:center;gap:4px;flex-wrap:wrap;border-radius:6px;padding-right:4px}.gemboss-ei-tnode:hover{background:var(--gemboss-surface)}.gemboss-ei-tnode.on{background:var(--gemboss-primary-soft,var(--gemboss-surface));box-shadow:inset 2px 0 0 var(--gemboss-primary)}.gemboss-ei-tname{flex:1;min-width:0;display:flex;align-items:baseline;gap:6px;border:0;background:transparent;cursor:pointer;text-align:left;padding:6px 2px;color:var(--gemboss-text);font-size:12px;font-weight:600}.gemboss-ei-tname small{font-weight:400;font-size:10px;color:var(--gemboss-text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gemboss-ei-tacts{flex:none;display:flex;gap:1px;opacity:0;transition:opacity .12s}.gemboss-ei-tnode:hover .gemboss-ei-tacts,.gemboss-ei-tnode.on .gemboss-ei-tacts,.gemboss-ei-tacts:focus-within{opacity:1}.gemboss-ei-tacts button{border:0;background:transparent;cursor:pointer;color:var(--gemboss-text-muted);font-size:11px;line-height:1;padding:4px 6px;border-radius:6px}.gemboss-ei-tacts button:hover:not(:disabled){background:var(--gemboss-surface);color:var(--gemboss-text)}.gemboss-ei-tacts button:disabled{opacity:.3;cursor:default}.gemboss-ei-tadd{flex-basis:100%;padding:4px 2px 6px}.gemboss-editor-topbar--guest{grid-template-columns:1fr auto 1fr}.gemboss-guest-mark{flex:0 0 auto;display:block}.gemboss-guest-brand{font-weight:700;letter-spacing:-.02em;font-size:15px;margin-left:8px}.gemboss-guest-note{font-size:var(--gemboss-fs-caption);color:var(--gemboss-text-muted);border:1px solid var(--gemboss-divider-soft);border-radius:999px;padding:4px 12px;white-space:nowrap}.gemboss-editor-topbar--guest .gemboss-editor-tb-right{display:flex;align-items:center;gap:16px;justify-content:flex-end}.gemboss-guest-signin{font-size:var(--gemboss-fs-body);font-weight:600;color:var(--gemboss-text-muted);text-decoration:none}.gemboss-guest-signin:hover{color:var(--gemboss-text)}.gemboss-guest-keep{border:0;border-radius:999px;background:var(--gemboss-primary);color:var(--gemboss-on-primary);cursor:pointer;font:inherit;font-size:var(--gemboss-fs-caption);font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:8px 20px;white-space:nowrap}.gemboss-guest-keep:hover{background:var(--gemboss-primary-dark)}@media (max-width: 720px){.gemboss-guest-note{display:none}}@media (max-width: 1000px){.gemboss-editor-topbar--guest{grid-template-columns:auto minmax(0,1fr)}}@media (max-width: 460px){.gemboss-guest-brand{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.gemboss-editor-topbar--guest .gemboss-editor-tb-right{gap:8px}.gemboss-editor-topbar--guest .gemboss-guest-keep{padding-inline:12px}}@media (max-width: 400px){.gemboss-editor-topbar--guest{padding-inline:8px;column-gap:8px}}
|
package/src/gemboss-tokens.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
:root{--gemboss-primary: #1b1c1e;--gemboss-primary-dark: #000000;--gemboss-primary-soft: #f2f3f5;--gemboss-accent: #5661f5;--gemboss-accent-strong: #3a44de;--gemboss-accent-soft: #eef0fe;--gemboss-text-strong: #1b1c1e;--gemboss-text: #1b1c1e;--gemboss-text-muted: #686b71;--gemboss-surface: #ffffff;--gemboss-canvas: #ffffff;--gemboss-preview-canvas: #eceef1;--gemboss-rail-bg: #ffffff;--gemboss-panel-bg: #ffffff;--gemboss-divider: #e5e7ea;--gemboss-invite-h: 0px;--gemboss-divider-soft: #edeff2;--gemboss-hover: #eceef2;--gemboss-active-bg: #f0f1f4;--gemboss-active-fg: #1b1c1e;--gemboss-danger: #d72c0d;--gemboss-danger-strong: #b42318;--gemboss-danger-soft: #fff0e9;--gemboss-danger-border: #f5c9bc;--gemboss-success: #007f5f;--gemboss-success-strong: #0a6a4c;--gemboss-success-soft: #e3f1df;--gemboss-success-border: #b7dfcd;--gemboss-warning: #9a6700;--gemboss-warning-soft: #fff8e0;--gemboss-warning-border: #f5d569;--gemboss-radius-xs: 4px;--gemboss-radius-sm: 6px;--gemboss-radius-md: 8px;--gemboss-radius-lg: 12px;--gemboss-radius-xl: 16px;--gemboss-radius-2xl: 20px;--gemboss-radius-full: 999px;--gemboss-shadow-resting: 0 1px 2px rgba(31, 30, 29, .04), 0 2px 6px rgba(31, 30, 29, .06);--gemboss-shadow-raised: 0 4px 16px rgba(31, 30, 29, .1);--gemboss-shadow-overlay: 0 16px 48px rgba(31, 30, 29, .18);--gemboss-transition-fast: .12s;--gemboss-transition-base: .15s;--gemboss-fs-micro: 11px;--gemboss-fs-caption: 12px;--gemboss-fs-body: 14px;--gemboss-fs-body-lg: 16px;--gemboss-fs-h3: 16px;--gemboss-fs-h2: 20px;--gemboss-fs-h1: 24px;--gemboss-fs-display: 30px;--gemboss-dark-bg: #0a0a0c;--gemboss-dark-rail: #0e0e11;--gemboss-dark-surface: #16161a;--gemboss-dark-surface-2: #1e1e24;--gemboss-dark-divider: #2a2a31;--gemboss-dark-text: #ededf0;--gemboss-dark-muted: #9a9aa4;--gemboss-serif: var(--p-font-family-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);--gemboss-font-sans: var(--p-font-family-sans, "Inter", -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif);--gemboss-field-bg: #fdfdfd;--gemboss-field-bg-hover: #fafafa;--gemboss-field-ink: #303030;--gemboss-field-placeholder: #616161;--gemboss-field-line: #8a8a8a;--gemboss-field-line-hover: #616161;--gemboss-field-line-active: #1a1a1a;--gemboss-chip-ink: #303633;--gemboss-chip-line: #cfd6ce;--gemboss-chip-line-hover: #aab4ad;--gemboss-chip-bg-hover: #f6f7f5;--gemboss-on-primary: #ffffff;--gemboss-topbar-bg: rgba(255, 255, 255, .98);--gemboss-nav-bg: var(--gemboss-surface);--gemboss-nav-hover: rgba(20, 19, 18, .045)}:root{--gemboss-primary: #1b1c1e;--gemboss-primary-dark: #000000;--gemboss-primary-soft: #f2f3f5;--gemboss-accent: #5661f5;--gemboss-accent-strong: #3a44de;--gemboss-accent-soft: #eef0fe;--gemboss-active-bg: #f0f1f4;--gemboss-active-fg: #1b1c1e;--gemboss-app-bg: #ffffff}
|
|
1
|
+
:root{--gemboss-primary: #1b1c1e;--gemboss-primary-dark: #000000;--gemboss-primary-soft: #f2f3f5;--gemboss-accent: #5661f5;--gemboss-accent-strong: #3a44de;--gemboss-accent-soft: #eef0fe;--gemboss-accent-wash: #f7f8ff;--gemboss-accent-tint: #dfe2ff;--gemboss-accent-mid: #c9cffd;--gemboss-text-strong: #1b1c1e;--gemboss-text: #1b1c1e;--gemboss-text-muted: #686b71;--gemboss-surface: #ffffff;--gemboss-canvas: #ffffff;--gemboss-preview-canvas: #eceef1;--gemboss-rail-bg: #ffffff;--gemboss-panel-bg: #ffffff;--gemboss-divider: #e5e7ea;--gemboss-invite-h: 0px;--gemboss-divider-soft: #edeff2;--gemboss-hover: #eceef2;--gemboss-active-bg: #f0f1f4;--gemboss-active-fg: #1b1c1e;--gemboss-danger: #d72c0d;--gemboss-danger-strong: #b42318;--gemboss-danger-soft: #fff0e9;--gemboss-danger-border: #f5c9bc;--gemboss-success: #007f5f;--gemboss-success-strong: #0a6a4c;--gemboss-success-soft: #e3f1df;--gemboss-success-border: #b7dfcd;--gemboss-warning: #9a6700;--gemboss-warning-soft: #fff8e0;--gemboss-warning-border: #f5d569;--gemboss-radius-xs: 4px;--gemboss-radius-sm: 6px;--gemboss-radius-md: 8px;--gemboss-radius-lg: 12px;--gemboss-radius-xl: 16px;--gemboss-radius-2xl: 20px;--gemboss-radius-full: 999px;--gemboss-shadow-resting: 0 1px 2px rgba(31, 30, 29, .04), 0 2px 6px rgba(31, 30, 29, .06);--gemboss-shadow-raised: 0 4px 16px rgba(31, 30, 29, .1);--gemboss-shadow-overlay: 0 16px 48px rgba(31, 30, 29, .18);--gemboss-transition-fast: .12s;--gemboss-transition-base: .15s;--gemboss-fs-micro: 11px;--gemboss-fs-caption: 12px;--gemboss-fs-body: 14px;--gemboss-fs-body-lg: 16px;--gemboss-fs-h3: 16px;--gemboss-fs-h2: 20px;--gemboss-fs-h1: 24px;--gemboss-fs-display: 30px;--gemboss-dark-bg: #0a0a0c;--gemboss-dark-rail: #0e0e11;--gemboss-dark-surface: #16161a;--gemboss-dark-surface-2: #1e1e24;--gemboss-dark-divider: #2a2a31;--gemboss-dark-text: #ededf0;--gemboss-dark-muted: #9a9aa4;--gemboss-serif: var(--p-font-family-sans, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif);--gemboss-font-sans: var(--p-font-family-sans, "Inter", -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif);--gemboss-field-bg: #fdfdfd;--gemboss-field-bg-hover: #fafafa;--gemboss-field-ink: #303030;--gemboss-field-placeholder: #616161;--gemboss-field-line: #8a8a8a;--gemboss-field-line-hover: #616161;--gemboss-field-line-active: #1a1a1a;--gemboss-chip-ink: #303633;--gemboss-chip-line: #cfd6ce;--gemboss-chip-line-hover: #aab4ad;--gemboss-chip-bg-hover: #f6f7f5;--gemboss-on-primary: #ffffff;--gemboss-topbar-bg: rgba(255, 255, 255, .98);--gemboss-nav-bg: var(--gemboss-surface);--gemboss-nav-hover: rgba(20, 19, 18, .045)}:root{--gemboss-primary: #1b1c1e;--gemboss-primary-dark: #000000;--gemboss-primary-soft: #f2f3f5;--gemboss-accent: #5661f5;--gemboss-accent-strong: #3a44de;--gemboss-accent-soft: #eef0fe;--gemboss-active-bg: #f0f1f4;--gemboss-active-fg: #1b1c1e;--gemboss-app-bg: #ffffff}
|
package/src/icons.tsx
CHANGED
|
@@ -76,6 +76,8 @@ const P = {
|
|
|
76
76
|
chevronLeft: <path d="M12.5 4.5 7 10l5.5 5.5" />,
|
|
77
77
|
chevronsDown: <path d="M6 5.5l4 4 4-4M6 10.5l4 4 4-4" />,
|
|
78
78
|
panelRight: <><rect x="3" y="3.5" width="14" height="13" rx="2" /><path d="M12.5 3.5v13" /></>,
|
|
79
|
+
// The composer's emoji button (21/10/2026): `reaction`'s face, closed and without the plus (it writes, it does not react).
|
|
80
|
+
emoji: <><circle cx="10" cy="10" r="6.5" /><path d="M7.5 11.8s.9 1.2 2.5 1.2 2.5-1.2 2.5-1.2" /><path d="M7.8 8.2h.01M12.2 8.2h.01" /></>,
|
|
79
81
|
} satisfies Record<string, React.ReactNode>;
|
|
80
82
|
// `satisfies`, not a `Record<string, …>` annotation: the annotation widened `keyof` to `string`, so a
|
|
81
83
|
// typo (`name="setings"`) type-checked and drew an empty box (review #3474).
|
package/src/index.ts
CHANGED
|
@@ -55,15 +55,21 @@ export { SettingsDialog, type SettingsDialogProps, type SettingsSectionItem } fr
|
|
|
55
55
|
export { SearchDialog, type SearchItem, type SearchSection } from "./search-dialog";
|
|
56
56
|
export { ThemeToggle } from "./theme";
|
|
57
57
|
export { THEME_KEY, themeScript } from "./theme-script";
|
|
58
|
-
export { Reactions, ReactionPicker, type ReactionsProps } from "./reactions";
|
|
58
|
+
export { Reactions, ReactionPicker, type ReactionPickerProps, type ReactionsProps } from "./reactions";
|
|
59
59
|
export { ActionCard, ActionCardItem, ActionCardSection, ActionChange, type ActionCardItemProps, type ActionCardOutcome, type ActionCardProps } from "./action-card";
|
|
60
|
+
// 0.43.0 (the Market redesign, 21/10/2026): the assistant asks one question and a person only confirms, and the pieces around it.
|
|
61
|
+
export { QuestionCard, MAX_QUESTION_CHOICES, type QuestionCardProps, type QuestionChoice, type QuestionChoices } from "./question-card";
|
|
62
|
+
export { BriefingCard, type BriefingCardProps } from "./briefing-card";
|
|
63
|
+
export { RangeBar, rangeBarGeometry, type RangeBarGeometry, type RangeBarProps } from "./range-bar";
|
|
64
|
+
export { ProgressRing, progressRingGeometry, RING_BOX, type ProgressRingGeometry, type ProgressRingProps } from "./progress-ring";
|
|
65
|
+
export { SpotArt, SPOT_ART_NAMES, type SpotArtName, type SpotArtProps } from "./spot-art";
|
|
60
66
|
export { FREQUENT_MAX, frequentReactions, isReactionEmoji, QUICK_REACTIONS, REACTION_EMOJI, REACTION_GROUPS, reactionLabel, reactionWords, searchReactions, SUGGESTED_REACTIONS, toggleReaction, type Reaction } from "./reactions-data";
|
|
61
67
|
// The team chat layer (20/10/2026, README "The team chat layer"): GemCare's channel chat for every surface, with
|
|
62
68
|
// team-chat.css its own entry. The row rules (turns, day separators, the "New messages" line) are plain data.
|
|
63
69
|
export {
|
|
64
70
|
ChannelItem, ChannelRail, ChannelSection, ChatHeader, Composer, DaySeparator, JumpToLatest, Message, MessageList, NewMessagesLine,
|
|
65
71
|
PeoplePanel, PeopleSection, PersonRow, ReadReceipt, TeamChat, ThreadPanel, TEAM_CHAT_DRAWER_MAX, TEAM_CHAT_LABELS, TEAM_CHAT_PHONE_MAX,
|
|
66
|
-
type ChannelItemProps, type ChannelKind, type ChannelRailProps, type ChatHeaderProps, type ComposerProps, type MessageListProps, type MessageProps,
|
|
72
|
+
type ChannelItemProps, type ChannelKind, type ChannelRailProps, type ChatHeaderProps, type ComposerProps, type DmAvatar, type MessageListProps, type MessageProps,
|
|
67
73
|
type PeoplePanelProps, type PersonRowProps, type Presence, type TeamChatLabels, type TeamChatPanel, type TeamChatProps, type TeamChatView, type ThreadPanelProps,
|
|
68
74
|
} from "./team-chat";
|
|
69
75
|
export { chatDayISO, chatDayKey, chatDayWord, teamChatRows, type ChatRow, type ChatRowMessage, type ChatRowOptions } from "./team-chat-data";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.ui-ring{display:block;flex:none;max-width:100%;height:auto}.ui-ring__track,.ui-ring__arc{fill:none;stroke-width:10}.ui-ring__track{stroke:var(--gemboss-accent-tint, #dfe2ff)}.ui-ring__arc{stroke:var(--gemboss-accent, #5661f5);stroke-linecap:round}.ui-ring__label{fill:var(--ui-text-strong, #1b1c1e);font-size:26px;font-weight:700;font-variant-numeric:tabular-nums}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress ring — @gemboss/ui 0.43.0. "3 of 5" as a ring with the count in the middle (the Market redesign 21/10/2026: Your store
|
|
3
|
+
* asks five things one at a time and says how far it is). The kit's `ui-progress` is a bar; a bar says "how much", a ring beside a
|
|
4
|
+
* heading says "how far along" without taking a row.
|
|
5
|
+
*
|
|
6
|
+
* Server-renderable (no state, no effect). The colours are tokens (`--gemboss-accent`, `--gemboss-accent-tint`), so the dark
|
|
7
|
+
* palette follows. A page that writes the markup itself computes the arc with `progressRingGeometry` (pure, `@gemboss/ui`
|
|
8
|
+
* index) or by hand, and links `progress-ring.css`.
|
|
9
|
+
*/
|
|
10
|
+
import "./progress-ring.css";
|
|
11
|
+
import React, { type ReactNode } from "react";
|
|
12
|
+
|
|
13
|
+
const cx = (...p: Array<string | false | null | undefined>) => p.filter(Boolean).join(" ");
|
|
14
|
+
const r1 = (n: number) => Math.round(n * 10) / 10;
|
|
15
|
+
|
|
16
|
+
/** The viewBox is 104 wide: a 10px stroke on a 42px radius leaves 5px of margin. */
|
|
17
|
+
export const RING_BOX = 104;
|
|
18
|
+
const RING_R = 42;
|
|
19
|
+
|
|
20
|
+
export interface ProgressRingGeometry {
|
|
21
|
+
/** The share done, 0 to 1. */
|
|
22
|
+
fraction: number;
|
|
23
|
+
/** The length of the whole circle, the second number of `stroke-dasharray`. */
|
|
24
|
+
circumference: number;
|
|
25
|
+
/** The length of the arc that is done, the first number of `stroke-dasharray`. */
|
|
26
|
+
dash: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The arc of a ring. `value` is clamped into 0..max, and a `max` that is not a positive number is an empty ring, never NaN
|
|
31
|
+
* in the markup: "0 of 0" is a ring with nothing in it.
|
|
32
|
+
*/
|
|
33
|
+
export function progressRingGeometry(value: number, max: number): ProgressRingGeometry {
|
|
34
|
+
const circumference = r1(2 * Math.PI * RING_R);
|
|
35
|
+
const fraction = Number.isFinite(value) && Number.isFinite(max) && max > 0 ? Math.min(Math.max(value, 0), max) / max : 0;
|
|
36
|
+
return { fraction, circumference, dash: r1(fraction * circumference) };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ProgressRingProps {
|
|
40
|
+
value: number;
|
|
41
|
+
max: number;
|
|
42
|
+
/** The size in px (default 104). The ring scales; the text inside scales with it. */
|
|
43
|
+
size?: number;
|
|
44
|
+
/** Inside the ring (default "value/max"). */
|
|
45
|
+
label?: ReactNode;
|
|
46
|
+
/** What a screen reader hears (default "value of max"). */
|
|
47
|
+
ariaLabel?: string;
|
|
48
|
+
className?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export function ProgressRing({ value, max, size = RING_BOX, label, ariaLabel, className }: ProgressRingProps) {
|
|
52
|
+
const g = progressRingGeometry(value, max);
|
|
53
|
+
// The words say what the arc says: whole numbers, inside 0..max.
|
|
54
|
+
const total = Number.isFinite(max) ? Math.max(Math.round(max), 0) : 0;
|
|
55
|
+
const shown = Math.min(Math.max(Math.round(Number.isFinite(value) ? value : 0), 0), total);
|
|
56
|
+
const mid = RING_BOX / 2;
|
|
57
|
+
return (
|
|
58
|
+
<svg className={cx("ui-ring", className)} viewBox={`0 0 ${RING_BOX} ${RING_BOX}`} width={size} height={size} role="img"
|
|
59
|
+
aria-label={ariaLabel ?? `${shown} of ${total}`}>
|
|
60
|
+
<circle className="ui-ring__track" cx={mid} cy={mid} r={RING_R} />
|
|
61
|
+
<circle className="ui-ring__arc" cx={mid} cy={mid} r={RING_R} strokeDasharray={`${g.dash} ${g.circumference}`} transform={`rotate(-90 ${mid} ${mid})`} />
|
|
62
|
+
<text className="ui-ring__label" x={mid} y={mid + 8} textAnchor="middle">{label ?? `${shown}/${total}`}</text>
|
|
63
|
+
</svg>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.ui-qcard{display:grid;gap:24px;min-width:0;padding:28px;border:1px solid var(--ui-border);border-radius:var(--gemboss-radius-xl, 16px);background:var(--ui-surface);box-shadow:var(--gemboss-shadow-resting, 0 1px 2px rgba(31, 30, 29, .04), 0 2px 6px rgba(31, 30, 29, .06))}.ui-qcard__head{display:flex;align-items:center;gap:24px;min-width:0}.ui-qcard__art{flex:none}.ui-qcard__ask{display:grid;gap:6px;min-width:0}.ui-qcard__eyebrow{margin:0;font-size:var(--gemboss-fs-caption, 12px);line-height:16px;color:var(--ui-text-muted)}.ui-qcard__question{margin:0;font-size:var(--gemboss-fs-h2, 20px);line-height:28px;font-weight:650;letter-spacing:-.01em;color:var(--ui-text-strong);overflow-wrap:anywhere}.ui-qcard__evidence{display:flex;flex-wrap:wrap;gap:8px;margin-top:2px}.ui-qcard__choices{display:grid;gap:10px;min-width:0}.ui-qcard__choice{position:relative;display:flex;align-items:center;gap:14px;min-width:0;min-height:44px;box-sizing:border-box;padding:14px 16px;border:1px solid var(--ui-border);border-radius:var(--gemboss-radius-lg, 12px);background:var(--ui-surface);cursor:pointer;transition:border-color var(--gemboss-transition-fast, .12s),background-color var(--gemboss-transition-fast, .12s)}.ui-qcard__choice:hover{border-color:var(--ui-text-muted)}.ui-qcard__input{position:absolute;width:1px;height:1px;margin:0;opacity:0;pointer-events:none}.ui-qcard__choice:has(>input:checked){border-color:var(--gemboss-accent, #5661f5);background:var(--gemboss-accent-wash, #f7f8ff);box-shadow:0 0 0 3px var(--gemboss-accent-soft, #eef0fe)}.ui-qcard__choice:has(>input:focus-visible){outline:2px solid var(--ui-focus);outline-offset:2px}.ui-qcard__choice:has(>input:disabled){cursor:default;opacity:.6}.ui-qcard__dot{flex:none;display:inline-grid;place-content:center;width:18px;height:18px;box-sizing:border-box;border:1.5px solid var(--ui-text-muted);border-radius:50%}.ui-qcard__choice:has(>input:checked) .ui-qcard__dot{border-color:var(--gemboss-accent, #5661f5);background:var(--gemboss-accent, #5661f5)}.ui-qcard__choice:has(>input:checked) .ui-qcard__dot:after{content:"";width:6px;height:6px;border-radius:50%;background:var(--gemboss-surface, #fff)}.ui-qcard__text{display:grid;flex:1;gap:2px;min-width:0}.ui-qcard__label{font-weight:600;color:var(--ui-text-strong);overflow-wrap:anywhere}.ui-qcard__note{font-size:var(--gemboss-fs-caption, 12px);line-height:16px;color:var(--ui-text-muted)}.ui-qcard__pick{flex:none;background:var(--gemboss-accent-soft, #eef0fe);color:var(--gemboss-accent-strong, #3a44de)}.ui-qcard__foot{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px}.ui-qcard__confirm{min-height:36px;padding-inline:22px}.ui-qcard__fine{flex-basis:100%;margin:0;font-size:var(--gemboss-fs-caption, 12px);line-height:16px;color:var(--ui-text-muted)}@media (pointer: coarse),(max-width: 47.9975em){.ui-qcard{padding:20px}.ui-qcard__choice{min-height:48px}.ui-qcard__confirm{min-height:44px}}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Question card — @gemboss/ui 0.43.0. The one look for "the assistant asks, a person only confirms" (Chris 21/10/2026, the Market
|
|
3
|
+
* redesign: "trợ lý trang cũng phải đặt câu hỏi rõ ràng và có thể là cần fill sẵn câu trả lời chứ ko bắt user phải nghĩ gì hết chỉ
|
|
4
|
+
* confirm thôi", "thậm chí đưa cho họ 1 - 3 lựa chọn tối đa"). README "Question card".
|
|
5
|
+
*
|
|
6
|
+
* The contract it draws, which every surface keeps:
|
|
7
|
+
* - ONE question at a time, in the person's words;
|
|
8
|
+
* - the answer is already chosen: the first choice is the assistant's best guess (`pick`), with where it came from in `note`
|
|
9
|
+
* ("From your site"), so the person confirms instead of thinking;
|
|
10
|
+
* - ONE TO THREE choices, never more: the type refuses a fourth (`QuestionChoices`), and a list that gets past the type
|
|
11
|
+
* (a cast, plain JS) is cut to the first three, because a fourth is a form;
|
|
12
|
+
* - one primary button confirms the chosen one; typing your own answer and skipping are quiet buttons, offered only when the
|
|
13
|
+
* surface handles them;
|
|
14
|
+
* - nothing is saved by choosing: `onChange` moves the selection, `onConfirm` is the only thing that commits (the surface shows
|
|
15
|
+
* Undo after, as `ActionCard` does).
|
|
16
|
+
*
|
|
17
|
+
* Presentational and controlled: no state of its own, so it renders on the server. The choices are real radio inputs (a keyboard
|
|
18
|
+
* and a screen reader get a radio group, the arrow keys move the selection); the dot and the highlight are drawn by the card.
|
|
19
|
+
* Its stylesheet travels with it (`question-card.css`, own entry; `@gemboss/ui/question-card.css` for a plain-HTML surface that
|
|
20
|
+
* writes the same classes).
|
|
21
|
+
*/
|
|
22
|
+
import "./question-card.css";
|
|
23
|
+
import React, { type ReactNode } from "react";
|
|
24
|
+
|
|
25
|
+
const cx = (...p: Array<string | false | null | undefined>) => p.filter(Boolean).join(" ");
|
|
26
|
+
|
|
27
|
+
/** The most choices a question offers. Said once, so a surface and its test read the same number. */
|
|
28
|
+
export const MAX_QUESTION_CHOICES = 3;
|
|
29
|
+
|
|
30
|
+
export interface QuestionChoice {
|
|
31
|
+
/** What `value`, `onChange` and `onConfirm` carry. Unique in the question. */
|
|
32
|
+
id: string;
|
|
33
|
+
label: ReactNode;
|
|
34
|
+
/** Where the choice came from, one short line: "From your site", "From ketone.com's ads". */
|
|
35
|
+
note?: ReactNode;
|
|
36
|
+
/** The assistant's best guess: gets the pick tag. At most one choice should carry it, and it goes first. */
|
|
37
|
+
pick?: boolean;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** One, two or three choices. A fourth does not type-check. */
|
|
41
|
+
export type QuestionChoices =
|
|
42
|
+
| readonly [QuestionChoice]
|
|
43
|
+
| readonly [QuestionChoice, QuestionChoice]
|
|
44
|
+
| readonly [QuestionChoice, QuestionChoice, QuestionChoice];
|
|
45
|
+
|
|
46
|
+
export interface QuestionCardProps {
|
|
47
|
+
/** The radio group's name and the base of the ids this card writes. Unique on the page. */
|
|
48
|
+
id: string;
|
|
49
|
+
question: ReactNode;
|
|
50
|
+
/** Above the question: "Question 2 of 4". */
|
|
51
|
+
eyebrow?: ReactNode;
|
|
52
|
+
/** Small chips under the question that say what the guess rests on: "$59.95 to $110.70". */
|
|
53
|
+
evidence?: ReactNode;
|
|
54
|
+
/** A picture beside the question (`SpotArt`). */
|
|
55
|
+
art?: ReactNode;
|
|
56
|
+
choices: QuestionChoices;
|
|
57
|
+
/** The `id` of the chosen choice. Start with the `pick`. */
|
|
58
|
+
value: string;
|
|
59
|
+
onChange: (id: string) => void;
|
|
60
|
+
/** "Yes, that one". Names what happens. */
|
|
61
|
+
confirmLabel: ReactNode;
|
|
62
|
+
onConfirm: (id: string) => void;
|
|
63
|
+
/** The tag on the pick (default "Gem's pick"). */
|
|
64
|
+
pickLabel?: ReactNode;
|
|
65
|
+
/** Typing an answer of their own: shown only when handled. */
|
|
66
|
+
onOther?: () => void;
|
|
67
|
+
otherLabel?: ReactNode;
|
|
68
|
+
onSkip?: () => void;
|
|
69
|
+
skipLabel?: ReactNode;
|
|
70
|
+
/** Under the buttons: "Nothing is saved until you confirm." */
|
|
71
|
+
fine?: ReactNode;
|
|
72
|
+
/** While the confirm is being saved: the card stops taking input. */
|
|
73
|
+
busy?: boolean;
|
|
74
|
+
className?: string;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function QuestionCard({
|
|
78
|
+
id, question, eyebrow, evidence, art, choices, value, onChange, confirmLabel, onConfirm, pickLabel = "Gem's pick",
|
|
79
|
+
onOther, otherLabel = "Type my own", onSkip, skipLabel = "Skip", fine, busy, className,
|
|
80
|
+
}: QuestionCardProps) {
|
|
81
|
+
const list: readonly QuestionChoice[] = choices.slice(0, MAX_QUESTION_CHOICES);
|
|
82
|
+
const qid = `${id}-q`;
|
|
83
|
+
return (
|
|
84
|
+
<section className={cx("ui-qcard", className)} aria-labelledby={qid} aria-busy={busy || undefined}>
|
|
85
|
+
<header className="ui-qcard__head">
|
|
86
|
+
{art ? <div className="ui-qcard__art" aria-hidden>{art}</div> : null}
|
|
87
|
+
<div className="ui-qcard__ask">
|
|
88
|
+
{eyebrow ? <p className="ui-qcard__eyebrow">{eyebrow}</p> : null}
|
|
89
|
+
<h2 className="ui-qcard__question" id={qid}>{question}</h2>
|
|
90
|
+
{evidence ? <div className="ui-qcard__evidence">{evidence}</div> : null}
|
|
91
|
+
</div>
|
|
92
|
+
</header>
|
|
93
|
+
<div className="ui-qcard__choices" role="radiogroup" aria-labelledby={qid}>
|
|
94
|
+
{list.map((c) => (
|
|
95
|
+
<label className="ui-qcard__choice" key={c.id}>
|
|
96
|
+
<input className="ui-qcard__input" type="radio" name={id} value={c.id} checked={value === c.id} disabled={busy}
|
|
97
|
+
onChange={() => onChange(c.id)} />
|
|
98
|
+
<span className="ui-qcard__dot" aria-hidden />
|
|
99
|
+
<span className="ui-qcard__text">
|
|
100
|
+
<span className="ui-qcard__label">{c.label}</span>
|
|
101
|
+
{c.note ? <span className="ui-qcard__note">{c.note}</span> : null}
|
|
102
|
+
</span>
|
|
103
|
+
{c.pick ? <span className="ui-tag ui-tag--accent ui-qcard__pick">{pickLabel}</span> : null}
|
|
104
|
+
</label>
|
|
105
|
+
))}
|
|
106
|
+
</div>
|
|
107
|
+
<div className="ui-qcard__foot">
|
|
108
|
+
<button type="button" className="ui-btn ui-btn--primary ui-qcard__confirm" disabled={busy || !list.some((c) => c.id === value)}
|
|
109
|
+
onClick={() => onConfirm(value)}>{confirmLabel}</button>
|
|
110
|
+
{onOther ? <button type="button" className="ui-btn ui-btn--ghost" disabled={busy} onClick={onOther}>{otherLabel}</button> : null}
|
|
111
|
+
{onSkip ? <button type="button" className="ui-btn ui-btn--ghost" disabled={busy} onClick={onSkip}>{skipLabel}</button> : null}
|
|
112
|
+
{fine ? <p className="ui-qcard__fine">{fine}</p> : null}
|
|
113
|
+
</div>
|
|
114
|
+
</section>
|
|
115
|
+
);
|
|
116
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.ui-rangebar{position:relative;min-width:0}.ui-rangebar--sm{height:44px}.ui-rangebar--lg{height:132px}.ui-rangebar__track,.ui-rangebar__grid,.ui-rangebar__band,.ui-rangebar__mid,.ui-rangebar__you{position:absolute;display:block}.ui-rangebar__track{left:0;right:0;height:6px;border-radius:3px;background:var(--gemboss-divider-soft, #edeff2)}.ui-rangebar--sm .ui-rangebar__track{top:20px;height:4px}.ui-rangebar--lg .ui-rangebar__track{top:56px}.ui-rangebar__grid{width:1px;background:var(--gemboss-divider-soft, #edeff2)}.ui-rangebar--sm .ui-rangebar__grid{display:none}.ui-rangebar--lg .ui-rangebar__grid{top:36px;height:46px}.ui-rangebar__band{background:var(--gemboss-accent-tint, #dfe2ff)}.ui-rangebar--sm .ui-rangebar__band{top:14px;height:16px;border-radius:6px}.ui-rangebar--lg .ui-rangebar__band{top:44px;height:30px;border-radius:var(--gemboss-radius-lg, 12px)}.ui-rangebar__mid{width:2px;background:var(--gemboss-accent, #5661f5)}.ui-rangebar--sm .ui-rangebar__mid{top:10px;height:24px}.ui-rangebar--lg .ui-rangebar__mid{top:36px;height:46px}.ui-rangebar__you{box-sizing:border-box;border-radius:50%;background:var(--gemboss-text-strong, #1b1c1e);border:3px solid var(--gemboss-surface, #fff);box-shadow:0 0 0 1px var(--gemboss-text-strong, #1b1c1e);transform:translate(-50%)}.ui-rangebar--sm .ui-rangebar__you{top:13px;width:18px;height:18px}.ui-rangebar--lg .ui-rangebar__you{top:46px;width:26px;height:26px;border-width:4px}.ui-rangebar__tag,.ui-rangebar__caption,.ui-rangebar__tick{position:absolute;font-size:var(--gemboss-fs-caption, 12px);line-height:16px;white-space:nowrap;font-variant-numeric:tabular-nums}.ui-rangebar__tag{top:10px;transform:translate(-50%);font-weight:650;color:var(--ui-text-strong, #1b1c1e)}.ui-rangebar__tag--mid{color:var(--gemboss-accent-strong, #3a44de)}.ui-rangebar__tag--you{color:var(--ui-text-strong, #1b1c1e)}.ui-rangebar__caption{top:92px;text-align:center;color:var(--ui-text-muted, #686b71)}.ui-rangebar__tick{top:116px;transform:translate(-50%);color:var(--ui-text-muted, #686b71)}.ui-rangebar__tick--start{transform:none}.ui-rangebar__tick--end{transform:translate(-100%)}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Range bar — @gemboss/ui 0.43.0. One value against a market's spread, on one axis: the band where half of the market sits, its
|
|
3
|
+
* middle, and where you are (the Market redesign 21/10/2026: "where your prices sit"). The kit's `ShareBar` divides one whole,
|
|
4
|
+
* `Sparkline` draws a trend, `ui-progress` one value; none of them says "here is the spread, and here is you inside or outside it".
|
|
5
|
+
*
|
|
6
|
+
* Two sizes. `sm` is the shape alone, for a metric tile. `lg` adds the labels: the middle above its tick, "You" above the dot,
|
|
7
|
+
* what the band is under it, and the axis numbers under that. The numbers are the surface's (`format`, `labels`): the bar does no
|
|
8
|
+
* money maths and names no currency.
|
|
9
|
+
*
|
|
10
|
+
* Server-renderable (no state, no effect). The colours are tokens, so the dark palette follows. Positions are inline percentages:
|
|
11
|
+
* a plain-HTML page under a CSP that forbids inline style (gemcare: `style-src 'self'`) computes them with `rangeBarGeometry`
|
|
12
|
+
* (pure, `@gemboss/ui` index) and sets them from its own stylesheet or script.
|
|
13
|
+
*/
|
|
14
|
+
import "./range-bar.css";
|
|
15
|
+
import React, { type ReactNode } from "react";
|
|
16
|
+
|
|
17
|
+
const cx = (...p: Array<string | false | null | undefined>) => p.filter(Boolean).join(" ");
|
|
18
|
+
const r2 = (n: number) => Math.round(n * 100) / 100;
|
|
19
|
+
const isNum = (n: unknown): n is number => typeof n === "number" && Number.isFinite(n);
|
|
20
|
+
|
|
21
|
+
export interface RangeBarGeometry {
|
|
22
|
+
/** The band, in percent of the axis; null when it was not given, or when it has no width left inside the axis. */
|
|
23
|
+
band: { left: number; width: number } | null;
|
|
24
|
+
/** The middle, in percent of the axis. */
|
|
25
|
+
mid: number | null;
|
|
26
|
+
/** The value, in percent of the axis. */
|
|
27
|
+
you: number | null;
|
|
28
|
+
/** Each tick: its value and its place, in percent. */
|
|
29
|
+
ticks: Array<{ value: number; at: number }>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Where each thing sits on the axis, as percentages. A value outside the axis is pinned to its edge (a price far above the range
|
|
34
|
+
* still shows, at the end, instead of leaving the bar), a band given high-to-low is turned round, and anything that is not a finite
|
|
35
|
+
* number is left out rather than drawn at NaN%. An axis with no width draws nothing.
|
|
36
|
+
*/
|
|
37
|
+
export function rangeBarGeometry(opts: {
|
|
38
|
+
axis: readonly [number, number]; band?: readonly [number, number] | null; mid?: number | null; you?: number | null; ticks?: readonly number[];
|
|
39
|
+
}): RangeBarGeometry {
|
|
40
|
+
const [lo, hi] = opts.axis;
|
|
41
|
+
const empty: RangeBarGeometry = { band: null, mid: null, you: null, ticks: [] };
|
|
42
|
+
if (!isNum(lo) || !isNum(hi) || hi <= lo) return empty;
|
|
43
|
+
const span = hi - lo;
|
|
44
|
+
const at = (v: number) => r2((Math.min(Math.max(v, lo), hi) - lo) / span * 100);
|
|
45
|
+
let band: RangeBarGeometry["band"] = null;
|
|
46
|
+
if (opts.band && isNum(opts.band[0]) && isNum(opts.band[1])) {
|
|
47
|
+
const a = at(Math.min(opts.band[0], opts.band[1]));
|
|
48
|
+
const b = at(Math.max(opts.band[0], opts.band[1]));
|
|
49
|
+
band = b > a ? { left: a, width: r2(b - a) } : null;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
band,
|
|
53
|
+
mid: isNum(opts.mid) ? at(opts.mid) : null,
|
|
54
|
+
you: isNum(opts.you) ? at(opts.you) : null,
|
|
55
|
+
ticks: (opts.ticks ?? []).filter(isNum).filter((v) => v >= lo && v <= hi).map((value) => ({ value, at: at(value) })),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface RangeBarProps {
|
|
60
|
+
/** The two ends of the axis, low then high. */
|
|
61
|
+
axis: readonly [number, number];
|
|
62
|
+
/** Where half of the market sits: low then high. */
|
|
63
|
+
band?: readonly [number, number] | null;
|
|
64
|
+
/** The market's middle. */
|
|
65
|
+
mid?: number | null;
|
|
66
|
+
/** The value being placed. */
|
|
67
|
+
you?: number | null;
|
|
68
|
+
/** Axis numbers to print under the bar (`lg` only), e.g. [0, 20, 40, 60, 80]. */
|
|
69
|
+
ticks?: readonly number[];
|
|
70
|
+
/** A number as the surface writes it: "$26.99". Used for the tick labels. */
|
|
71
|
+
format?: (n: number) => string;
|
|
72
|
+
/** The words (`lg` only): above the middle's tick, above the dot, under the band. */
|
|
73
|
+
labels?: { mid?: ReactNode; you?: ReactNode; band?: ReactNode };
|
|
74
|
+
size?: "sm" | "lg";
|
|
75
|
+
/** What a screen reader hears: say the numbers, the bar has no text of its own to read. */
|
|
76
|
+
ariaLabel: string;
|
|
77
|
+
className?: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const pos = (n: number) => ({ left: `${n}%` });
|
|
81
|
+
|
|
82
|
+
export function RangeBar({ axis, band, mid, you, ticks, format, labels, size = "lg", ariaLabel, className }: RangeBarProps) {
|
|
83
|
+
const g = rangeBarGeometry({ axis, band, mid, you, ticks });
|
|
84
|
+
const lg = size === "lg";
|
|
85
|
+
return (
|
|
86
|
+
<div className={cx("ui-rangebar", lg ? "ui-rangebar--lg" : "ui-rangebar--sm", className)} role="img" aria-label={ariaLabel}>
|
|
87
|
+
{g.ticks.map((t) => <span className="ui-rangebar__grid" style={pos(t.at)} key={t.value} />)}
|
|
88
|
+
<span className="ui-rangebar__track" />
|
|
89
|
+
{g.band ? <span className="ui-rangebar__band" style={{ left: `${g.band.left}%`, width: `${g.band.width}%` }} /> : null}
|
|
90
|
+
{g.mid !== null ? <span className="ui-rangebar__mid" style={pos(g.mid)} /> : null}
|
|
91
|
+
{g.you !== null ? <span className="ui-rangebar__you" style={pos(g.you)} /> : null}
|
|
92
|
+
{lg && g.mid !== null && labels?.mid ? <span className="ui-rangebar__tag ui-rangebar__tag--mid" style={pos(g.mid)}>{labels.mid}</span> : null}
|
|
93
|
+
{lg && g.you !== null && labels?.you ? <span className="ui-rangebar__tag ui-rangebar__tag--you" style={pos(g.you)}>{labels.you}</span> : null}
|
|
94
|
+
{lg && g.band && labels?.band ? <span className="ui-rangebar__caption" style={{ left: `${g.band.left}%`, width: `${g.band.width}%` }}>{labels.band}</span> : null}
|
|
95
|
+
{lg ? g.ticks.map((t) => (
|
|
96
|
+
<span className={cx("ui-rangebar__tick", t.at <= 0 && "ui-rangebar__tick--start", t.at >= 100 && "ui-rangebar__tick--end")} style={pos(t.at)} key={`t${t.value}`}>
|
|
97
|
+
{format ? format(t.value) : String(t.value)}
|
|
98
|
+
</span>
|
|
99
|
+
)) : null}
|
|
100
|
+
</div>
|
|
101
|
+
);
|
|
102
|
+
}
|