mirror of
https://github.com/CharaChorder/DeviceManager.git
synced 2026-01-11 12:32:55 +00:00
2437 lines
193 KiB
JavaScript
2437 lines
193 KiB
JavaScript
import {
|
||
getControlId,
|
||
getControlSetterButtonId
|
||
} from "./chunk-XAKDEK6E.js";
|
||
import {
|
||
Code,
|
||
ErrorFormatter,
|
||
FlexBar,
|
||
Form,
|
||
H2,
|
||
H3,
|
||
IconButton,
|
||
IconButtonSkeleton,
|
||
Icons,
|
||
Link2,
|
||
Loader,
|
||
ResetWrapper,
|
||
SyntaxHighlighter2,
|
||
TabsState,
|
||
WithTooltipPure,
|
||
Zoom,
|
||
codeCommon,
|
||
components2,
|
||
getStoryHref,
|
||
nameSpaceClassNames,
|
||
withReset
|
||
} from "./chunk-WPN4YTZV.js";
|
||
import {
|
||
ActionBar
|
||
} from "./chunk-MG53EUVU.js";
|
||
import {
|
||
ThemeProvider,
|
||
convert,
|
||
ensure,
|
||
ignoreSsrWarning,
|
||
newStyled,
|
||
themes,
|
||
useTheme
|
||
} from "./chunk-CDRAQW5B.js";
|
||
import {
|
||
SNIPPET_RENDERED,
|
||
SourceType,
|
||
str
|
||
} from "./chunk-Z4TEKGYV.js";
|
||
import {
|
||
v
|
||
} from "./chunk-EO6MPZI4.js";
|
||
import {
|
||
stringify
|
||
} from "./chunk-B376H6MM.js";
|
||
import {
|
||
require_uniq
|
||
} from "./chunk-Z6P5WSTI.js";
|
||
import {
|
||
index_modern_default
|
||
} from "./chunk-4XFCFKO6.js";
|
||
import {
|
||
require_memoizerific
|
||
} from "./chunk-LZHTSQYG.js";
|
||
import {
|
||
curriedDarken$1,
|
||
curriedLighten$1,
|
||
curriedOpacify$1,
|
||
curriedTransparentize$1,
|
||
rgba
|
||
} from "./chunk-DA2XD3ET.js";
|
||
import {
|
||
require_pickBy
|
||
} from "./chunk-NRUQJTCU.js";
|
||
import {
|
||
require_mapValues
|
||
} from "./chunk-FPWI56YW.js";
|
||
import {
|
||
require_cloneDeep
|
||
} from "./chunk-VC36OOFH.js";
|
||
import {
|
||
require_core_events
|
||
} from "./chunk-Z4RIRXNM.js";
|
||
import {
|
||
esm_default
|
||
} from "./chunk-J6CEENEN.js";
|
||
import {
|
||
require_global
|
||
} from "./chunk-2KOEBCKA.js";
|
||
import {
|
||
require_preview_api
|
||
} from "./chunk-CQBMCNM3.js";
|
||
import {
|
||
require_react
|
||
} from "./chunk-GIE7IIVL.js";
|
||
import {
|
||
require_channels
|
||
} from "./chunk-DXLZCPJ7.js";
|
||
import {
|
||
require_client_logger
|
||
} from "./chunk-3GLQDQAQ.js";
|
||
import {
|
||
__commonJS,
|
||
__toESM
|
||
} from "./chunk-USJHI7ER.js";
|
||
|
||
// node_modules/tocbot/src/js/default-options.js
|
||
var require_default_options = __commonJS({
|
||
"node_modules/tocbot/src/js/default-options.js"(exports, module) {
|
||
module.exports = {
|
||
// Where to render the table of contents.
|
||
tocSelector: ".js-toc",
|
||
// Where to grab the headings to build the table of contents.
|
||
contentSelector: ".js-toc-content",
|
||
// Which headings to grab inside of the contentSelector element.
|
||
headingSelector: "h1, h2, h3",
|
||
// Headings that match the ignoreSelector will be skipped.
|
||
ignoreSelector: ".js-toc-ignore",
|
||
// For headings inside relative or absolute positioned containers within content
|
||
hasInnerContainers: false,
|
||
// Main class to add to links.
|
||
linkClass: "toc-link",
|
||
// Extra classes to add to links.
|
||
extraLinkClasses: "",
|
||
// Class to add to active links,
|
||
// the link corresponding to the top most heading on the page.
|
||
activeLinkClass: "is-active-link",
|
||
// Main class to add to lists.
|
||
listClass: "toc-list",
|
||
// Extra classes to add to lists.
|
||
extraListClasses: "",
|
||
// Class that gets added when a list should be collapsed.
|
||
isCollapsedClass: "is-collapsed",
|
||
// Class that gets added when a list should be able
|
||
// to be collapsed but isn't necessarily collapsed.
|
||
collapsibleClass: "is-collapsible",
|
||
// Class to add to list items.
|
||
listItemClass: "toc-list-item",
|
||
// Class to add to active list items.
|
||
activeListItemClass: "is-active-li",
|
||
// How many heading levels should not be collapsed.
|
||
// For example, number 6 will show everything since
|
||
// there are only 6 heading levels and number 0 will collapse them all.
|
||
// The sections that are hidden will open
|
||
// and close as you scroll to headings within them.
|
||
collapseDepth: 0,
|
||
// Smooth scrolling enabled.
|
||
scrollSmooth: true,
|
||
// Smooth scroll duration.
|
||
scrollSmoothDuration: 420,
|
||
// Smooth scroll offset.
|
||
scrollSmoothOffset: 0,
|
||
// Callback for scroll end.
|
||
scrollEndCallback: function(e) {
|
||
},
|
||
// Headings offset between the headings and the top of the document (this is meant for minor adjustments).
|
||
headingsOffset: 1,
|
||
// Timeout between events firing to make sure it's
|
||
// not too rapid (for performance reasons).
|
||
throttleTimeout: 50,
|
||
// Element to add the positionFixedClass to.
|
||
positionFixedSelector: null,
|
||
// Fixed position class to add to make sidebar fixed after scrolling
|
||
// down past the fixedSidebarOffset.
|
||
positionFixedClass: "is-position-fixed",
|
||
// fixedSidebarOffset can be any number but by default is set
|
||
// to auto which sets the fixedSidebarOffset to the sidebar
|
||
// element's offsetTop from the top of the document on init.
|
||
fixedSidebarOffset: "auto",
|
||
// includeHtml can be set to true to include the HTML markup from the
|
||
// heading node instead of just including the textContent.
|
||
includeHtml: false,
|
||
// includeTitleTags automatically sets the html title tag of the link
|
||
// to match the title. This can be useful for SEO purposes or
|
||
// when truncating titles.
|
||
includeTitleTags: false,
|
||
// onclick function to apply to all links in toc. will be called with
|
||
// the event as the first parameter, and this can be used to stop,
|
||
// propagation, prevent default or perform action
|
||
onClick: function(e) {
|
||
},
|
||
// orderedList can be set to false to generate unordered lists (ul)
|
||
// instead of ordered lists (ol)
|
||
orderedList: true,
|
||
// If there is a fixed article scroll container, set to calculate titles' offset
|
||
scrollContainer: null,
|
||
// prevent ToC DOM rendering if it's already rendered by an external system
|
||
skipRendering: false,
|
||
// Optional callback to change heading labels.
|
||
// For example it can be used to cut down and put ellipses on multiline headings you deem too long.
|
||
// Called each time a heading is parsed. Expects a string and returns the modified label to display.
|
||
// Additionally, the attribute `data-heading-label` may be used on a heading to specify
|
||
// a shorter string to be used in the TOC.
|
||
// function (string) => string
|
||
headingLabelCallback: false,
|
||
// ignore headings that are hidden in DOM
|
||
ignoreHiddenElements: false,
|
||
// Optional callback to modify properties of parsed headings.
|
||
// The heading element is passed in node parameter and information parsed by default parser is provided in obj parameter.
|
||
// Function has to return the same or modified obj.
|
||
// The heading will be excluded from TOC if nothing is returned.
|
||
// function (object, HTMLElement) => object | void
|
||
headingObjectCallback: null,
|
||
// Set the base path, useful if you use a `base` tag in `head`.
|
||
basePath: "",
|
||
// Only takes affect when `tocSelector` is scrolling,
|
||
// keep the toc scroll position in sync with the content.
|
||
disableTocScrollSync: false,
|
||
// Offset for the toc scroll (top) position when scrolling the page.
|
||
// Only effective if `disableTocScrollSync` is false.
|
||
tocScrollOffset: 0
|
||
};
|
||
}
|
||
});
|
||
|
||
// node_modules/tocbot/src/js/build-html.js
|
||
var require_build_html = __commonJS({
|
||
"node_modules/tocbot/src/js/build-html.js"(exports, module) {
|
||
module.exports = function(options) {
|
||
var forEach = [].forEach;
|
||
var some = [].some;
|
||
var body = document.body;
|
||
var tocElement;
|
||
var currentlyHighlighting = true;
|
||
var SPACE_CHAR = " ";
|
||
function createEl(d, container) {
|
||
var link = container.appendChild(createLink(d));
|
||
if (d.children.length) {
|
||
var list = createList(d.isCollapsed);
|
||
d.children.forEach(function(child) {
|
||
createEl(child, list);
|
||
});
|
||
link.appendChild(list);
|
||
}
|
||
}
|
||
function render(parent, data) {
|
||
var collapsed = false;
|
||
var container = createList(collapsed);
|
||
data.forEach(function(d) {
|
||
createEl(d, container);
|
||
});
|
||
tocElement = parent || tocElement;
|
||
if (tocElement === null) {
|
||
return;
|
||
}
|
||
if (tocElement.firstChild) {
|
||
tocElement.removeChild(tocElement.firstChild);
|
||
}
|
||
if (data.length === 0) {
|
||
return tocElement;
|
||
}
|
||
return tocElement.appendChild(container);
|
||
}
|
||
function createLink(data) {
|
||
var item = document.createElement("li");
|
||
var a = document.createElement("a");
|
||
if (options.listItemClass) {
|
||
item.setAttribute("class", options.listItemClass);
|
||
}
|
||
if (options.onClick) {
|
||
a.onclick = options.onClick;
|
||
}
|
||
if (options.includeTitleTags) {
|
||
a.setAttribute("title", data.textContent);
|
||
}
|
||
if (options.includeHtml && data.childNodes.length) {
|
||
forEach.call(data.childNodes, function(node) {
|
||
a.appendChild(node.cloneNode(true));
|
||
});
|
||
} else {
|
||
a.textContent = data.textContent;
|
||
}
|
||
a.setAttribute("href", options.basePath + "#" + data.id);
|
||
a.setAttribute("class", options.linkClass + SPACE_CHAR + "node-name--" + data.nodeName + SPACE_CHAR + options.extraLinkClasses);
|
||
item.appendChild(a);
|
||
return item;
|
||
}
|
||
function createList(isCollapsed) {
|
||
var listElement = options.orderedList ? "ol" : "ul";
|
||
var list = document.createElement(listElement);
|
||
var classes = options.listClass + SPACE_CHAR + options.extraListClasses;
|
||
if (isCollapsed) {
|
||
classes = classes + SPACE_CHAR + options.collapsibleClass;
|
||
classes = classes + SPACE_CHAR + options.isCollapsedClass;
|
||
}
|
||
list.setAttribute("class", classes);
|
||
return list;
|
||
}
|
||
function updateFixedSidebarClass() {
|
||
if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
|
||
var top;
|
||
top = document.querySelector(options.scrollContainer).scrollTop;
|
||
} else {
|
||
top = document.documentElement.scrollTop || body.scrollTop;
|
||
}
|
||
var posFixedEl = document.querySelector(options.positionFixedSelector);
|
||
if (options.fixedSidebarOffset === "auto") {
|
||
options.fixedSidebarOffset = tocElement.offsetTop;
|
||
}
|
||
if (top > options.fixedSidebarOffset) {
|
||
if (posFixedEl.className.indexOf(options.positionFixedClass) === -1) {
|
||
posFixedEl.className += SPACE_CHAR + options.positionFixedClass;
|
||
}
|
||
} else {
|
||
posFixedEl.className = posFixedEl.className.split(SPACE_CHAR + options.positionFixedClass).join("");
|
||
}
|
||
}
|
||
function getHeadingTopPos(obj) {
|
||
var position = 0;
|
||
if (obj !== null) {
|
||
position = obj.offsetTop;
|
||
if (options.hasInnerContainers) {
|
||
position += getHeadingTopPos(obj.offsetParent);
|
||
}
|
||
}
|
||
return position;
|
||
}
|
||
function updateToc(headingsArray) {
|
||
if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
|
||
var top;
|
||
top = document.querySelector(options.scrollContainer).scrollTop;
|
||
} else {
|
||
top = document.documentElement.scrollTop || body.scrollTop;
|
||
}
|
||
if (options.positionFixedSelector) {
|
||
updateFixedSidebarClass();
|
||
}
|
||
var headings = headingsArray;
|
||
var topHeader;
|
||
if (currentlyHighlighting && tocElement !== null && headings.length > 0) {
|
||
some.call(headings, function(heading, i) {
|
||
if (getHeadingTopPos(heading) > top + options.headingsOffset + 10) {
|
||
var index = i === 0 ? i : i - 1;
|
||
topHeader = headings[index];
|
||
return true;
|
||
} else if (i === headings.length - 1) {
|
||
topHeader = headings[headings.length - 1];
|
||
return true;
|
||
}
|
||
});
|
||
var oldActiveTocLink = tocElement.querySelector("." + options.activeLinkClass);
|
||
var activeTocLink = tocElement.querySelector("." + options.linkClass + ".node-name--" + topHeader.nodeName + '[href="' + options.basePath + "#" + topHeader.id.replace(/([ #;&,.+*~':"!^$[\]()=>|/\\@])/g, "\\$1") + '"]');
|
||
if (oldActiveTocLink === activeTocLink) {
|
||
return;
|
||
}
|
||
var tocLinks = tocElement.querySelectorAll("." + options.linkClass);
|
||
forEach.call(tocLinks, function(tocLink) {
|
||
tocLink.className = tocLink.className.split(SPACE_CHAR + options.activeLinkClass).join("");
|
||
});
|
||
var tocLis = tocElement.querySelectorAll("." + options.listItemClass);
|
||
forEach.call(tocLis, function(tocLi) {
|
||
tocLi.className = tocLi.className.split(SPACE_CHAR + options.activeListItemClass).join("");
|
||
});
|
||
if (activeTocLink && activeTocLink.className.indexOf(options.activeLinkClass) === -1) {
|
||
activeTocLink.className += SPACE_CHAR + options.activeLinkClass;
|
||
}
|
||
var li = activeTocLink && activeTocLink.parentNode;
|
||
if (li && li.className.indexOf(options.activeListItemClass) === -1) {
|
||
li.className += SPACE_CHAR + options.activeListItemClass;
|
||
}
|
||
var tocLists = tocElement.querySelectorAll("." + options.listClass + "." + options.collapsibleClass);
|
||
forEach.call(tocLists, function(list) {
|
||
if (list.className.indexOf(options.isCollapsedClass) === -1) {
|
||
list.className += SPACE_CHAR + options.isCollapsedClass;
|
||
}
|
||
});
|
||
if (activeTocLink && activeTocLink.nextSibling && activeTocLink.nextSibling.className.indexOf(options.isCollapsedClass) !== -1) {
|
||
activeTocLink.nextSibling.className = activeTocLink.nextSibling.className.split(SPACE_CHAR + options.isCollapsedClass).join("");
|
||
}
|
||
removeCollapsedFromParents(activeTocLink && activeTocLink.parentNode.parentNode);
|
||
}
|
||
}
|
||
function removeCollapsedFromParents(element) {
|
||
if (element && element.className.indexOf(options.collapsibleClass) !== -1 && element.className.indexOf(options.isCollapsedClass) !== -1) {
|
||
element.className = element.className.split(SPACE_CHAR + options.isCollapsedClass).join("");
|
||
return removeCollapsedFromParents(element.parentNode.parentNode);
|
||
}
|
||
return element;
|
||
}
|
||
function disableTocAnimation(event) {
|
||
var target = event.target || event.srcElement;
|
||
if (typeof target.className !== "string" || target.className.indexOf(options.linkClass) === -1) {
|
||
return;
|
||
}
|
||
currentlyHighlighting = false;
|
||
}
|
||
function enableTocAnimation() {
|
||
currentlyHighlighting = true;
|
||
}
|
||
return {
|
||
enableTocAnimation,
|
||
disableTocAnimation,
|
||
render,
|
||
updateToc
|
||
};
|
||
};
|
||
}
|
||
});
|
||
|
||
// node_modules/tocbot/src/js/parse-content.js
|
||
var require_parse_content = __commonJS({
|
||
"node_modules/tocbot/src/js/parse-content.js"(exports, module) {
|
||
module.exports = function parseContent(options) {
|
||
var reduce = [].reduce;
|
||
function getLastItem(array2) {
|
||
return array2[array2.length - 1];
|
||
}
|
||
function getHeadingLevel(heading) {
|
||
return +heading.nodeName.toUpperCase().replace("H", "");
|
||
}
|
||
function isHTMLElement(maybeElement) {
|
||
try {
|
||
return maybeElement instanceof window.HTMLElement || maybeElement instanceof window.parent.HTMLElement;
|
||
} catch (e) {
|
||
return maybeElement instanceof window.HTMLElement;
|
||
}
|
||
}
|
||
function getHeadingObject(heading) {
|
||
if (!isHTMLElement(heading))
|
||
return heading;
|
||
if (options.ignoreHiddenElements && (!heading.offsetHeight || !heading.offsetParent)) {
|
||
return null;
|
||
}
|
||
const headingLabel = heading.getAttribute("data-heading-label") || (options.headingLabelCallback ? String(options.headingLabelCallback(heading.textContent)) : heading.textContent.trim());
|
||
var obj = {
|
||
id: heading.id,
|
||
children: [],
|
||
nodeName: heading.nodeName,
|
||
headingLevel: getHeadingLevel(heading),
|
||
textContent: headingLabel
|
||
};
|
||
if (options.includeHtml) {
|
||
obj.childNodes = heading.childNodes;
|
||
}
|
||
if (options.headingObjectCallback) {
|
||
return options.headingObjectCallback(obj, heading);
|
||
}
|
||
return obj;
|
||
}
|
||
function addNode(node, nest) {
|
||
var obj = getHeadingObject(node);
|
||
var level = obj.headingLevel;
|
||
var array2 = nest;
|
||
var lastItem = getLastItem(array2);
|
||
var lastItemLevel = lastItem ? lastItem.headingLevel : 0;
|
||
var counter = level - lastItemLevel;
|
||
while (counter > 0) {
|
||
lastItem = getLastItem(array2);
|
||
if (lastItem && level === lastItem.headingLevel) {
|
||
break;
|
||
} else if (lastItem && lastItem.children !== void 0) {
|
||
array2 = lastItem.children;
|
||
}
|
||
counter--;
|
||
}
|
||
if (level >= options.collapseDepth) {
|
||
obj.isCollapsed = true;
|
||
}
|
||
array2.push(obj);
|
||
return array2;
|
||
}
|
||
function selectHeadings(contentElement, headingSelector) {
|
||
var selectors = headingSelector;
|
||
if (options.ignoreSelector) {
|
||
selectors = headingSelector.split(",").map(function mapSelectors(selector) {
|
||
return selector.trim() + ":not(" + options.ignoreSelector + ")";
|
||
});
|
||
}
|
||
try {
|
||
return contentElement.querySelectorAll(selectors);
|
||
} catch (e) {
|
||
console.warn("Headers not found with selector: " + selectors);
|
||
return null;
|
||
}
|
||
}
|
||
function nestHeadingsArray(headingsArray) {
|
||
return reduce.call(headingsArray, function reducer(prev, curr) {
|
||
var currentHeading = getHeadingObject(curr);
|
||
if (currentHeading) {
|
||
addNode(currentHeading, prev.nest);
|
||
}
|
||
return prev;
|
||
}, {
|
||
nest: []
|
||
});
|
||
}
|
||
return {
|
||
nestHeadingsArray,
|
||
selectHeadings
|
||
};
|
||
};
|
||
}
|
||
});
|
||
|
||
// node_modules/tocbot/src/js/update-toc-scroll.js
|
||
var require_update_toc_scroll = __commonJS({
|
||
"node_modules/tocbot/src/js/update-toc-scroll.js"(exports, module) {
|
||
module.exports = function updateTocScroll(options) {
|
||
var toc = options.tocElement || document.querySelector(options.tocSelector);
|
||
if (toc && toc.scrollHeight > toc.clientHeight) {
|
||
var activeItem = toc.querySelector("." + options.activeListItemClass);
|
||
if (activeItem) {
|
||
toc.scrollTop = activeItem.offsetTop - options.tocScrollOffset;
|
||
}
|
||
}
|
||
};
|
||
}
|
||
});
|
||
|
||
// node_modules/tocbot/src/js/scroll-smooth/index.js
|
||
var require_scroll_smooth = __commonJS({
|
||
"node_modules/tocbot/src/js/scroll-smooth/index.js"(exports) {
|
||
exports.initSmoothScrolling = initSmoothScrolling;
|
||
function initSmoothScrolling(options) {
|
||
var duration = options.duration;
|
||
var offset = options.offset;
|
||
var pageUrl = location.hash ? stripHash(location.href) : location.href;
|
||
delegatedLinkHijacking();
|
||
function delegatedLinkHijacking() {
|
||
document.body.addEventListener("click", onClick, false);
|
||
function onClick(e) {
|
||
if (!isInPageLink(e.target) || e.target.className.indexOf("no-smooth-scroll") > -1 || e.target.href.charAt(e.target.href.length - 2) === "#" && e.target.href.charAt(e.target.href.length - 1) === "!" || e.target.className.indexOf(options.linkClass) === -1) {
|
||
return;
|
||
}
|
||
jump(e.target.hash, {
|
||
duration,
|
||
offset,
|
||
callback: function() {
|
||
setFocus(e.target.hash);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
function isInPageLink(n) {
|
||
return n.tagName.toLowerCase() === "a" && (n.hash.length > 0 || n.href.charAt(n.href.length - 1) === "#") && (stripHash(n.href) === pageUrl || stripHash(n.href) + "#" === pageUrl);
|
||
}
|
||
function stripHash(url) {
|
||
return url.slice(0, url.lastIndexOf("#"));
|
||
}
|
||
function setFocus(hash) {
|
||
var element = document.getElementById(hash.substring(1));
|
||
if (element) {
|
||
if (!/^(?:a|select|input|button|textarea)$/i.test(element.tagName)) {
|
||
element.tabIndex = -1;
|
||
}
|
||
element.focus();
|
||
}
|
||
}
|
||
}
|
||
function jump(target, options) {
|
||
var start = window.pageYOffset;
|
||
var opt = {
|
||
duration: options.duration,
|
||
offset: options.offset || 0,
|
||
callback: options.callback,
|
||
easing: options.easing || easeInOutQuad
|
||
};
|
||
var tgt = document.querySelector('[id="' + decodeURI(target).split("#").join("") + '"]') || document.querySelector('[id="' + target.split("#").join("") + '"]');
|
||
var distance = typeof target === "string" ? opt.offset + (target ? tgt && tgt.getBoundingClientRect().top || 0 : -(document.documentElement.scrollTop || document.body.scrollTop)) : target;
|
||
var duration = typeof opt.duration === "function" ? opt.duration(distance) : opt.duration;
|
||
var timeStart;
|
||
var timeElapsed;
|
||
requestAnimationFrame(function(time) {
|
||
timeStart = time;
|
||
loop(time);
|
||
});
|
||
function loop(time) {
|
||
timeElapsed = time - timeStart;
|
||
window.scrollTo(0, opt.easing(timeElapsed, start, distance, duration));
|
||
if (timeElapsed < duration) {
|
||
requestAnimationFrame(loop);
|
||
} else {
|
||
end();
|
||
}
|
||
}
|
||
function end() {
|
||
window.scrollTo(0, start + distance);
|
||
if (typeof opt.callback === "function") {
|
||
opt.callback();
|
||
}
|
||
}
|
||
function easeInOutQuad(t, b, c, d) {
|
||
t /= d / 2;
|
||
if (t < 1)
|
||
return c / 2 * t * t + b;
|
||
t--;
|
||
return -c / 2 * (t * (t - 2) - 1) + b;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
|
||
// node_modules/tocbot/src/js/index.js
|
||
var require_js = __commonJS({
|
||
"node_modules/tocbot/src/js/index.js"(exports, module) {
|
||
(function(root, factory) {
|
||
if (typeof define === "function" && define.amd) {
|
||
define([], factory(root));
|
||
} else if (typeof exports === "object") {
|
||
module.exports = factory(root);
|
||
} else {
|
||
root.tocbot = factory(root);
|
||
}
|
||
})(typeof global !== "undefined" ? global : window || global, function(root) {
|
||
"use strict";
|
||
var defaultOptions = require_default_options();
|
||
var options = {};
|
||
var tocbot2 = {};
|
||
var BuildHtml = require_build_html();
|
||
var ParseContent = require_parse_content();
|
||
var updateTocScroll = require_update_toc_scroll();
|
||
var buildHtml;
|
||
var parseContent;
|
||
var supports = !!root && !!root.document && !!root.document.querySelector && !!root.addEventListener;
|
||
if (typeof window === "undefined" && !supports) {
|
||
return;
|
||
}
|
||
var headingsArray;
|
||
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
||
function extend() {
|
||
var target = {};
|
||
for (var i = 0; i < arguments.length; i++) {
|
||
var source = arguments[i];
|
||
for (var key in source) {
|
||
if (hasOwnProperty.call(source, key)) {
|
||
target[key] = source[key];
|
||
}
|
||
}
|
||
}
|
||
return target;
|
||
}
|
||
function throttle(fn, threshold, scope) {
|
||
threshold || (threshold = 250);
|
||
var last;
|
||
var deferTimer;
|
||
return function() {
|
||
var context = scope || this;
|
||
var now = +/* @__PURE__ */ new Date();
|
||
var args = arguments;
|
||
if (last && now < last + threshold) {
|
||
clearTimeout(deferTimer);
|
||
deferTimer = setTimeout(function() {
|
||
last = now;
|
||
fn.apply(context, args);
|
||
}, threshold);
|
||
} else {
|
||
last = now;
|
||
fn.apply(context, args);
|
||
}
|
||
};
|
||
}
|
||
function getContentElement(options2) {
|
||
try {
|
||
return options2.contentElement || document.querySelector(options2.contentSelector);
|
||
} catch (e) {
|
||
console.warn("Contents element not found: " + options2.contentSelector);
|
||
return null;
|
||
}
|
||
}
|
||
function getTocElement(options2) {
|
||
try {
|
||
return options2.tocElement || document.querySelector(options2.tocSelector);
|
||
} catch (e) {
|
||
console.warn("TOC element not found: " + options2.tocSelector);
|
||
return null;
|
||
}
|
||
}
|
||
tocbot2.destroy = function() {
|
||
var tocElement = getTocElement(options);
|
||
if (tocElement === null) {
|
||
return;
|
||
}
|
||
if (!options.skipRendering) {
|
||
if (tocElement) {
|
||
tocElement.innerHTML = "";
|
||
}
|
||
}
|
||
if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
|
||
document.querySelector(options.scrollContainer).removeEventListener("scroll", this._scrollListener, false);
|
||
document.querySelector(options.scrollContainer).removeEventListener("resize", this._scrollListener, false);
|
||
if (buildHtml) {
|
||
document.querySelector(options.scrollContainer).removeEventListener("click", this._clickListener, false);
|
||
}
|
||
} else {
|
||
document.removeEventListener("scroll", this._scrollListener, false);
|
||
document.removeEventListener("resize", this._scrollListener, false);
|
||
if (buildHtml) {
|
||
document.removeEventListener("click", this._clickListener, false);
|
||
}
|
||
}
|
||
};
|
||
tocbot2.init = function(customOptions) {
|
||
if (!supports) {
|
||
return;
|
||
}
|
||
options = extend(defaultOptions, customOptions || {});
|
||
this.options = options;
|
||
this.state = {};
|
||
if (options.scrollSmooth) {
|
||
options.duration = options.scrollSmoothDuration;
|
||
options.offset = options.scrollSmoothOffset;
|
||
tocbot2.scrollSmooth = require_scroll_smooth().initSmoothScrolling(options);
|
||
}
|
||
buildHtml = BuildHtml(options);
|
||
parseContent = ParseContent(options);
|
||
this._buildHtml = buildHtml;
|
||
this._parseContent = parseContent;
|
||
this._headingsArray = headingsArray;
|
||
tocbot2.destroy();
|
||
var contentElement = getContentElement(options);
|
||
if (contentElement === null) {
|
||
return;
|
||
}
|
||
var tocElement = getTocElement(options);
|
||
if (tocElement === null) {
|
||
return;
|
||
}
|
||
headingsArray = parseContent.selectHeadings(contentElement, options.headingSelector);
|
||
if (headingsArray === null) {
|
||
return;
|
||
}
|
||
var nestedHeadingsObj = parseContent.nestHeadingsArray(headingsArray);
|
||
var nestedHeadings = nestedHeadingsObj.nest;
|
||
if (!options.skipRendering) {
|
||
buildHtml.render(tocElement, nestedHeadings);
|
||
}
|
||
this._scrollListener = throttle(function(e) {
|
||
buildHtml.updateToc(headingsArray);
|
||
!options.disableTocScrollSync && updateTocScroll(options);
|
||
var isTop = e && e.target && e.target.scrollingElement && e.target.scrollingElement.scrollTop === 0;
|
||
if (e && (e.eventPhase === 0 || e.currentTarget === null) || isTop) {
|
||
buildHtml.updateToc(headingsArray);
|
||
if (options.scrollEndCallback) {
|
||
options.scrollEndCallback(e);
|
||
}
|
||
}
|
||
}, options.throttleTimeout);
|
||
this._scrollListener();
|
||
if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
|
||
document.querySelector(options.scrollContainer).addEventListener("scroll", this._scrollListener, false);
|
||
document.querySelector(options.scrollContainer).addEventListener("resize", this._scrollListener, false);
|
||
} else {
|
||
document.addEventListener("scroll", this._scrollListener, false);
|
||
document.addEventListener("resize", this._scrollListener, false);
|
||
}
|
||
var timeout = null;
|
||
this._clickListener = throttle(function(event) {
|
||
if (options.scrollSmooth) {
|
||
buildHtml.disableTocAnimation(event);
|
||
}
|
||
buildHtml.updateToc(headingsArray);
|
||
timeout && clearTimeout(timeout);
|
||
timeout = setTimeout(function() {
|
||
buildHtml.enableTocAnimation();
|
||
}, options.scrollSmoothDuration);
|
||
}, options.throttleTimeout);
|
||
if (options.scrollContainer && document.querySelector(options.scrollContainer)) {
|
||
document.querySelector(options.scrollContainer).addEventListener("click", this._clickListener, false);
|
||
} else {
|
||
document.addEventListener("click", this._clickListener, false);
|
||
}
|
||
return this;
|
||
};
|
||
tocbot2.refresh = function(customOptions) {
|
||
tocbot2.destroy();
|
||
tocbot2.init(customOptions || this.options);
|
||
};
|
||
root.tocbot = tocbot2;
|
||
return tocbot2;
|
||
});
|
||
}
|
||
});
|
||
|
||
// node_modules/@storybook/blocks/dist/index.mjs
|
||
var import_react = __toESM(require_react(), 1);
|
||
var import_global = __toESM(require_global(), 1);
|
||
var import_pickBy = __toESM(require_pickBy(), 1);
|
||
var import_client_logger = __toESM(require_client_logger(), 1);
|
||
var import_memoizerific = __toESM(require_memoizerific(), 1);
|
||
var import_uniq = __toESM(require_uniq(), 1);
|
||
var import_cloneDeep = __toESM(require_cloneDeep(), 1);
|
||
var import_preview_api = __toESM(require_preview_api(), 1);
|
||
var import_mapValues = __toESM(require_mapValues(), 1);
|
||
var import_core_events = __toESM(require_core_events(), 1);
|
||
var tocbot = __toESM(require_js(), 1);
|
||
var import_channels = __toESM(require_channels(), 1);
|
||
var Wrapper = newStyled.div(withReset, ({ theme }) => ({ backgroundColor: theme.base === "light" ? "rgba(0,0,0,.01)" : "rgba(255,255,255,.01)", borderRadius: theme.appBorderRadius, border: `1px dashed ${theme.appBorderColor}`, display: "flex", alignItems: "center", justifyContent: "center", padding: 20, margin: "25px 0 40px", color: curriedTransparentize$1(0.3, theme.color.defaultText), fontSize: theme.typography.size.s2 }));
|
||
var EmptyBlock = (props) => import_react.default.createElement(Wrapper, { ...props, className: "docblock-emptyblock sb-unstyled" });
|
||
var StyledSyntaxHighlighter = newStyled(SyntaxHighlighter2)(({ theme }) => ({ fontSize: `${theme.typography.size.s2 - 1}px`, lineHeight: "19px", margin: "25px 0 40px", borderRadius: theme.appBorderRadius, boxShadow: theme.base === "light" ? "rgba(0, 0, 0, 0.10) 0 1px 3px 0" : "rgba(0, 0, 0, 0.20) 0 2px 5px 0", "pre.prismjs": { padding: 20, background: "inherit" } }));
|
||
var SourceSkeletonWrapper = newStyled.div(({ theme }) => ({ background: theme.background.content, borderRadius: theme.appBorderRadius, border: `1px solid ${theme.appBorderColor}`, boxShadow: theme.base === "light" ? "rgba(0, 0, 0, 0.10) 0 1px 3px 0" : "rgba(0, 0, 0, 0.20) 0 2px 5px 0", margin: "25px 0 40px", padding: "20px 20px 20px 22px" }));
|
||
var SourceSkeletonPlaceholder = newStyled.div(({ theme }) => ({ animation: `${theme.animation.glow} 1.5s ease-in-out infinite`, background: theme.appBorderColor, height: 17, marginTop: 1, width: "60%", [`&:first-child${ignoreSsrWarning}`]: { margin: 0 } }));
|
||
var SourceSkeleton = () => import_react.default.createElement(SourceSkeletonWrapper, null, import_react.default.createElement(SourceSkeletonPlaceholder, null), import_react.default.createElement(SourceSkeletonPlaceholder, { style: { width: "80%" } }), import_react.default.createElement(SourceSkeletonPlaceholder, { style: { width: "30%" } }), import_react.default.createElement(SourceSkeletonPlaceholder, { style: { width: "80%" } }));
|
||
var Source = ({ isLoading, error, language, code, dark, format: format2, ...rest }) => {
|
||
if (isLoading)
|
||
return import_react.default.createElement(SourceSkeleton, null);
|
||
if (error)
|
||
return import_react.default.createElement(EmptyBlock, null, error);
|
||
let syntaxHighlighter = import_react.default.createElement(StyledSyntaxHighlighter, { bordered: true, copyable: true, format: format2, language, className: "docblock-source sb-unstyled", ...rest }, code);
|
||
if (typeof dark > "u")
|
||
return syntaxHighlighter;
|
||
let overrideTheme = dark ? themes.dark : themes.light;
|
||
return import_react.default.createElement(ThemeProvider, { theme: convert(overrideTheme) }, syntaxHighlighter);
|
||
};
|
||
Source.defaultProps = { format: false };
|
||
var toGlobalSelector = (element) => `& :where(${element}:not(.sb-anchor, .sb-unstyled, .sb-unstyled ${element}))`;
|
||
var breakpoint = 600;
|
||
var Title = newStyled.h1(withReset, ({ theme }) => ({ color: theme.color.defaultText, fontSize: theme.typography.size.m3, fontWeight: theme.typography.weight.bold, lineHeight: "32px", [`@media (min-width: ${breakpoint}px)`]: { fontSize: theme.typography.size.l1, lineHeight: "36px", marginBottom: "16px" } }));
|
||
var Subtitle = newStyled.h2(withReset, ({ theme }) => ({ fontWeight: theme.typography.weight.regular, fontSize: theme.typography.size.s3, lineHeight: "20px", borderBottom: "none", marginBottom: 15, [`@media (min-width: ${breakpoint}px)`]: { fontSize: theme.typography.size.m1, lineHeight: "28px", marginBottom: 24 }, color: curriedTransparentize$1(0.25, theme.color.defaultText) }));
|
||
var DocsContent = newStyled.div(({ theme }) => {
|
||
let reset = { fontFamily: theme.typography.fonts.base, fontSize: theme.typography.size.s3, margin: 0, WebkitFontSmoothing: "antialiased", MozOsxFontSmoothing: "grayscale", WebkitTapHighlightColor: "rgba(0, 0, 0, 0)", WebkitOverflowScrolling: "touch" }, headers = { margin: "20px 0 8px", padding: 0, cursor: "text", position: "relative", color: theme.color.defaultText, "&:first-of-type": { marginTop: 0, paddingTop: 0 }, "&:hover a.anchor": { textDecoration: "none" }, "& code": { fontSize: "inherit" } }, code = { lineHeight: 1, margin: "0 2px", padding: "3px 5px", whiteSpace: "nowrap", borderRadius: 3, fontSize: theme.typography.size.s2 - 1, border: theme.base === "light" ? `1px solid ${theme.color.mediumlight}` : `1px solid ${theme.color.darker}`, color: theme.base === "light" ? curriedTransparentize$1(0.1, theme.color.defaultText) : curriedTransparentize$1(0.3, theme.color.defaultText), backgroundColor: theme.base === "light" ? theme.color.lighter : theme.color.border };
|
||
return { maxWidth: 1e3, width: "100%", [toGlobalSelector("a")]: { ...reset, fontSize: "inherit", lineHeight: "24px", color: theme.color.secondary, textDecoration: "none", "&.absent": { color: "#cc0000" }, "&.anchor": { display: "block", paddingLeft: 30, marginLeft: -30, cursor: "pointer", position: "absolute", top: 0, left: 0, bottom: 0 } }, [toGlobalSelector("blockquote")]: { ...reset, margin: "16px 0", borderLeft: `4px solid ${theme.color.medium}`, padding: "0 15px", color: theme.color.dark, "& > :first-of-type": { marginTop: 0 }, "& > :last-child": { marginBottom: 0 } }, [toGlobalSelector("div")]: reset, [toGlobalSelector("dl")]: { ...reset, margin: "16px 0", padding: 0, "& dt": { fontSize: "14px", fontWeight: "bold", fontStyle: "italic", padding: 0, margin: "16px 0 4px" }, "& dt:first-of-type": { padding: 0 }, "& dt > :first-of-type": { marginTop: 0 }, "& dt > :last-child": { marginBottom: 0 }, "& dd": { margin: "0 0 16px", padding: "0 15px" }, "& dd > :first-of-type": { marginTop: 0 }, "& dd > :last-child": { marginBottom: 0 } }, [toGlobalSelector("h1")]: { ...reset, ...headers, fontSize: `${theme.typography.size.l1}px`, fontWeight: theme.typography.weight.bold }, [toGlobalSelector("h2")]: { ...reset, ...headers, fontSize: `${theme.typography.size.m2}px`, paddingBottom: 4, borderBottom: `1px solid ${theme.appBorderColor}` }, [toGlobalSelector("h3")]: { ...reset, ...headers, fontSize: `${theme.typography.size.m1}px`, fontWeight: theme.typography.weight.bold }, [toGlobalSelector("h4")]: { ...reset, ...headers, fontSize: `${theme.typography.size.s3}px` }, [toGlobalSelector("h5")]: { ...reset, ...headers, fontSize: `${theme.typography.size.s2}px` }, [toGlobalSelector("h6")]: { ...reset, ...headers, fontSize: `${theme.typography.size.s2}px`, color: theme.color.dark }, [toGlobalSelector("hr")]: { border: "0 none", borderTop: `1px solid ${theme.appBorderColor}`, height: 4, padding: 0 }, [toGlobalSelector("img")]: { maxWidth: "100%" }, [toGlobalSelector("li")]: { ...reset, fontSize: theme.typography.size.s2, color: theme.color.defaultText, lineHeight: "24px", "& + li": { marginTop: ".25em" }, "& ul, & ol": { marginTop: ".25em", marginBottom: 0 }, "& code": code }, [toGlobalSelector("ol")]: { ...reset, margin: "16px 0", paddingLeft: 30, "& :first-of-type": { marginTop: 0 }, "& :last-child": { marginBottom: 0 } }, [toGlobalSelector("p")]: { ...reset, margin: "16px 0", fontSize: theme.typography.size.s2, lineHeight: "24px", color: theme.color.defaultText, "& code": code }, [toGlobalSelector("pre")]: { ...reset, fontFamily: theme.typography.fonts.mono, WebkitFontSmoothing: "antialiased", MozOsxFontSmoothing: "grayscale", lineHeight: "18px", padding: "11px 1rem", whiteSpace: "pre-wrap", color: "inherit", borderRadius: 3, margin: "1rem 0", "&:not(.prismjs)": { background: "transparent", border: "none", borderRadius: 0, padding: 0, margin: 0 }, "& pre, &.prismjs": { padding: 15, margin: 0, whiteSpace: "pre-wrap", color: "inherit", fontSize: "13px", lineHeight: "19px", code: { color: "inherit", fontSize: "inherit" } }, "& code": { whiteSpace: "pre" }, "& code, & tt": { border: "none" } }, [toGlobalSelector("span")]: { ...reset, "&.frame": { display: "block", overflow: "hidden", "& > span": { border: `1px solid ${theme.color.medium}`, display: "block", float: "left", overflow: "hidden", margin: "13px 0 0", padding: 7, width: "auto" }, "& span img": { display: "block", float: "left" }, "& span span": { clear: "both", color: theme.color.darkest, display: "block", padding: "5px 0 0" } }, "&.align-center": { display: "block", overflow: "hidden", clear: "both", "& > span": { display: "block", overflow: "hidden", margin: "13px auto 0", textAlign: "center" }, "& span img": { margin: "0 auto", textAlign: "center" } }, "&.align-right": { display: "block", overflow: "hidden", clear: "both", "& > span": { display: "block", overflow: "hidden", margin: "13px 0 0", textAlign: "right" }, "& span img": { margin: 0, textAlign: "right" } }, "&.float-left": { display: "block", marginRight: 13, overflow: "hidden", float: "left", "& span": { margin: "13px 0 0" } }, "&.float-right": { display: "block", marginLeft: 13, overflow: "hidden", float: "right", "& > span": { display: "block", overflow: "hidden", margin: "13px auto 0", textAlign: "right" } } }, [toGlobalSelector("table")]: { ...reset, margin: "16px 0", fontSize: theme.typography.size.s2, lineHeight: "24px", padding: 0, borderCollapse: "collapse", "& tr": { borderTop: `1px solid ${theme.appBorderColor}`, backgroundColor: theme.appContentBg, margin: 0, padding: 0 }, "& tr:nth-of-type(2n)": { backgroundColor: theme.base === "dark" ? theme.color.darker : theme.color.lighter }, "& tr th": { fontWeight: "bold", color: theme.color.defaultText, border: `1px solid ${theme.appBorderColor}`, margin: 0, padding: "6px 13px" }, "& tr td": { border: `1px solid ${theme.appBorderColor}`, color: theme.color.defaultText, margin: 0, padding: "6px 13px" }, "& tr th :first-of-type, & tr td :first-of-type": { marginTop: 0 }, "& tr th :last-child, & tr td :last-child": { marginBottom: 0 } }, [toGlobalSelector("ul")]: { ...reset, margin: "16px 0", paddingLeft: 30, "& :first-of-type": { marginTop: 0 }, "& :last-child": { marginBottom: 0 }, listStyle: "disc" } };
|
||
});
|
||
var DocsWrapper = newStyled.div(({ theme }) => ({ background: theme.background.content, display: "flex", justifyContent: "center", padding: "4rem 20px", minHeight: "100vh", boxSizing: "border-box", gap: "3rem", [`@media (min-width: ${breakpoint}px)`]: {} }));
|
||
var DocsPageWrapper = ({ children, toc }) => import_react.default.createElement(DocsWrapper, { className: "sbdocs sbdocs-wrapper" }, import_react.default.createElement(DocsContent, { className: "sbdocs sbdocs-content" }, children), toc);
|
||
var getBlockBackgroundStyle = (theme) => ({ borderRadius: theme.appBorderRadius, background: theme.background.content, boxShadow: theme.base === "light" ? "rgba(0, 0, 0, 0.10) 0 1px 3px 0" : "rgba(0, 0, 0, 0.20) 0 2px 5px 0", border: `1px solid ${theme.appBorderColor}` });
|
||
var Zoom2 = ({ zoom, resetZoom }) => import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(IconButton, { key: "zoomin", onClick: (e) => {
|
||
e.preventDefault(), zoom(0.8);
|
||
}, title: "Zoom in" }, import_react.default.createElement(Icons, { icon: "zoom" })), import_react.default.createElement(IconButton, { key: "zoomout", onClick: (e) => {
|
||
e.preventDefault(), zoom(1.25);
|
||
}, title: "Zoom out" }, import_react.default.createElement(Icons, { icon: "zoomout" })), import_react.default.createElement(IconButton, { key: "zoomreset", onClick: (e) => {
|
||
e.preventDefault(), resetZoom();
|
||
}, title: "Reset zoom" }, import_react.default.createElement(Icons, { icon: "zoomreset" })));
|
||
var Bar = newStyled(FlexBar)({ position: "absolute", left: 0, right: 0, top: 0, transition: "transform .2s linear" });
|
||
var Toolbar = ({ isLoading, storyId, baseUrl, zoom, resetZoom, ...rest }) => import_react.default.createElement(Bar, { ...rest }, import_react.default.createElement(import_react.Fragment, { key: "left" }, isLoading ? [1, 2, 3].map((key) => import_react.default.createElement(IconButtonSkeleton, { key })) : import_react.default.createElement(Zoom2, { zoom, resetZoom })));
|
||
var ZoomContext = (0, import_react.createContext)({ scale: 1 });
|
||
var { window: globalWindow } = import_global.global;
|
||
var IFrame = class extends import_react.Component {
|
||
constructor() {
|
||
super(...arguments);
|
||
this.iframe = null;
|
||
}
|
||
componentDidMount() {
|
||
let { id } = this.props;
|
||
this.iframe = globalWindow.document.getElementById(id);
|
||
}
|
||
shouldComponentUpdate(nextProps) {
|
||
let { scale } = nextProps;
|
||
return scale !== this.props.scale && this.setIframeBodyStyle({ width: `${scale * 100}%`, height: `${scale * 100}%`, transform: `scale(${1 / scale})`, transformOrigin: "top left" }), false;
|
||
}
|
||
setIframeBodyStyle(style) {
|
||
return Object.assign(this.iframe.contentDocument.body.style, style);
|
||
}
|
||
render() {
|
||
let { id, title, src, allowFullScreen, scale, ...rest } = this.props;
|
||
return import_react.default.createElement("iframe", { id, title, src, ...allowFullScreen ? { allow: "fullscreen" } : {}, loading: "lazy", ...rest });
|
||
}
|
||
};
|
||
var { PREVIEW_URL } = import_global.global;
|
||
var BASE_URL = PREVIEW_URL || "iframe.html";
|
||
var storyBlockIdFromId = ({ story, primary }) => `story--${story.id}${primary ? "--primary" : ""}`;
|
||
var InlineStory = (props) => {
|
||
let storyRef = (0, import_react.useRef)(), [showLoader, setShowLoader] = (0, import_react.useState)(true), [error, setError] = (0, import_react.useState)(), { story, height, autoplay, forceInitialArgs, renderStoryToElement } = props;
|
||
return (0, import_react.useEffect)(() => {
|
||
if (!(story && storyRef.current))
|
||
return () => {
|
||
};
|
||
let element = storyRef.current, cleanup = renderStoryToElement(story, element, { showMain: () => {
|
||
}, showError: ({ title, description }) => setError(new Error(`${title} - ${description}`)), showException: (err) => setError(err) }, { autoplay, forceInitialArgs });
|
||
return setShowLoader(false), () => {
|
||
Promise.resolve().then(() => cleanup());
|
||
};
|
||
}, [autoplay, renderStoryToElement, story]), error ? import_react.default.createElement("pre", null, import_react.default.createElement(ErrorFormatter, { error })) : import_react.default.createElement(import_react.default.Fragment, null, height ? import_react.default.createElement("style", null, `#${storyBlockIdFromId(props)} { min-height: ${height}; transform: translateZ(0); overflow: auto }`) : null, showLoader && import_react.default.createElement(StorySkeleton, null), import_react.default.createElement("div", { ref: storyRef, id: `${storyBlockIdFromId(props)}-inner`, "data-name": story.name }));
|
||
};
|
||
var IFrameStory = ({ story, height = "500px" }) => import_react.default.createElement("div", { style: { width: "100%", height } }, import_react.default.createElement(ZoomContext.Consumer, null, ({ scale }) => import_react.default.createElement(IFrame, { key: "iframe", id: `iframe--${story.id}`, title: story.name, src: getStoryHref(BASE_URL, story.id, { viewMode: "story" }), allowFullScreen: true, scale, style: { width: "100%", height: "100%", border: "0 none" } })));
|
||
var Story = (props) => {
|
||
let { inline } = props;
|
||
return import_react.default.createElement("div", { id: storyBlockIdFromId(props), className: "sb-story sb-unstyled", "data-story-block": "true" }, inline ? import_react.default.createElement(InlineStory, { ...props }) : import_react.default.createElement(IFrameStory, { ...props }));
|
||
};
|
||
var StorySkeleton = () => import_react.default.createElement(Loader, null);
|
||
var ChildrenContainer = newStyled.div(({ isColumn, columns, layout }) => ({ display: isColumn || !columns ? "block" : "flex", position: "relative", flexWrap: "wrap", overflow: "auto", flexDirection: isColumn ? "column" : "row", "& .innerZoomElementWrapper > *": isColumn ? { width: layout !== "fullscreen" ? "calc(100% - 20px)" : "100%", display: "block" } : { maxWidth: layout !== "fullscreen" ? "calc(100% - 20px)" : "100%", display: "inline-block" } }), ({ layout = "padded" }) => layout === "centered" || layout === "padded" ? { padding: "30px 20px", margin: -10, "& .innerZoomElementWrapper > *": { width: "auto", border: "10px solid transparent!important" } } : {}, ({ layout = "padded" }) => layout === "centered" ? { display: "flex", justifyContent: "center", justifyItems: "center", alignContent: "center", alignItems: "center" } : {}, ({ columns }) => columns && columns > 1 ? { ".innerZoomElementWrapper > *": { minWidth: `calc(100% / ${columns} - 20px)` } } : {});
|
||
var StyledSource = newStyled(Source)(({ theme }) => ({ margin: 0, borderTopLeftRadius: 0, borderTopRightRadius: 0, borderBottomLeftRadius: theme.appBorderRadius, borderBottomRightRadius: theme.appBorderRadius, border: "none", background: theme.base === "light" ? "rgba(0, 0, 0, 0.85)" : curriedDarken$1(0.05, theme.background.content), color: theme.color.lightest, button: { background: theme.base === "light" ? "rgba(0, 0, 0, 0.85)" : curriedDarken$1(0.05, theme.background.content) } }));
|
||
var PreviewContainer = newStyled.div(({ theme, withSource, isExpanded }) => ({ position: "relative", overflow: "hidden", margin: "25px 0 40px", ...getBlockBackgroundStyle(theme), borderBottomLeftRadius: withSource && isExpanded && 0, borderBottomRightRadius: withSource && isExpanded && 0, borderBottomWidth: isExpanded && 0, "h3 + &": { marginTop: "16px" } }), ({ withToolbar }) => withToolbar && { paddingTop: 40 });
|
||
var getSource = (withSource, expanded, setExpanded) => {
|
||
switch (true) {
|
||
case !!(withSource && withSource.error):
|
||
return { source: null, actionItem: { title: "No code available", className: "docblock-code-toggle docblock-code-toggle--disabled", disabled: true, onClick: () => setExpanded(false) } };
|
||
case expanded:
|
||
return { source: import_react.default.createElement(StyledSource, { ...withSource, dark: true }), actionItem: { title: "Hide code", className: "docblock-code-toggle docblock-code-toggle--expanded", onClick: () => setExpanded(false) } };
|
||
default:
|
||
return { source: import_react.default.createElement(StyledSource, { ...withSource, dark: true }), actionItem: { title: "Show code", className: "docblock-code-toggle", onClick: () => setExpanded(true) } };
|
||
}
|
||
};
|
||
function getStoryId(children) {
|
||
if (import_react.Children.count(children) === 1) {
|
||
let elt = children;
|
||
if (elt.props)
|
||
return elt.props.id;
|
||
}
|
||
return null;
|
||
}
|
||
var PositionedToolbar = newStyled(Toolbar)({ position: "absolute", top: 0, left: 0, right: 0, height: 40 });
|
||
var Relative = newStyled.div({ overflow: "hidden", position: "relative" });
|
||
var Preview = ({ isLoading, isColumn, columns, children, withSource, withToolbar = false, isExpanded = false, additionalActions, className, layout = "padded", ...props }) => {
|
||
let [expanded, setExpanded] = (0, import_react.useState)(isExpanded), { source, actionItem } = getSource(withSource, expanded, setExpanded), [scale, setScale] = (0, import_react.useState)(1), previewClasses = [className].concat(["sbdocs", "sbdocs-preview", "sb-unstyled"]), defaultActionItems = withSource ? [actionItem] : [], [additionalActionItems, setAdditionalActionItems] = (0, import_react.useState)(additionalActions ? [...additionalActions] : []), actionItems = [...defaultActionItems, ...additionalActionItems], { window: globalWindow4 } = import_global.global, copyToClipboard = (0, import_react.useCallback)(async (text) => {
|
||
let { createCopyToClipboardFunction } = await import("./dist-4BXHRK5M.js");
|
||
createCopyToClipboardFunction();
|
||
}, []), onCopyCapture = (e) => {
|
||
let selection = globalWindow4.getSelection();
|
||
selection && selection.type === "Range" || (e.preventDefault(), additionalActionItems.filter((item) => item.title === "Copied").length === 0 && copyToClipboard(source.props.code).then(() => {
|
||
setAdditionalActionItems([...additionalActionItems, { title: "Copied", onClick: () => {
|
||
} }]), globalWindow4.setTimeout(() => setAdditionalActionItems(additionalActionItems.filter((item) => item.title !== "Copied")), 1500);
|
||
}));
|
||
};
|
||
return import_react.default.createElement(PreviewContainer, { withSource, withToolbar, ...props, className: previewClasses.join(" ") }, withToolbar && import_react.default.createElement(PositionedToolbar, { isLoading, border: true, zoom: (z) => setScale(scale * z), resetZoom: () => setScale(1), storyId: getStoryId(children), baseUrl: "./iframe.html" }), import_react.default.createElement(ZoomContext.Provider, { value: { scale } }, import_react.default.createElement(Relative, { className: "docs-story", onCopyCapture: withSource && onCopyCapture }, import_react.default.createElement(ChildrenContainer, { isColumn: isColumn || !Array.isArray(children), columns, layout }, import_react.default.createElement(Zoom.Element, { scale }, Array.isArray(children) ? children.map((child, i) => import_react.default.createElement("div", { key: i }, child)) : import_react.default.createElement("div", null, children))), import_react.default.createElement(ActionBar, { actionItems }))), withSource && expanded && source);
|
||
};
|
||
var StyledPreview = newStyled(Preview)(() => ({ ".docs-story": { paddingTop: 32, paddingBottom: 40 } }));
|
||
var PreviewSkeleton = () => import_react.default.createElement(StyledPreview, { isLoading: true, withToolbar: true }, import_react.default.createElement(StorySkeleton, null));
|
||
var Table = newStyled.table(({ theme }) => ({ "&&": { borderCollapse: "collapse", borderSpacing: 0, border: "none", tr: { border: "none !important", background: "none" }, "td, th": { padding: 0, border: "none", width: "auto!important" }, marginTop: 0, marginBottom: 0, "th:first-of-type, td:first-of-type": { paddingLeft: 0 }, "th:last-of-type, td:last-of-type": { paddingRight: 0 }, td: { paddingTop: 0, paddingBottom: 4, "&:not(:first-of-type)": { paddingLeft: 10, paddingRight: 0 } }, tbody: { boxShadow: "none", border: "none" }, code: codeCommon({ theme }), div: { span: { fontWeight: "bold" } }, "& code": { margin: 0, display: "inline-block", fontSize: theme.typography.size.s1 } } }));
|
||
var ArgJsDoc = ({ tags }) => {
|
||
let params = (tags.params || []).filter((x) => x.description), hasDisplayableParams = params.length !== 0, hasDisplayableDeprecated = tags.deprecated != null, hasDisplayableReturns = tags.returns != null && tags.returns.description != null;
|
||
return !hasDisplayableParams && !hasDisplayableReturns && !hasDisplayableDeprecated ? null : import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(Table, null, import_react.default.createElement("tbody", null, hasDisplayableDeprecated && import_react.default.createElement("tr", { key: "deprecated" }, import_react.default.createElement("td", { colSpan: 2 }, import_react.default.createElement("strong", null, "Deprecated"), ": ", tags.deprecated)), hasDisplayableParams && params.map((x) => import_react.default.createElement("tr", { key: x.name }, import_react.default.createElement("td", null, import_react.default.createElement("code", null, x.name)), import_react.default.createElement("td", null, x.description))), hasDisplayableReturns && import_react.default.createElement("tr", { key: "returns" }, import_react.default.createElement("td", null, import_react.default.createElement("code", null, "Returns")), import_react.default.createElement("td", null, tags.returns.description)))));
|
||
};
|
||
var ITEMS_BEFORE_EXPANSION = 8;
|
||
var Summary = newStyled.div(({ isExpanded }) => ({ display: "flex", flexDirection: isExpanded ? "column" : "row", flexWrap: "wrap", alignItems: "flex-start", marginBottom: "-4px", minWidth: 100 }));
|
||
var Text = newStyled.span(codeCommon, ({ theme, simple = false }) => ({ flex: "0 0 auto", fontFamily: theme.typography.fonts.mono, fontSize: theme.typography.size.s1, wordBreak: "break-word", whiteSpace: "normal", maxWidth: "100%", margin: 0, marginRight: "4px", marginBottom: "4px", paddingTop: "2px", paddingBottom: "2px", lineHeight: "13px", ...simple && { background: "transparent", border: "0 none", paddingLeft: 0 } }));
|
||
var ExpandButton = newStyled.button(({ theme }) => ({ fontFamily: theme.typography.fonts.mono, color: theme.color.secondary, marginBottom: "4px", background: "none", border: "none" }));
|
||
var Expandable = newStyled.div(codeCommon, ({ theme }) => ({ fontFamily: theme.typography.fonts.mono, color: theme.color.secondary, fontSize: theme.typography.size.s1, margin: 0, whiteSpace: "nowrap", display: "flex", alignItems: "center" }));
|
||
var Detail = newStyled.div(({ theme, width }) => ({ width, minWidth: 200, maxWidth: 800, padding: 15, fontFamily: theme.typography.fonts.mono, fontSize: theme.typography.size.s1, boxSizing: "content-box", "& code": { padding: "0 !important" } }));
|
||
var ArrowIcon = newStyled(Icons)({ height: 10, width: 10, minWidth: 10, marginLeft: 4 });
|
||
var EmptyArg = () => import_react.default.createElement("span", null, "-");
|
||
var ArgText = ({ text, simple }) => import_react.default.createElement(Text, { simple }, text);
|
||
var calculateDetailWidth = (0, import_memoizerific.default)(1e3)((detail) => {
|
||
let lines = detail.split(/\r?\n/);
|
||
return `${Math.max(...lines.map((x) => x.length))}ch`;
|
||
});
|
||
var getSummaryItems = (summary) => {
|
||
if (!summary)
|
||
return [summary];
|
||
let summaryItems = summary.split("|").map((value2) => value2.trim());
|
||
return (0, import_uniq.default)(summaryItems);
|
||
};
|
||
var renderSummaryItems = (summaryItems, isExpanded = true) => {
|
||
let items = summaryItems;
|
||
return isExpanded || (items = summaryItems.slice(0, ITEMS_BEFORE_EXPANSION)), items.map((item) => import_react.default.createElement(ArgText, { key: item, text: item === "" ? '""' : item }));
|
||
};
|
||
var ArgSummary = ({ value: value2, initialExpandedArgs }) => {
|
||
let { summary, detail } = value2, [isOpen, setIsOpen] = (0, import_react.useState)(false), [isExpanded, setIsExpanded] = (0, import_react.useState)(initialExpandedArgs || false);
|
||
if (summary == null)
|
||
return null;
|
||
let summaryAsString = typeof summary.toString == "function" ? summary.toString() : summary;
|
||
if (detail == null) {
|
||
if (/[(){}[\]<>]/.test(summaryAsString))
|
||
return import_react.default.createElement(ArgText, { text: summaryAsString });
|
||
let summaryItems = getSummaryItems(summaryAsString), itemsCount = summaryItems.length;
|
||
return itemsCount > ITEMS_BEFORE_EXPANSION ? import_react.default.createElement(Summary, { isExpanded }, renderSummaryItems(summaryItems, isExpanded), import_react.default.createElement(ExpandButton, { onClick: () => setIsExpanded(!isExpanded) }, isExpanded ? "Show less..." : `Show ${itemsCount - ITEMS_BEFORE_EXPANSION} more...`)) : import_react.default.createElement(Summary, null, renderSummaryItems(summaryItems));
|
||
}
|
||
return import_react.default.createElement(WithTooltipPure, { closeOnOutsideClick: true, placement: "bottom", visible: isOpen, onVisibleChange: (isVisible) => {
|
||
setIsOpen(isVisible);
|
||
}, tooltip: import_react.default.createElement(Detail, { width: calculateDetailWidth(detail) }, import_react.default.createElement(SyntaxHighlighter2, { language: "jsx", format: false }, detail)) }, import_react.default.createElement(Expandable, { className: "sbdocs-expandable" }, import_react.default.createElement("span", null, summaryAsString), import_react.default.createElement(ArrowIcon, { icon: isOpen ? "arrowup" : "arrowdown" })));
|
||
};
|
||
var ArgValue = ({ value: value2, initialExpandedArgs }) => value2 == null ? import_react.default.createElement(EmptyArg, null) : import_react.default.createElement(ArgSummary, { value: value2, initialExpandedArgs });
|
||
var Label = newStyled.label(({ theme }) => ({ lineHeight: "18px", alignItems: "center", marginBottom: 8, display: "inline-block", position: "relative", whiteSpace: "nowrap", background: theme.boolean.background, borderRadius: "3em", padding: 1, input: { appearance: "none", width: "100%", height: "100%", position: "absolute", left: 0, top: 0, margin: 0, padding: 0, border: "none", background: "transparent", cursor: "pointer", borderRadius: "3em", "&:focus": { outline: "none", boxShadow: `${theme.color.secondary} 0 0 0 1px inset !important` } }, span: { textAlign: "center", fontSize: theme.typography.size.s1, fontWeight: theme.typography.weight.bold, lineHeight: "1", cursor: "pointer", display: "inline-block", padding: "7px 15px", transition: "all 100ms ease-out", userSelect: "none", borderRadius: "3em", color: curriedTransparentize$1(0.5, theme.color.defaultText), background: "transparent", "&:hover": { boxShadow: `${curriedOpacify$1(0.3, theme.appBorderColor)} 0 0 0 1px inset` }, "&:active": { boxShadow: `${curriedOpacify$1(0.05, theme.appBorderColor)} 0 0 0 2px inset`, color: curriedOpacify$1(1, theme.appBorderColor) }, "&:first-of-type": { paddingRight: 8 }, "&:last-of-type": { paddingLeft: 8 } }, "input:checked ~ span:last-of-type, input:not(:checked) ~ span:first-of-type": { background: theme.boolean.selectedBackground, boxShadow: theme.base === "light" ? `${curriedOpacify$1(0.1, theme.appBorderColor)} 0 0 2px` : `${theme.appBorderColor} 0 0 0 1px`, color: theme.color.defaultText, padding: "7px 15px" } }));
|
||
var parse = (value2) => value2 === "true";
|
||
var BooleanControl = ({ name, value: value2, onChange, onBlur, onFocus }) => {
|
||
let onSetFalse = (0, import_react.useCallback)(() => onChange(false), [onChange]);
|
||
if (value2 === void 0)
|
||
return import_react.default.createElement(Form.Button, { id: getControlSetterButtonId(name), onClick: onSetFalse }, "Set boolean");
|
||
let controlId = getControlId(name), parsedValue = typeof value2 == "string" ? parse(value2) : value2;
|
||
return import_react.default.createElement(Label, { htmlFor: controlId, title: parsedValue ? "Change to false" : "Change to true" }, import_react.default.createElement("input", { id: controlId, type: "checkbox", onChange: (e) => onChange(e.target.checked), checked: parsedValue, name, onBlur, onFocus }), import_react.default.createElement("span", null, "False"), import_react.default.createElement("span", null, "True"));
|
||
};
|
||
var parseDate = (value2) => {
|
||
let [year, month, day] = value2.split("-"), result = /* @__PURE__ */ new Date();
|
||
return result.setFullYear(parseInt(year, 10), parseInt(month, 10) - 1, parseInt(day, 10)), result;
|
||
};
|
||
var parseTime = (value2) => {
|
||
let [hours, minutes] = value2.split(":"), result = /* @__PURE__ */ new Date();
|
||
return result.setHours(parseInt(hours, 10)), result.setMinutes(parseInt(minutes, 10)), result;
|
||
};
|
||
var formatDate = (value2) => {
|
||
let date = new Date(value2), year = `000${date.getFullYear()}`.slice(-4), month = `0${date.getMonth() + 1}`.slice(-2), day = `0${date.getDate()}`.slice(-2);
|
||
return `${year}-${month}-${day}`;
|
||
};
|
||
var formatTime = (value2) => {
|
||
let date = new Date(value2), hours = `0${date.getHours()}`.slice(-2), minutes = `0${date.getMinutes()}`.slice(-2);
|
||
return `${hours}:${minutes}`;
|
||
};
|
||
var FlexSpaced = newStyled.div(({ theme }) => ({ flex: 1, display: "flex", input: { marginLeft: 10, flex: 1, height: 32, "&::-webkit-calendar-picker-indicator": { opacity: 0.5, height: 12, filter: theme.base === "light" ? void 0 : "invert(1)" } }, "input:first-of-type": { marginLeft: 0, flexGrow: 4 }, "input:last-of-type": { flexGrow: 3 } }));
|
||
var DateControl = ({ name, value: value2, onChange, onFocus, onBlur }) => {
|
||
let [valid, setValid] = (0, import_react.useState)(true), dateRef = (0, import_react.useRef)(), timeRef = (0, import_react.useRef)();
|
||
(0, import_react.useEffect)(() => {
|
||
valid !== false && (dateRef && dateRef.current && (dateRef.current.value = formatDate(value2)), timeRef && timeRef.current && (timeRef.current.value = formatTime(value2)));
|
||
}, [value2]);
|
||
let onDateChange = (e) => {
|
||
let parsed = parseDate(e.target.value), result = new Date(value2);
|
||
result.setFullYear(parsed.getFullYear(), parsed.getMonth(), parsed.getDate());
|
||
let time = result.getTime();
|
||
time && onChange(time), setValid(!!time);
|
||
}, onTimeChange = (e) => {
|
||
let parsed = parseTime(e.target.value), result = new Date(value2);
|
||
result.setHours(parsed.getHours()), result.setMinutes(parsed.getMinutes());
|
||
let time = result.getTime();
|
||
time && onChange(time), setValid(!!time);
|
||
}, controlId = getControlId(name);
|
||
return import_react.default.createElement(FlexSpaced, null, import_react.default.createElement(Form.Input, { type: "date", max: "9999-12-31", ref: dateRef, id: `${controlId}-date`, name: `${controlId}-date`, onChange: onDateChange, onFocus, onBlur }), import_react.default.createElement(Form.Input, { type: "time", id: `${controlId}-time`, name: `${controlId}-time`, ref: timeRef, onChange: onTimeChange, onFocus, onBlur }), valid ? null : import_react.default.createElement("div", null, "invalid"));
|
||
};
|
||
var Wrapper2 = newStyled.label({ display: "flex" });
|
||
var parse2 = (value2) => {
|
||
let result = parseFloat(value2);
|
||
return Number.isNaN(result) ? void 0 : result;
|
||
};
|
||
var format = (value2) => value2 != null ? String(value2) : "";
|
||
var NumberControl = ({ name, value: value2, onChange, min, max, step, onBlur, onFocus }) => {
|
||
let [inputValue, setInputValue] = (0, import_react.useState)(typeof value2 == "number" ? value2 : ""), [forceVisible, setForceVisible] = (0, import_react.useState)(false), [parseError, setParseError] = (0, import_react.useState)(null), handleChange = (0, import_react.useCallback)((event) => {
|
||
setInputValue(event.target.value);
|
||
let result = parseFloat(event.target.value);
|
||
Number.isNaN(result) ? setParseError(new Error(`'${event.target.value}' is not a number`)) : (onChange(result), setParseError(null));
|
||
}, [onChange, setParseError]), onForceVisible = (0, import_react.useCallback)(() => {
|
||
setInputValue("0"), onChange(0), setForceVisible(true);
|
||
}, [setForceVisible]), htmlElRef = (0, import_react.useRef)(null);
|
||
return (0, import_react.useEffect)(() => {
|
||
forceVisible && htmlElRef.current && htmlElRef.current.select();
|
||
}, [forceVisible]), (0, import_react.useEffect)(() => {
|
||
inputValue !== (typeof value2 == "number" ? value2 : "") && setInputValue(value2);
|
||
}, [value2]), !forceVisible && value2 === void 0 ? import_react.default.createElement(Form.Button, { id: getControlSetterButtonId(name), onClick: onForceVisible }, "Set number") : import_react.default.createElement(Wrapper2, null, import_react.default.createElement(Form.Input, { ref: htmlElRef, id: getControlId(name), type: "number", onChange: handleChange, size: "flex", placeholder: "Edit number...", value: inputValue, valid: parseError ? "error" : null, autoFocus: forceVisible, name, min, max, step, onFocus, onBlur }));
|
||
};
|
||
var selectedKey = (value2, options) => {
|
||
let entry = options && Object.entries(options).find(([_key, val]) => val === value2);
|
||
return entry ? entry[0] : void 0;
|
||
};
|
||
var selectedKeys = (value2, options) => value2 && options ? Object.entries(options).filter((entry) => value2.includes(entry[1])).map((entry) => entry[0]) : [];
|
||
var selectedValues = (keys, options) => keys && options && keys.map((key) => options[key]);
|
||
var Wrapper3 = newStyled.div(({ isInline }) => isInline ? { display: "flex", flexWrap: "wrap", alignItems: "flex-start", label: { display: "inline-flex", marginRight: 15 } } : { label: { display: "flex" } });
|
||
var Text2 = newStyled.span({});
|
||
var Label2 = newStyled.label({ lineHeight: "20px", alignItems: "center", marginBottom: 8, "&:last-child": { marginBottom: 0 }, input: { margin: 0, marginRight: 6 } });
|
||
var CheckboxControl = ({ name, options, value: value2, onChange, isInline }) => {
|
||
if (!options)
|
||
return import_client_logger.logger.warn(`Checkbox with no options: ${name}`), import_react.default.createElement(import_react.default.Fragment, null, "-");
|
||
let initial = selectedKeys(value2, options), [selected, setSelected] = (0, import_react.useState)(initial), handleChange = (e) => {
|
||
let option = e.target.value, updated = [...selected];
|
||
updated.includes(option) ? updated.splice(updated.indexOf(option), 1) : updated.push(option), onChange(selectedValues(updated, options)), setSelected(updated);
|
||
};
|
||
(0, import_react.useEffect)(() => {
|
||
setSelected(selectedKeys(value2, options));
|
||
}, [value2]);
|
||
let controlId = getControlId(name);
|
||
return import_react.default.createElement(Wrapper3, { isInline }, Object.keys(options).map((key, index) => {
|
||
let id = `${controlId}-${index}`;
|
||
return import_react.default.createElement(Label2, { key: id, htmlFor: id }, import_react.default.createElement("input", { type: "checkbox", id, name: id, value: key, onChange: handleChange, checked: selected == null ? void 0 : selected.includes(key) }), import_react.default.createElement(Text2, null, key));
|
||
}));
|
||
};
|
||
var Wrapper4 = newStyled.div(({ isInline }) => isInline ? { display: "flex", flexWrap: "wrap", alignItems: "flex-start", label: { display: "inline-flex", marginRight: 15 } } : { label: { display: "flex" } });
|
||
var Text3 = newStyled.span({});
|
||
var Label3 = newStyled.label({ lineHeight: "20px", alignItems: "center", marginBottom: 8, "&:last-child": { marginBottom: 0 }, input: { margin: 0, marginRight: 6 } });
|
||
var RadioControl = ({ name, options, value: value2, onChange, isInline }) => {
|
||
if (!options)
|
||
return import_client_logger.logger.warn(`Radio with no options: ${name}`), import_react.default.createElement(import_react.default.Fragment, null, "-");
|
||
let selection = selectedKey(value2, options), controlId = getControlId(name);
|
||
return import_react.default.createElement(Wrapper4, { isInline }, Object.keys(options).map((key, index) => {
|
||
let id = `${controlId}-${index}`;
|
||
return import_react.default.createElement(Label3, { key: id, htmlFor: id }, import_react.default.createElement("input", { type: "radio", id, name: id, value: key, onChange: (e) => onChange(options[e.currentTarget.value]), checked: key === selection }), import_react.default.createElement(Text3, null, key));
|
||
}));
|
||
};
|
||
var styleResets = { appearance: "none", border: "0 none", boxSizing: "inherit", display: " block", margin: " 0", background: "transparent", padding: 0, fontSize: "inherit", position: "relative" };
|
||
var OptionsSelect = newStyled.select(({ theme }) => ({ ...styleResets, boxSizing: "border-box", position: "relative", padding: "6px 10px", width: "100%", color: theme.input.color || "inherit", background: theme.input.background, borderRadius: theme.input.borderRadius, boxShadow: `${theme.input.border} 0 0 0 1px inset`, fontSize: theme.typography.size.s2 - 1, lineHeight: "20px", "&:focus": { boxShadow: `${theme.color.secondary} 0 0 0 1px inset`, outline: "none" }, "&[disabled]": { cursor: "not-allowed", opacity: 0.5 }, "::placeholder": { color: theme.textMutedColor }, "&[multiple]": { overflow: "auto", padding: 0, option: { display: "block", padding: "6px 10px", marginLeft: 1, marginRight: 1 } } }));
|
||
var SelectWrapper = newStyled.span(({ theme }) => ({ display: "inline-block", lineHeight: "normal", overflow: "hidden", position: "relative", verticalAlign: "top", width: "100%", svg: { position: "absolute", zIndex: 1, pointerEvents: "none", height: "12px", marginTop: "-6px", right: "12px", top: "50%", fill: theme.textMutedColor, path: { fill: theme.textMutedColor } } }));
|
||
var NO_SELECTION = "Choose option...";
|
||
var SingleSelect = ({ name, value: value2, options, onChange }) => {
|
||
let handleChange = (e) => {
|
||
onChange(options[e.currentTarget.value]);
|
||
}, selection = selectedKey(value2, options) || NO_SELECTION, controlId = getControlId(name);
|
||
return import_react.default.createElement(SelectWrapper, null, import_react.default.createElement(Icons, { icon: "arrowdown" }), import_react.default.createElement(OptionsSelect, { id: controlId, value: selection, onChange: handleChange }, import_react.default.createElement("option", { key: "no-selection", disabled: true }, NO_SELECTION), Object.keys(options).map((key) => import_react.default.createElement("option", { key }, key))));
|
||
};
|
||
var MultiSelect = ({ name, value: value2, options, onChange }) => {
|
||
let handleChange = (e) => {
|
||
let selection2 = Array.from(e.currentTarget.options).filter((option) => option.selected).map((option) => option.value);
|
||
onChange(selectedValues(selection2, options));
|
||
}, selection = selectedKeys(value2, options), controlId = getControlId(name);
|
||
return import_react.default.createElement(SelectWrapper, null, import_react.default.createElement(OptionsSelect, { id: controlId, multiple: true, value: selection, onChange: handleChange }, Object.keys(options).map((key) => import_react.default.createElement("option", { key }, key))));
|
||
};
|
||
var SelectControl = (props) => {
|
||
let { name, options } = props;
|
||
return options ? props.isMulti ? import_react.default.createElement(MultiSelect, { ...props }) : import_react.default.createElement(SingleSelect, { ...props }) : (import_client_logger.logger.warn(`Select with no options: ${name}`), import_react.default.createElement(import_react.default.Fragment, null, "-"));
|
||
};
|
||
var normalizeOptions = (options, labels) => Array.isArray(options) ? options.reduce((acc, item) => (acc[(labels == null ? void 0 : labels[item]) || String(item)] = item, acc), {}) : options;
|
||
var Controls = { check: CheckboxControl, "inline-check": CheckboxControl, radio: RadioControl, "inline-radio": RadioControl, select: SelectControl, "multi-select": SelectControl };
|
||
var OptionsControl = (props) => {
|
||
let { type = "select", labels, argType } = props, normalized = { ...props, options: argType ? normalizeOptions(argType.options, labels) : {}, isInline: type.includes("inline"), isMulti: type.includes("multi") }, Control = Controls[type];
|
||
if (Control)
|
||
return import_react.default.createElement(Control, { ...normalized });
|
||
throw new Error(`Unknown options type: ${type}`);
|
||
};
|
||
var VALUE = "value";
|
||
var KEY = "key";
|
||
var ERROR = "Error";
|
||
var OBJECT = "Object";
|
||
var ARRAY = "Array";
|
||
var STRING = "String";
|
||
var NUMBER = "Number";
|
||
var BOOLEAN = "Boolean";
|
||
var DATE = "Date";
|
||
var NULL = "Null";
|
||
var UNDEFINED = "Undefined";
|
||
var FUNCTION = "Function";
|
||
var SYMBOL = "Symbol";
|
||
var ADD_DELTA_TYPE = "ADD_DELTA_TYPE";
|
||
var REMOVE_DELTA_TYPE = "REMOVE_DELTA_TYPE";
|
||
var UPDATE_DELTA_TYPE = "UPDATE_DELTA_TYPE";
|
||
function getObjectType(obj) {
|
||
return obj !== null && typeof obj == "object" && !Array.isArray(obj) && typeof obj[Symbol.iterator] == "function" ? "Iterable" : Object.prototype.toString.call(obj).slice(8, -1);
|
||
}
|
||
function isComponentWillChange(oldValue, newValue) {
|
||
let oldType = getObjectType(oldValue), newType = getObjectType(newValue);
|
||
return (oldType === "Function" || newType === "Function") && newType !== oldType;
|
||
}
|
||
var JsonAddValue = class extends import_react.Component {
|
||
constructor(props) {
|
||
super(props), this.state = { inputRefKey: null, inputRefValue: null }, this.refInputValue = this.refInputValue.bind(this), this.refInputKey = this.refInputKey.bind(this), this.onKeydown = this.onKeydown.bind(this), this.onSubmit = this.onSubmit.bind(this);
|
||
}
|
||
componentDidMount() {
|
||
let { inputRefKey, inputRefValue } = this.state, { onlyValue } = this.props;
|
||
inputRefKey && typeof inputRefKey.focus == "function" && inputRefKey.focus(), onlyValue && inputRefValue && typeof inputRefValue.focus == "function" && inputRefValue.focus(), document.addEventListener("keydown", this.onKeydown);
|
||
}
|
||
componentWillUnmount() {
|
||
document.removeEventListener("keydown", this.onKeydown);
|
||
}
|
||
onKeydown(event) {
|
||
event.altKey || event.ctrlKey || event.metaKey || event.shiftKey || event.repeat || ((event.code === "Enter" || event.key === "Enter") && (event.preventDefault(), this.onSubmit()), (event.code === "Escape" || event.key === "Escape") && (event.preventDefault(), this.props.handleCancel()));
|
||
}
|
||
onSubmit() {
|
||
let { handleAdd, onlyValue, onSubmitValueParser, keyPath, deep } = this.props, { inputRefKey, inputRefValue } = this.state, result = {};
|
||
if (!onlyValue) {
|
||
if (!inputRefKey.value)
|
||
return;
|
||
result.key = inputRefKey.value;
|
||
}
|
||
result.newValue = onSubmitValueParser(false, keyPath, deep, result.key, inputRefValue.value), handleAdd(result);
|
||
}
|
||
refInputKey(node) {
|
||
this.state.inputRefKey = node;
|
||
}
|
||
refInputValue(node) {
|
||
this.state.inputRefValue = node;
|
||
}
|
||
render() {
|
||
let { handleCancel, onlyValue, addButtonElement, cancelButtonElement, inputElementGenerator, keyPath, deep } = this.props, addButtonElementLayout = (0, import_react.cloneElement)(addButtonElement, { onClick: this.onSubmit }), cancelButtonElementLayout = (0, import_react.cloneElement)(cancelButtonElement, { onClick: handleCancel }), inputElementValue = inputElementGenerator(VALUE, keyPath, deep), inputElementValueLayout = (0, import_react.cloneElement)(inputElementValue, { placeholder: "Value", ref: this.refInputValue }), inputElementKeyLayout = null;
|
||
if (!onlyValue) {
|
||
let inputElementKey = inputElementGenerator(KEY, keyPath, deep);
|
||
inputElementKeyLayout = (0, import_react.cloneElement)(inputElementKey, { placeholder: "Key", ref: this.refInputKey });
|
||
}
|
||
return import_react.default.createElement("span", { className: "rejt-add-value-node" }, inputElementKeyLayout, inputElementValueLayout, cancelButtonElementLayout, addButtonElementLayout);
|
||
}
|
||
};
|
||
JsonAddValue.defaultProps = { onlyValue: false, addButtonElement: import_react.default.createElement("button", null, "+"), cancelButtonElement: import_react.default.createElement("button", null, "c") };
|
||
var JsonArray = class extends import_react.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
let keyPath = [...props.keyPath, props.name];
|
||
this.state = { data: props.data, name: props.name, keyPath, deep: props.deep, nextDeep: props.deep + 1, collapsed: props.isCollapsed(keyPath, props.deep, props.data), addFormVisible: false }, this.handleCollapseMode = this.handleCollapseMode.bind(this), this.handleRemoveItem = this.handleRemoveItem.bind(this), this.handleAddMode = this.handleAddMode.bind(this), this.handleAddValueAdd = this.handleAddValueAdd.bind(this), this.handleAddValueCancel = this.handleAddValueCancel.bind(this), this.handleEditValue = this.handleEditValue.bind(this), this.onChildUpdate = this.onChildUpdate.bind(this), this.renderCollapsed = this.renderCollapsed.bind(this), this.renderNotCollapsed = this.renderNotCollapsed.bind(this);
|
||
}
|
||
static getDerivedStateFromProps(props, state) {
|
||
return props.data !== state.data ? { data: props.data } : null;
|
||
}
|
||
onChildUpdate(childKey, childData) {
|
||
let { data, keyPath } = this.state;
|
||
data[childKey] = childData, this.setState({ data });
|
||
let { onUpdate } = this.props, size = keyPath.length;
|
||
onUpdate(keyPath[size - 1], data);
|
||
}
|
||
handleAddMode() {
|
||
this.setState({ addFormVisible: true });
|
||
}
|
||
handleCollapseMode() {
|
||
this.setState((state) => ({ collapsed: !state.collapsed }));
|
||
}
|
||
handleRemoveItem(index) {
|
||
return () => {
|
||
let { beforeRemoveAction, logger: logger4 } = this.props, { data, keyPath, nextDeep: deep } = this.state, oldValue = data[index];
|
||
beforeRemoveAction(index, keyPath, deep, oldValue).then(() => {
|
||
let deltaUpdateResult = { keyPath, deep, key: index, oldValue, type: REMOVE_DELTA_TYPE };
|
||
data.splice(index, 1), this.setState({ data });
|
||
let { onUpdate, onDeltaUpdate } = this.props;
|
||
onUpdate(keyPath[keyPath.length - 1], data), onDeltaUpdate(deltaUpdateResult);
|
||
}).catch(logger4.error);
|
||
};
|
||
}
|
||
handleAddValueAdd({ newValue }) {
|
||
let { data, keyPath, nextDeep: deep } = this.state, { beforeAddAction, logger: logger4 } = this.props;
|
||
beforeAddAction(data.length, keyPath, deep, newValue).then(() => {
|
||
let newData = [...data, newValue];
|
||
this.setState({ data: newData }), this.handleAddValueCancel();
|
||
let { onUpdate, onDeltaUpdate } = this.props;
|
||
onUpdate(keyPath[keyPath.length - 1], newData), onDeltaUpdate({ type: ADD_DELTA_TYPE, keyPath, deep, key: newData.length - 1, newValue });
|
||
}).catch(logger4.error);
|
||
}
|
||
handleAddValueCancel() {
|
||
this.setState({ addFormVisible: false });
|
||
}
|
||
handleEditValue({ key, value: value2 }) {
|
||
return new Promise((resolve, reject) => {
|
||
let { beforeUpdateAction } = this.props, { data, keyPath, nextDeep: deep } = this.state, oldValue = data[key];
|
||
beforeUpdateAction(key, keyPath, deep, oldValue, value2).then(() => {
|
||
data[key] = value2, this.setState({ data });
|
||
let { onUpdate, onDeltaUpdate } = this.props;
|
||
onUpdate(keyPath[keyPath.length - 1], data), onDeltaUpdate({ type: UPDATE_DELTA_TYPE, keyPath, deep, key, newValue: value2, oldValue }), resolve(void 0);
|
||
}).catch(reject);
|
||
});
|
||
}
|
||
renderCollapsed() {
|
||
let { name, data, keyPath, deep } = this.state, { handleRemove, readOnly, getStyle, dataType, minusMenuElement } = this.props, { minus, collapsed } = getStyle(name, data, keyPath, deep, dataType), isReadOnly = readOnly(name, data, keyPath, deep, dataType), removeItemButton = (0, import_react.cloneElement)(minusMenuElement, { onClick: handleRemove, className: "rejt-minus-menu", style: minus });
|
||
return import_react.default.createElement("span", { className: "rejt-collapsed" }, import_react.default.createElement("span", { className: "rejt-collapsed-text", style: collapsed, onClick: this.handleCollapseMode }, "[...] ", data.length, " ", data.length === 1 ? "item" : "items"), !isReadOnly && removeItemButton);
|
||
}
|
||
renderNotCollapsed() {
|
||
let { name, data, keyPath, deep, addFormVisible, nextDeep } = this.state, { isCollapsed, handleRemove, onDeltaUpdate, readOnly, getStyle, dataType, addButtonElement, cancelButtonElement, editButtonElement, inputElementGenerator, textareaElementGenerator, minusMenuElement, plusMenuElement, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser } = this.props, { minus, plus, delimiter, ul, addForm } = getStyle(name, data, keyPath, deep, dataType), isReadOnly = readOnly(name, data, keyPath, deep, dataType), addItemButton = (0, import_react.cloneElement)(plusMenuElement, { onClick: this.handleAddMode, className: "rejt-plus-menu", style: plus }), removeItemButton = (0, import_react.cloneElement)(minusMenuElement, { onClick: handleRemove, className: "rejt-minus-menu", style: minus }), onlyValue = true, startObject = "[", endObject = "]";
|
||
return import_react.default.createElement("span", { className: "rejt-not-collapsed" }, import_react.default.createElement("span", { className: "rejt-not-collapsed-delimiter", style: delimiter }, startObject), !addFormVisible && addItemButton, import_react.default.createElement("ul", { className: "rejt-not-collapsed-list", style: ul }, data.map((item, index) => import_react.default.createElement(JsonNode, { key: index, name: index.toString(), data: item, keyPath, deep: nextDeep, isCollapsed, handleRemove: this.handleRemoveItem(index), handleUpdateValue: this.handleEditValue, onUpdate: this.onChildUpdate, onDeltaUpdate, readOnly, getStyle, addButtonElement, cancelButtonElement, editButtonElement, inputElementGenerator, textareaElementGenerator, minusMenuElement, plusMenuElement, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser }))), !isReadOnly && addFormVisible && import_react.default.createElement("div", { className: "rejt-add-form", style: addForm }, import_react.default.createElement(JsonAddValue, { handleAdd: this.handleAddValueAdd, handleCancel: this.handleAddValueCancel, onlyValue, addButtonElement, cancelButtonElement, inputElementGenerator, keyPath, deep, onSubmitValueParser })), import_react.default.createElement("span", { className: "rejt-not-collapsed-delimiter", style: delimiter }, endObject), !isReadOnly && removeItemButton);
|
||
}
|
||
render() {
|
||
let { name, collapsed, data, keyPath, deep } = this.state, { dataType, getStyle } = this.props, value2 = collapsed ? this.renderCollapsed() : this.renderNotCollapsed(), style = getStyle(name, data, keyPath, deep, dataType);
|
||
return import_react.default.createElement("div", { className: "rejt-array-node" }, import_react.default.createElement("span", { onClick: this.handleCollapseMode }, import_react.default.createElement("span", { className: "rejt-name", style: style.name }, name, " :", " ")), value2);
|
||
}
|
||
};
|
||
JsonArray.defaultProps = { keyPath: [], deep: 0, minusMenuElement: import_react.default.createElement("span", null, " - "), plusMenuElement: import_react.default.createElement("span", null, " + ") };
|
||
var JsonFunctionValue = class extends import_react.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
let keyPath = [...props.keyPath, props.name];
|
||
this.state = { value: props.value, name: props.name, keyPath, deep: props.deep, editEnabled: false, inputRef: null }, this.handleEditMode = this.handleEditMode.bind(this), this.refInput = this.refInput.bind(this), this.handleCancelEdit = this.handleCancelEdit.bind(this), this.handleEdit = this.handleEdit.bind(this), this.onKeydown = this.onKeydown.bind(this);
|
||
}
|
||
static getDerivedStateFromProps(props, state) {
|
||
return props.value !== state.value ? { value: props.value } : null;
|
||
}
|
||
componentDidUpdate() {
|
||
let { editEnabled, inputRef, name, value: value2, keyPath, deep } = this.state, { readOnly, dataType } = this.props, readOnlyResult = readOnly(name, value2, keyPath, deep, dataType);
|
||
editEnabled && !readOnlyResult && typeof inputRef.focus == "function" && inputRef.focus();
|
||
}
|
||
componentDidMount() {
|
||
document.addEventListener("keydown", this.onKeydown);
|
||
}
|
||
componentWillUnmount() {
|
||
document.removeEventListener("keydown", this.onKeydown);
|
||
}
|
||
onKeydown(event) {
|
||
event.altKey || event.ctrlKey || event.metaKey || event.shiftKey || event.repeat || ((event.code === "Enter" || event.key === "Enter") && (event.preventDefault(), this.handleEdit()), (event.code === "Escape" || event.key === "Escape") && (event.preventDefault(), this.handleCancelEdit()));
|
||
}
|
||
handleEdit() {
|
||
let { handleUpdateValue, originalValue, logger: logger4, onSubmitValueParser, keyPath } = this.props, { inputRef, name, deep } = this.state;
|
||
if (!inputRef)
|
||
return;
|
||
let newValue = onSubmitValueParser(true, keyPath, deep, name, inputRef.value);
|
||
handleUpdateValue({ value: newValue, key: name }).then(() => {
|
||
isComponentWillChange(originalValue, newValue) || this.handleCancelEdit();
|
||
}).catch(logger4.error);
|
||
}
|
||
handleEditMode() {
|
||
this.setState({ editEnabled: true });
|
||
}
|
||
refInput(node) {
|
||
this.state.inputRef = node;
|
||
}
|
||
handleCancelEdit() {
|
||
this.setState({ editEnabled: false });
|
||
}
|
||
render() {
|
||
let { name, value: value2, editEnabled, keyPath, deep } = this.state, { handleRemove, originalValue, readOnly, dataType, getStyle, editButtonElement, cancelButtonElement, textareaElementGenerator, minusMenuElement, keyPath: comeFromKeyPath } = this.props, style = getStyle(name, originalValue, keyPath, deep, dataType), result = null, minusElement = null, resultOnlyResult = readOnly(name, originalValue, keyPath, deep, dataType);
|
||
if (editEnabled && !resultOnlyResult) {
|
||
let textareaElement = textareaElementGenerator(VALUE, comeFromKeyPath, deep, name, originalValue, dataType), editButtonElementLayout = (0, import_react.cloneElement)(editButtonElement, { onClick: this.handleEdit }), cancelButtonElementLayout = (0, import_react.cloneElement)(cancelButtonElement, { onClick: this.handleCancelEdit }), textareaElementLayout = (0, import_react.cloneElement)(textareaElement, { ref: this.refInput, defaultValue: originalValue });
|
||
result = import_react.default.createElement("span", { className: "rejt-edit-form", style: style.editForm }, textareaElementLayout, " ", cancelButtonElementLayout, editButtonElementLayout), minusElement = null;
|
||
} else {
|
||
result = import_react.default.createElement("span", { className: "rejt-value", style: style.value, onClick: resultOnlyResult ? null : this.handleEditMode }, value2);
|
||
let minusMenuLayout = (0, import_react.cloneElement)(minusMenuElement, { onClick: handleRemove, className: "rejt-minus-menu", style: style.minus });
|
||
minusElement = resultOnlyResult ? null : minusMenuLayout;
|
||
}
|
||
return import_react.default.createElement("li", { className: "rejt-function-value-node", style: style.li }, import_react.default.createElement("span", { className: "rejt-name", style: style.name }, name, " :", " "), result, minusElement);
|
||
}
|
||
};
|
||
JsonFunctionValue.defaultProps = { keyPath: [], deep: 0, handleUpdateValue: () => {
|
||
}, editButtonElement: import_react.default.createElement("button", null, "e"), cancelButtonElement: import_react.default.createElement("button", null, "c"), minusMenuElement: import_react.default.createElement("span", null, " - ") };
|
||
var JsonNode = class extends import_react.Component {
|
||
constructor(props) {
|
||
super(props), this.state = { data: props.data, name: props.name, keyPath: props.keyPath, deep: props.deep };
|
||
}
|
||
static getDerivedStateFromProps(props, state) {
|
||
return props.data !== state.data ? { data: props.data } : null;
|
||
}
|
||
render() {
|
||
let { data, name, keyPath, deep } = this.state, { isCollapsed, handleRemove, handleUpdateValue, onUpdate, onDeltaUpdate, readOnly, getStyle, addButtonElement, cancelButtonElement, editButtonElement, inputElementGenerator, textareaElementGenerator, minusMenuElement, plusMenuElement, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser } = this.props, readOnlyTrue = () => true, dataType = getObjectType(data);
|
||
switch (dataType) {
|
||
case ERROR:
|
||
return import_react.default.createElement(JsonObject, { data, name, isCollapsed, keyPath, deep, handleRemove, onUpdate, onDeltaUpdate, readOnly: readOnlyTrue, dataType, getStyle, addButtonElement, cancelButtonElement, editButtonElement, inputElementGenerator, textareaElementGenerator, minusMenuElement, plusMenuElement, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser });
|
||
case OBJECT:
|
||
return import_react.default.createElement(JsonObject, { data, name, isCollapsed, keyPath, deep, handleRemove, onUpdate, onDeltaUpdate, readOnly, dataType, getStyle, addButtonElement, cancelButtonElement, editButtonElement, inputElementGenerator, textareaElementGenerator, minusMenuElement, plusMenuElement, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser });
|
||
case ARRAY:
|
||
return import_react.default.createElement(JsonArray, { data, name, isCollapsed, keyPath, deep, handleRemove, onUpdate, onDeltaUpdate, readOnly, dataType, getStyle, addButtonElement, cancelButtonElement, editButtonElement, inputElementGenerator, textareaElementGenerator, minusMenuElement, plusMenuElement, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser });
|
||
case STRING:
|
||
return import_react.default.createElement(JsonValue, { name, value: `"${data}"`, originalValue: data, keyPath, deep, handleRemove, handleUpdateValue, readOnly, dataType, getStyle, cancelButtonElement, editButtonElement, inputElementGenerator, minusMenuElement, logger: logger4, onSubmitValueParser });
|
||
case NUMBER:
|
||
return import_react.default.createElement(JsonValue, { name, value: data, originalValue: data, keyPath, deep, handleRemove, handleUpdateValue, readOnly, dataType, getStyle, cancelButtonElement, editButtonElement, inputElementGenerator, minusMenuElement, logger: logger4, onSubmitValueParser });
|
||
case BOOLEAN:
|
||
return import_react.default.createElement(JsonValue, { name, value: data ? "true" : "false", originalValue: data, keyPath, deep, handleRemove, handleUpdateValue, readOnly, dataType, getStyle, cancelButtonElement, editButtonElement, inputElementGenerator, minusMenuElement, logger: logger4, onSubmitValueParser });
|
||
case DATE:
|
||
return import_react.default.createElement(JsonValue, { name, value: data.toISOString(), originalValue: data, keyPath, deep, handleRemove, handleUpdateValue, readOnly: readOnlyTrue, dataType, getStyle, cancelButtonElement, editButtonElement, inputElementGenerator, minusMenuElement, logger: logger4, onSubmitValueParser });
|
||
case NULL:
|
||
return import_react.default.createElement(JsonValue, { name, value: "null", originalValue: "null", keyPath, deep, handleRemove, handleUpdateValue, readOnly, dataType, getStyle, cancelButtonElement, editButtonElement, inputElementGenerator, minusMenuElement, logger: logger4, onSubmitValueParser });
|
||
case UNDEFINED:
|
||
return import_react.default.createElement(JsonValue, { name, value: "undefined", originalValue: "undefined", keyPath, deep, handleRemove, handleUpdateValue, readOnly, dataType, getStyle, cancelButtonElement, editButtonElement, inputElementGenerator, minusMenuElement, logger: logger4, onSubmitValueParser });
|
||
case FUNCTION:
|
||
return import_react.default.createElement(JsonFunctionValue, { name, value: data.toString(), originalValue: data, keyPath, deep, handleRemove, handleUpdateValue, readOnly, dataType, getStyle, cancelButtonElement, editButtonElement, textareaElementGenerator, minusMenuElement, logger: logger4, onSubmitValueParser });
|
||
case SYMBOL:
|
||
return import_react.default.createElement(JsonValue, { name, value: data.toString(), originalValue: data, keyPath, deep, handleRemove, handleUpdateValue, readOnly: readOnlyTrue, dataType, getStyle, cancelButtonElement, editButtonElement, inputElementGenerator, minusMenuElement, logger: logger4, onSubmitValueParser });
|
||
default:
|
||
return null;
|
||
}
|
||
}
|
||
};
|
||
JsonNode.defaultProps = { keyPath: [], deep: 0 };
|
||
var JsonObject = class extends import_react.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
let keyPath = props.deep === -1 ? [] : [...props.keyPath, props.name];
|
||
this.state = { name: props.name, data: props.data, keyPath, deep: props.deep, nextDeep: props.deep + 1, collapsed: props.isCollapsed(keyPath, props.deep, props.data), addFormVisible: false }, this.handleCollapseMode = this.handleCollapseMode.bind(this), this.handleRemoveValue = this.handleRemoveValue.bind(this), this.handleAddMode = this.handleAddMode.bind(this), this.handleAddValueAdd = this.handleAddValueAdd.bind(this), this.handleAddValueCancel = this.handleAddValueCancel.bind(this), this.handleEditValue = this.handleEditValue.bind(this), this.onChildUpdate = this.onChildUpdate.bind(this), this.renderCollapsed = this.renderCollapsed.bind(this), this.renderNotCollapsed = this.renderNotCollapsed.bind(this);
|
||
}
|
||
static getDerivedStateFromProps(props, state) {
|
||
return props.data !== state.data ? { data: props.data } : null;
|
||
}
|
||
onChildUpdate(childKey, childData) {
|
||
let { data, keyPath } = this.state;
|
||
data[childKey] = childData, this.setState({ data });
|
||
let { onUpdate } = this.props, size = keyPath.length;
|
||
onUpdate(keyPath[size - 1], data);
|
||
}
|
||
handleAddMode() {
|
||
this.setState({ addFormVisible: true });
|
||
}
|
||
handleAddValueCancel() {
|
||
this.setState({ addFormVisible: false });
|
||
}
|
||
handleAddValueAdd({ key, newValue }) {
|
||
let { data, keyPath, nextDeep: deep } = this.state, { beforeAddAction, logger: logger4 } = this.props;
|
||
beforeAddAction(key, keyPath, deep, newValue).then(() => {
|
||
data[key] = newValue, this.setState({ data }), this.handleAddValueCancel();
|
||
let { onUpdate, onDeltaUpdate } = this.props;
|
||
onUpdate(keyPath[keyPath.length - 1], data), onDeltaUpdate({ type: ADD_DELTA_TYPE, keyPath, deep, key, newValue });
|
||
}).catch(logger4.error);
|
||
}
|
||
handleRemoveValue(key) {
|
||
return () => {
|
||
let { beforeRemoveAction, logger: logger4 } = this.props, { data, keyPath, nextDeep: deep } = this.state, oldValue = data[key];
|
||
beforeRemoveAction(key, keyPath, deep, oldValue).then(() => {
|
||
let deltaUpdateResult = { keyPath, deep, key, oldValue, type: REMOVE_DELTA_TYPE };
|
||
delete data[key], this.setState({ data });
|
||
let { onUpdate, onDeltaUpdate } = this.props;
|
||
onUpdate(keyPath[keyPath.length - 1], data), onDeltaUpdate(deltaUpdateResult);
|
||
}).catch(logger4.error);
|
||
};
|
||
}
|
||
handleCollapseMode() {
|
||
this.setState((state) => ({ collapsed: !state.collapsed }));
|
||
}
|
||
handleEditValue({ key, value: value2 }) {
|
||
return new Promise((resolve, reject) => {
|
||
let { beforeUpdateAction } = this.props, { data, keyPath, nextDeep: deep } = this.state, oldValue = data[key];
|
||
beforeUpdateAction(key, keyPath, deep, oldValue, value2).then(() => {
|
||
data[key] = value2, this.setState({ data });
|
||
let { onUpdate, onDeltaUpdate } = this.props;
|
||
onUpdate(keyPath[keyPath.length - 1], data), onDeltaUpdate({ type: UPDATE_DELTA_TYPE, keyPath, deep, key, newValue: value2, oldValue }), resolve();
|
||
}).catch(reject);
|
||
});
|
||
}
|
||
renderCollapsed() {
|
||
let { name, keyPath, deep, data } = this.state, { handleRemove, readOnly, dataType, getStyle, minusMenuElement } = this.props, { minus, collapsed } = getStyle(name, data, keyPath, deep, dataType), keyList = Object.getOwnPropertyNames(data), isReadOnly = readOnly(name, data, keyPath, deep, dataType), removeItemButton = (0, import_react.cloneElement)(minusMenuElement, { onClick: handleRemove, className: "rejt-minus-menu", style: minus });
|
||
return import_react.default.createElement("span", { className: "rejt-collapsed" }, import_react.default.createElement("span", { className: "rejt-collapsed-text", style: collapsed, onClick: this.handleCollapseMode }, "{...}", " ", keyList.length, " ", keyList.length === 1 ? "key" : "keys"), !isReadOnly && removeItemButton);
|
||
}
|
||
renderNotCollapsed() {
|
||
let { name, data, keyPath, deep, nextDeep, addFormVisible } = this.state, { isCollapsed, handleRemove, onDeltaUpdate, readOnly, getStyle, dataType, addButtonElement, cancelButtonElement, editButtonElement, inputElementGenerator, textareaElementGenerator, minusMenuElement, plusMenuElement, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser } = this.props, { minus, plus, addForm, ul, delimiter } = getStyle(name, data, keyPath, deep, dataType), keyList = Object.getOwnPropertyNames(data), isReadOnly = readOnly(name, data, keyPath, deep, dataType), addItemButton = (0, import_react.cloneElement)(plusMenuElement, { onClick: this.handleAddMode, className: "rejt-plus-menu", style: plus }), removeItemButton = (0, import_react.cloneElement)(minusMenuElement, { onClick: handleRemove, className: "rejt-minus-menu", style: minus }), list = keyList.map((key) => import_react.default.createElement(JsonNode, { key, name: key, data: data[key], keyPath, deep: nextDeep, isCollapsed, handleRemove: this.handleRemoveValue(key), handleUpdateValue: this.handleEditValue, onUpdate: this.onChildUpdate, onDeltaUpdate, readOnly, getStyle, addButtonElement, cancelButtonElement, editButtonElement, inputElementGenerator, textareaElementGenerator, minusMenuElement, plusMenuElement, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser })), startObject = "{", endObject = "}";
|
||
return import_react.default.createElement("span", { className: "rejt-not-collapsed" }, import_react.default.createElement("span", { className: "rejt-not-collapsed-delimiter", style: delimiter }, startObject), !isReadOnly && addItemButton, import_react.default.createElement("ul", { className: "rejt-not-collapsed-list", style: ul }, list), !isReadOnly && addFormVisible && import_react.default.createElement("div", { className: "rejt-add-form", style: addForm }, import_react.default.createElement(JsonAddValue, { handleAdd: this.handleAddValueAdd, handleCancel: this.handleAddValueCancel, addButtonElement, cancelButtonElement, inputElementGenerator, keyPath, deep, onSubmitValueParser })), import_react.default.createElement("span", { className: "rejt-not-collapsed-delimiter", style: delimiter }, endObject), !isReadOnly && removeItemButton);
|
||
}
|
||
render() {
|
||
let { name, collapsed, data, keyPath, deep } = this.state, { getStyle, dataType } = this.props, value2 = collapsed ? this.renderCollapsed() : this.renderNotCollapsed(), style = getStyle(name, data, keyPath, deep, dataType);
|
||
return import_react.default.createElement("div", { className: "rejt-object-node" }, import_react.default.createElement("span", { onClick: this.handleCollapseMode }, import_react.default.createElement("span", { className: "rejt-name", style: style.name }, name, " :", " ")), value2);
|
||
}
|
||
};
|
||
JsonObject.defaultProps = { keyPath: [], deep: 0, minusMenuElement: import_react.default.createElement("span", null, " - "), plusMenuElement: import_react.default.createElement("span", null, " + ") };
|
||
var JsonValue = class extends import_react.Component {
|
||
constructor(props) {
|
||
super(props);
|
||
let keyPath = [...props.keyPath, props.name];
|
||
this.state = { value: props.value, name: props.name, keyPath, deep: props.deep, editEnabled: false, inputRef: null }, this.handleEditMode = this.handleEditMode.bind(this), this.refInput = this.refInput.bind(this), this.handleCancelEdit = this.handleCancelEdit.bind(this), this.handleEdit = this.handleEdit.bind(this), this.onKeydown = this.onKeydown.bind(this);
|
||
}
|
||
static getDerivedStateFromProps(props, state) {
|
||
return props.value !== state.value ? { value: props.value } : null;
|
||
}
|
||
componentDidUpdate() {
|
||
let { editEnabled, inputRef, name, value: value2, keyPath, deep } = this.state, { readOnly, dataType } = this.props, isReadOnly = readOnly(name, value2, keyPath, deep, dataType);
|
||
editEnabled && !isReadOnly && typeof inputRef.focus == "function" && inputRef.focus();
|
||
}
|
||
componentDidMount() {
|
||
document.addEventListener("keydown", this.onKeydown);
|
||
}
|
||
componentWillUnmount() {
|
||
document.removeEventListener("keydown", this.onKeydown);
|
||
}
|
||
onKeydown(event) {
|
||
event.altKey || event.ctrlKey || event.metaKey || event.shiftKey || event.repeat || ((event.code === "Enter" || event.key === "Enter") && (event.preventDefault(), this.handleEdit()), (event.code === "Escape" || event.key === "Escape") && (event.preventDefault(), this.handleCancelEdit()));
|
||
}
|
||
handleEdit() {
|
||
let { handleUpdateValue, originalValue, logger: logger4, onSubmitValueParser, keyPath } = this.props, { inputRef, name, deep } = this.state;
|
||
if (!inputRef)
|
||
return;
|
||
let newValue = onSubmitValueParser(true, keyPath, deep, name, inputRef.value);
|
||
handleUpdateValue({ value: newValue, key: name }).then(() => {
|
||
isComponentWillChange(originalValue, newValue) || this.handleCancelEdit();
|
||
}).catch(logger4.error);
|
||
}
|
||
handleEditMode() {
|
||
this.setState({ editEnabled: true });
|
||
}
|
||
refInput(node) {
|
||
this.state.inputRef = node;
|
||
}
|
||
handleCancelEdit() {
|
||
this.setState({ editEnabled: false });
|
||
}
|
||
render() {
|
||
let { name, value: value2, editEnabled, keyPath, deep } = this.state, { handleRemove, originalValue, readOnly, dataType, getStyle, editButtonElement, cancelButtonElement, inputElementGenerator, minusMenuElement, keyPath: comeFromKeyPath } = this.props, style = getStyle(name, originalValue, keyPath, deep, dataType), isReadOnly = readOnly(name, originalValue, keyPath, deep, dataType), isEditing = editEnabled && !isReadOnly, inputElement = inputElementGenerator(VALUE, comeFromKeyPath, deep, name, originalValue, dataType), editButtonElementLayout = (0, import_react.cloneElement)(editButtonElement, { onClick: this.handleEdit }), cancelButtonElementLayout = (0, import_react.cloneElement)(cancelButtonElement, { onClick: this.handleCancelEdit }), inputElementLayout = (0, import_react.cloneElement)(inputElement, { ref: this.refInput, defaultValue: JSON.stringify(originalValue) }), minusMenuLayout = (0, import_react.cloneElement)(minusMenuElement, { onClick: handleRemove, className: "rejt-minus-menu", style: style.minus });
|
||
return import_react.default.createElement("li", { className: "rejt-value-node", style: style.li }, import_react.default.createElement("span", { className: "rejt-name", style: style.name }, name, " : "), isEditing ? import_react.default.createElement("span", { className: "rejt-edit-form", style: style.editForm }, inputElementLayout, " ", cancelButtonElementLayout, editButtonElementLayout) : import_react.default.createElement("span", { className: "rejt-value", style: style.value, onClick: isReadOnly ? null : this.handleEditMode }, String(value2)), !isReadOnly && !isEditing && minusMenuLayout);
|
||
}
|
||
};
|
||
JsonValue.defaultProps = { keyPath: [], deep: 0, handleUpdateValue: () => Promise.resolve(), editButtonElement: import_react.default.createElement("button", null, "e"), cancelButtonElement: import_react.default.createElement("button", null, "c"), minusMenuElement: import_react.default.createElement("span", null, " - ") };
|
||
var object = { minus: { color: "red" }, plus: { color: "green" }, collapsed: { color: "grey" }, delimiter: {}, ul: { padding: "0px", margin: "0 0 0 25px", listStyle: "none" }, name: { color: "#2287CD" }, addForm: {} };
|
||
var array = { minus: { color: "red" }, plus: { color: "green" }, collapsed: { color: "grey" }, delimiter: {}, ul: { padding: "0px", margin: "0 0 0 25px", listStyle: "none" }, name: { color: "#2287CD" }, addForm: {} };
|
||
var value = { minus: { color: "red" }, editForm: {}, value: { color: "#7bba3d" }, li: { minHeight: "22px", lineHeight: "22px", outline: "0px" }, name: { color: "#2287CD" } };
|
||
function parse3(string) {
|
||
let result = string;
|
||
if (result.indexOf("function") === 0)
|
||
return (0, eval)(`(${result})`);
|
||
try {
|
||
result = JSON.parse(string);
|
||
} catch {
|
||
}
|
||
return result;
|
||
}
|
||
var JsonTree = class extends import_react.Component {
|
||
constructor(props) {
|
||
super(props), this.state = { data: props.data, rootName: props.rootName }, this.onUpdate = this.onUpdate.bind(this), this.removeRoot = this.removeRoot.bind(this);
|
||
}
|
||
static getDerivedStateFromProps(props, state) {
|
||
return props.data !== state.data || props.rootName !== state.rootName ? { data: props.data, rootName: props.rootName } : null;
|
||
}
|
||
onUpdate(key, data) {
|
||
this.setState({ data }), this.props.onFullyUpdate(data);
|
||
}
|
||
removeRoot() {
|
||
this.onUpdate(null, null);
|
||
}
|
||
render() {
|
||
let { data, rootName } = this.state, { isCollapsed, onDeltaUpdate, readOnly, getStyle, addButtonElement, cancelButtonElement, editButtonElement, inputElement, textareaElement, minusMenuElement, plusMenuElement, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser, fallback = null } = this.props, dataType = getObjectType(data), readOnlyFunction = readOnly;
|
||
getObjectType(readOnly) === "Boolean" && (readOnlyFunction = () => readOnly);
|
||
let inputElementFunction = inputElement;
|
||
inputElement && getObjectType(inputElement) !== "Function" && (inputElementFunction = () => inputElement);
|
||
let textareaElementFunction = textareaElement;
|
||
return textareaElement && getObjectType(textareaElement) !== "Function" && (textareaElementFunction = () => textareaElement), dataType === "Object" || dataType === "Array" ? import_react.default.createElement("div", { className: "rejt-tree" }, import_react.default.createElement(JsonNode, { data, name: rootName, deep: -1, isCollapsed, onUpdate: this.onUpdate, onDeltaUpdate, readOnly: readOnlyFunction, getStyle, addButtonElement, cancelButtonElement, editButtonElement, inputElementGenerator: inputElementFunction, textareaElementGenerator: textareaElementFunction, minusMenuElement, plusMenuElement, handleRemove: this.removeRoot, beforeRemoveAction, beforeAddAction, beforeUpdateAction, logger: logger4, onSubmitValueParser })) : fallback;
|
||
}
|
||
};
|
||
JsonTree.defaultProps = { rootName: "root", isCollapsed: (keyPath, deep) => deep !== -1, getStyle: (keyName, data, keyPath, deep, dataType) => {
|
||
switch (dataType) {
|
||
case "Object":
|
||
case "Error":
|
||
return object;
|
||
case "Array":
|
||
return array;
|
||
default:
|
||
return value;
|
||
}
|
||
}, readOnly: () => false, onFullyUpdate: () => {
|
||
}, onDeltaUpdate: () => {
|
||
}, beforeRemoveAction: () => Promise.resolve(), beforeAddAction: () => Promise.resolve(), beforeUpdateAction: () => Promise.resolve(), logger: { error: () => {
|
||
} }, onSubmitValueParser: (isEditMode, keyPath, deep, name, rawValue) => parse3(rawValue), inputElement: () => import_react.default.createElement("input", null), textareaElement: () => import_react.default.createElement("textarea", null), fallback: null };
|
||
var { window: globalWindow2 } = import_global.global;
|
||
var Wrapper5 = newStyled.div(({ theme }) => ({ position: "relative", display: "flex", ".rejt-tree": { marginLeft: "1rem", fontSize: "13px" }, ".rejt-value-node, .rejt-object-node > .rejt-collapsed, .rejt-array-node > .rejt-collapsed, .rejt-object-node > .rejt-not-collapsed, .rejt-array-node > .rejt-not-collapsed": { "& > svg": { opacity: 0, transition: "opacity 0.2s" } }, ".rejt-value-node:hover, .rejt-object-node:hover > .rejt-collapsed, .rejt-array-node:hover > .rejt-collapsed, .rejt-object-node:hover > .rejt-not-collapsed, .rejt-array-node:hover > .rejt-not-collapsed": { "& > svg": { opacity: 1 } }, ".rejt-edit-form button": { display: "none" }, ".rejt-add-form": { marginLeft: 10 }, ".rejt-add-value-node": { display: "inline-flex", alignItems: "center" }, ".rejt-name": { lineHeight: "22px" }, ".rejt-not-collapsed-delimiter": { lineHeight: "22px" }, ".rejt-plus-menu": { marginLeft: 5 }, ".rejt-object-node > span > *, .rejt-array-node > span > *": { position: "relative", zIndex: 2 }, ".rejt-object-node, .rejt-array-node": { position: "relative" }, ".rejt-object-node > span:first-of-type::after, .rejt-array-node > span:first-of-type::after, .rejt-collapsed::before, .rejt-not-collapsed::before": { content: '""', position: "absolute", top: 0, display: "block", width: "100%", marginLeft: "-1rem", padding: "0 4px 0 1rem", height: 22 }, ".rejt-collapsed::before, .rejt-not-collapsed::before": { zIndex: 1, background: "transparent", borderRadius: 4, transition: "background 0.2s", pointerEvents: "none", opacity: 0.1 }, ".rejt-object-node:hover, .rejt-array-node:hover": { "& > .rejt-collapsed::before, & > .rejt-not-collapsed::before": { background: theme.color.secondary } }, ".rejt-collapsed::after, .rejt-not-collapsed::after": { content: '""', position: "absolute", display: "inline-block", pointerEvents: "none", width: 0, height: 0 }, ".rejt-collapsed::after": { left: -8, top: 8, borderTop: "3px solid transparent", borderBottom: "3px solid transparent", borderLeft: "3px solid rgba(153,153,153,0.6)" }, ".rejt-not-collapsed::after": { left: -10, top: 10, borderTop: "3px solid rgba(153,153,153,0.6)", borderLeft: "3px solid transparent", borderRight: "3px solid transparent" }, ".rejt-value": { display: "inline-block", border: "1px solid transparent", borderRadius: 4, margin: "1px 0", padding: "0 4px", cursor: "text", color: theme.color.defaultText }, ".rejt-value-node:hover > .rejt-value": { background: theme.color.lighter, borderColor: theme.appBorderColor } }));
|
||
var Button = newStyled.button(({ theme, primary }) => ({ border: 0, height: 20, margin: 1, borderRadius: 4, background: primary ? theme.color.secondary : "transparent", color: primary ? theme.color.lightest : theme.color.dark, fontWeight: primary ? "bold" : "normal", cursor: "pointer", order: primary ? "initial" : 9 }));
|
||
var ActionIcon = newStyled(Icons)(({ theme, icon, disabled }) => ({ display: "inline-block", verticalAlign: "middle", width: 15, height: 15, padding: 3, marginLeft: 5, cursor: disabled ? "not-allowed" : "pointer", color: theme.textMutedColor, "&:hover": disabled ? {} : { color: icon === "subtract" ? theme.color.negative : theme.color.ancillary }, "svg + &": { marginLeft: 0 } }));
|
||
var Input = newStyled.input(({ theme, placeholder }) => ({ outline: 0, margin: placeholder ? 1 : "1px 0", padding: "3px 4px", color: theme.color.defaultText, background: theme.background.app, border: `1px solid ${theme.appBorderColor}`, borderRadius: 4, lineHeight: "14px", width: placeholder === "Key" ? 80 : 120, "&:focus": { border: `1px solid ${theme.color.secondary}` } }));
|
||
var RawButton = newStyled(IconButton)(({ theme }) => ({ position: "absolute", zIndex: 2, top: 2, right: 2, height: 21, padding: "0 3px", background: theme.background.bar, border: `1px solid ${theme.appBorderColor}`, borderRadius: 3, color: theme.textMutedColor, fontSize: "9px", fontWeight: "bold", textDecoration: "none", span: { marginLeft: 3, marginTop: 1 } }));
|
||
var RawInput = newStyled(Form.Textarea)(({ theme }) => ({ flex: 1, padding: "7px 6px", fontFamily: theme.typography.fonts.mono, fontSize: "12px", lineHeight: "18px", "&::placeholder": { fontFamily: theme.typography.fonts.base, fontSize: "13px" }, "&:placeholder-shown": { padding: "7px 10px" } }));
|
||
var ENTER_EVENT = { bubbles: true, cancelable: true, key: "Enter", code: "Enter", keyCode: 13 };
|
||
var dispatchEnterKey = (event) => {
|
||
event.currentTarget.dispatchEvent(new globalWindow2.KeyboardEvent("keydown", ENTER_EVENT));
|
||
};
|
||
var selectValue = (event) => {
|
||
event.currentTarget.select();
|
||
};
|
||
var getCustomStyleFunction = (theme) => () => ({ name: { color: theme.color.secondary }, collapsed: { color: theme.color.dark }, ul: { listStyle: "none", margin: "0 0 0 1rem", padding: 0 }, li: { outline: 0 } });
|
||
var ObjectControl = ({ name, value: value2, onChange }) => {
|
||
let theme = useTheme(), data = (0, import_react.useMemo)(() => value2 && (0, import_cloneDeep.default)(value2), [value2]), hasData = data != null, [showRaw, setShowRaw] = (0, import_react.useState)(!hasData), [parseError, setParseError] = (0, import_react.useState)(null), updateRaw = (0, import_react.useCallback)((raw) => {
|
||
try {
|
||
raw && onChange(JSON.parse(raw)), setParseError(void 0);
|
||
} catch (e) {
|
||
setParseError(e);
|
||
}
|
||
}, [onChange]), [forceVisible, setForceVisible] = (0, import_react.useState)(false), onForceVisible = (0, import_react.useCallback)(() => {
|
||
onChange({}), setForceVisible(true);
|
||
}, [setForceVisible]), htmlElRef = (0, import_react.useRef)(null);
|
||
if ((0, import_react.useEffect)(() => {
|
||
forceVisible && htmlElRef.current && htmlElRef.current.select();
|
||
}, [forceVisible]), !hasData)
|
||
return import_react.default.createElement(Form.Button, { id: getControlSetterButtonId(name), onClick: onForceVisible }, "Set object");
|
||
let rawJSONForm = import_react.default.createElement(RawInput, { ref: htmlElRef, id: getControlId(name), name, defaultValue: value2 === null ? "" : JSON.stringify(value2, null, 2), onBlur: (event) => updateRaw(event.target.value), placeholder: "Edit JSON string...", autoFocus: forceVisible, valid: parseError ? "error" : null });
|
||
return import_react.default.createElement(Wrapper5, null, ["Object", "Array"].includes(getObjectType(data)) && import_react.default.createElement(RawButton, { href: "#", onClick: (e) => {
|
||
e.preventDefault(), setShowRaw((v2) => !v2);
|
||
} }, import_react.default.createElement(Icons, { icon: showRaw ? "eyeclose" : "eye" }), import_react.default.createElement("span", null, "RAW")), showRaw ? rawJSONForm : import_react.default.createElement(JsonTree, { data, rootName: name, onFullyUpdate: onChange, getStyle: getCustomStyleFunction(theme), cancelButtonElement: import_react.default.createElement(Button, { type: "button" }, "Cancel"), editButtonElement: import_react.default.createElement(Button, { type: "submit" }, "Save"), addButtonElement: import_react.default.createElement(Button, { type: "submit", primary: true }, "Save"), plusMenuElement: import_react.default.createElement(ActionIcon, { icon: "add" }), minusMenuElement: import_react.default.createElement(ActionIcon, { icon: "subtract" }), inputElement: (_, __, ___, key) => key ? import_react.default.createElement(Input, { onFocus: selectValue, onBlur: dispatchEnterKey }) : import_react.default.createElement(Input, null), fallback: rawJSONForm }));
|
||
};
|
||
var RangeInput = newStyled.input(({ theme, min, max, value: value2 }) => ({ "&": { width: "100%", backgroundColor: "transparent", appearance: "none" }, "&::-webkit-slider-runnable-track": { background: theme.base === "light" ? `linear-gradient(to right,
|
||
${theme.color.green} 0%, ${theme.color.green} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedDarken$1(0.02, theme.input.background)} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedDarken$1(0.02, theme.input.background)} 100%)` : `linear-gradient(to right,
|
||
${theme.color.green} 0%, ${theme.color.green} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedLighten$1(0.02, theme.input.background)} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedLighten$1(0.02, theme.input.background)} 100%)`, boxShadow: `${theme.appBorderColor} 0 0 0 1px inset`, borderRadius: 6, width: "100%", height: 6, cursor: "pointer" }, "&::-webkit-slider-thumb": { marginTop: "-6px", width: 16, height: 16, border: `1px solid ${rgba(theme.appBorderColor, 0.2)}`, borderRadius: "50px", boxShadow: `0 1px 3px 0px ${rgba(theme.appBorderColor, 0.2)}`, cursor: "grab", appearance: "none", background: `${theme.input.background}`, transition: "all 150ms ease-out", "&:hover": { background: `${curriedDarken$1(0.05, theme.input.background)}`, transform: "scale3d(1.1, 1.1, 1.1) translateY(-1px)", transition: "all 50ms ease-out" }, "&:active": { background: `${theme.input.background}`, transform: "scale3d(1, 1, 1) translateY(0px)", cursor: "grabbing" } }, "&:focus": { outline: "none", "&::-webkit-slider-runnable-track": { borderColor: rgba(theme.color.secondary, 0.4) }, "&::-webkit-slider-thumb": { borderColor: theme.color.secondary, boxShadow: `0 0px 5px 0px ${theme.color.secondary}` } }, "&::-moz-range-track": { background: theme.base === "light" ? `linear-gradient(to right,
|
||
${theme.color.green} 0%, ${theme.color.green} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedDarken$1(0.02, theme.input.background)} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedDarken$1(0.02, theme.input.background)} 100%)` : `linear-gradient(to right,
|
||
${theme.color.green} 0%, ${theme.color.green} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedLighten$1(0.02, theme.input.background)} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedLighten$1(0.02, theme.input.background)} 100%)`, boxShadow: `${theme.appBorderColor} 0 0 0 1px inset`, borderRadius: 6, width: "100%", height: 6, cursor: "pointer", outline: "none" }, "&::-moz-range-thumb": { width: 16, height: 16, border: `1px solid ${rgba(theme.appBorderColor, 0.2)}`, borderRadius: "50px", boxShadow: `0 1px 3px 0px ${rgba(theme.appBorderColor, 0.2)}`, cursor: "grab", background: `${theme.input.background}`, transition: "all 150ms ease-out", "&:hover": { background: `${curriedDarken$1(0.05, theme.input.background)}`, transform: "scale3d(1.1, 1.1, 1.1) translateY(-1px)", transition: "all 50ms ease-out" }, "&:active": { background: `${theme.input.background}`, transform: "scale3d(1, 1, 1) translateY(0px)", cursor: "grabbing" } }, "&::-ms-track": { background: theme.base === "light" ? `linear-gradient(to right,
|
||
${theme.color.green} 0%, ${theme.color.green} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedDarken$1(0.02, theme.input.background)} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedDarken$1(0.02, theme.input.background)} 100%)` : `linear-gradient(to right,
|
||
${theme.color.green} 0%, ${theme.color.green} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedLighten$1(0.02, theme.input.background)} ${(value2 - min) / (max - min) * 100}%,
|
||
${curriedLighten$1(0.02, theme.input.background)} 100%)`, boxShadow: `${theme.appBorderColor} 0 0 0 1px inset`, color: "transparent", width: "100%", height: "6px", cursor: "pointer" }, "&::-ms-fill-lower": { borderRadius: 6 }, "&::-ms-fill-upper": { borderRadius: 6 }, "&::-ms-thumb": { width: 16, height: 16, background: `${theme.input.background}`, border: `1px solid ${rgba(theme.appBorderColor, 0.2)}`, borderRadius: 50, cursor: "grab", marginTop: 0 }, "@supports (-ms-ime-align:auto)": { "input[type=range]": { margin: "0" } } }));
|
||
var RangeLabel = newStyled.span({ paddingLeft: 5, paddingRight: 5, fontSize: 12, whiteSpace: "nowrap", fontFeatureSettings: "tnum", fontVariantNumeric: "tabular-nums" });
|
||
var RangeCurrentAndMaxLabel = newStyled(RangeLabel)(({ numberOFDecimalsPlaces, max }) => ({ width: `${numberOFDecimalsPlaces + max.toString().length * 2 + 3}ch`, textAlign: "right", flexShrink: 0 }));
|
||
var RangeWrapper = newStyled.div({ display: "flex", alignItems: "center", width: "100%" });
|
||
function getNumberOfDecimalPlaces(number) {
|
||
let match = number.toString().match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
|
||
return match ? Math.max(0, (match[1] ? match[1].length : 0) - (match[2] ? +match[2] : 0)) : 0;
|
||
}
|
||
var RangeControl = ({ name, value: value2, onChange, min = 0, max = 100, step = 1, onBlur, onFocus }) => {
|
||
let handleChange = (event) => {
|
||
onChange(parse2(event.target.value));
|
||
}, hasValue = value2 !== void 0, numberOFDecimalsPlaces = (0, import_react.useMemo)(() => getNumberOfDecimalPlaces(step), [step]);
|
||
return import_react.default.createElement(RangeWrapper, null, import_react.default.createElement(RangeLabel, null, min), import_react.default.createElement(RangeInput, { id: getControlId(name), type: "range", onChange: handleChange, name, value: value2, min, max, step, onFocus, onBlur }), import_react.default.createElement(RangeCurrentAndMaxLabel, { numberOFDecimalsPlaces, max }, hasValue ? value2.toFixed(numberOFDecimalsPlaces) : "--", " / ", max));
|
||
};
|
||
var Wrapper6 = newStyled.label({ display: "flex" });
|
||
var MaxLength = newStyled.div(({ isMaxed }) => ({ marginLeft: "0.75rem", paddingTop: "0.35rem", color: isMaxed ? "red" : void 0 }));
|
||
var TextControl = ({ name, value: value2, onChange, onFocus, onBlur, maxLength }) => {
|
||
let handleChange = (event) => {
|
||
onChange(event.target.value);
|
||
}, [forceVisible, setForceVisible] = (0, import_react.useState)(false), onForceVisible = (0, import_react.useCallback)(() => {
|
||
onChange(""), setForceVisible(true);
|
||
}, [setForceVisible]);
|
||
if (value2 === void 0)
|
||
return import_react.default.createElement(Form.Button, { id: getControlSetterButtonId(name), onClick: onForceVisible }, "Set string");
|
||
let isValid = typeof value2 == "string";
|
||
return import_react.default.createElement(Wrapper6, null, import_react.default.createElement(Form.Textarea, { id: getControlId(name), maxLength, onChange: handleChange, size: "flex", placeholder: "Edit string...", autoFocus: forceVisible, valid: isValid ? null : "error", name, value: isValid ? value2 : "", onFocus, onBlur }), maxLength && import_react.default.createElement(MaxLength, { isMaxed: (value2 == null ? void 0 : value2.length) === maxLength }, (value2 == null ? void 0 : value2.length) ?? 0, " / ", maxLength));
|
||
};
|
||
var FileInput = newStyled(Form.Input)({ padding: 10 });
|
||
function revokeOldUrls(urls) {
|
||
urls.forEach((url) => {
|
||
url.startsWith("blob:") && URL.revokeObjectURL(url);
|
||
});
|
||
}
|
||
var FilesControl = ({ onChange, name, accept = "image/*", value: value2 }) => {
|
||
let inputElement = (0, import_react.useRef)(null);
|
||
function handleFileChange(e) {
|
||
if (!e.target.files)
|
||
return;
|
||
let fileUrls = Array.from(e.target.files).map((file) => URL.createObjectURL(file));
|
||
onChange(fileUrls), revokeOldUrls(value2);
|
||
}
|
||
return (0, import_react.useEffect)(() => {
|
||
value2 == null && inputElement.current && (inputElement.current.value = null);
|
||
}, [value2, name]), import_react.default.createElement(FileInput, { ref: inputElement, id: getControlId(name), type: "file", name, multiple: true, onChange: handleFileChange, accept, size: "flex" });
|
||
};
|
||
var LazyColorControl = (0, import_react.lazy)(() => import("./Color-6VNJS4EI-DKI35E2I.js"));
|
||
var ColorControl = (props) => import_react.default.createElement(import_react.Suspense, { fallback: import_react.default.createElement("div", null) }, import_react.default.createElement(LazyColorControl, { ...props }));
|
||
var Controls2 = { array: ObjectControl, object: ObjectControl, boolean: BooleanControl, color: ColorControl, date: DateControl, number: NumberControl, check: OptionsControl, "inline-check": OptionsControl, radio: OptionsControl, "inline-radio": OptionsControl, select: OptionsControl, "multi-select": OptionsControl, range: RangeControl, text: TextControl, file: FilesControl };
|
||
var NoControl = () => import_react.default.createElement(import_react.default.Fragment, null, "-");
|
||
var ArgControl = ({ row, arg, updateArgs, isHovered }) => {
|
||
let { key, control } = row, [isFocused, setFocused] = (0, import_react.useState)(false), [boxedValue, setBoxedValue] = (0, import_react.useState)({ value: arg });
|
||
(0, import_react.useEffect)(() => {
|
||
isFocused || setBoxedValue({ value: arg });
|
||
}, [isFocused, arg]);
|
||
let onChange = (0, import_react.useCallback)((argVal) => (setBoxedValue({ value: argVal }), updateArgs({ [key]: argVal }), argVal), [updateArgs, key]), onBlur = (0, import_react.useCallback)(() => setFocused(false), []), onFocus = (0, import_react.useCallback)(() => setFocused(true), []);
|
||
if (!control || control.disable)
|
||
return isHovered ? import_react.default.createElement(Link2, { href: "https://storybook.js.org/docs/react/essentials/controls", target: "_blank", withArrow: true }, "Setup controls") : import_react.default.createElement(NoControl, null);
|
||
let props = { name: key, argType: row, value: boxedValue.value, onChange, onBlur, onFocus }, Control = Controls2[control.type] || NoControl;
|
||
return import_react.default.createElement(Control, { ...props, ...control, controlType: control.type });
|
||
};
|
||
var Name = newStyled.span({ fontWeight: "bold" });
|
||
var Required = newStyled.span(({ theme }) => ({ color: theme.color.negative, fontFamily: theme.typography.fonts.mono, cursor: "help" }));
|
||
var Description = newStyled.div(({ theme }) => ({ "&&": { p: { margin: "0 0 10px 0" }, a: { color: theme.color.secondary } }, code: { ...codeCommon({ theme }), fontSize: 12, fontFamily: theme.typography.fonts.mono }, "& code": { margin: 0, display: "inline-block" }, "& pre > code": { whiteSpace: "pre-wrap" } }));
|
||
var Type = newStyled.div(({ theme, hasDescription }) => ({ color: theme.base === "light" ? curriedTransparentize$1(0.1, theme.color.defaultText) : curriedTransparentize$1(0.2, theme.color.defaultText), marginTop: hasDescription ? 4 : 0 }));
|
||
var TypeWithJsDoc = newStyled.div(({ theme, hasDescription }) => ({ color: theme.base === "light" ? curriedTransparentize$1(0.1, theme.color.defaultText) : curriedTransparentize$1(0.2, theme.color.defaultText), marginTop: hasDescription ? 12 : 0, marginBottom: 12 }));
|
||
var StyledTd = newStyled.td(({ theme, expandable }) => ({ paddingLeft: expandable ? "40px !important" : "20px !important" }));
|
||
var ArgRow = (props) => {
|
||
var _a;
|
||
let [isHovered, setIsHovered] = (0, import_react.useState)(false), { row, updateArgs, compact, expandable, initialExpandedArgs } = props, { name, description } = row, table = row.table || {}, type = table.type || row.type, defaultValue = table.defaultValue || row.defaultValue, required = (_a = row.type) == null ? void 0 : _a.required, hasDescription = description != null && description !== "";
|
||
return import_react.default.createElement("tr", { onMouseEnter: () => setIsHovered(true), onMouseLeave: () => setIsHovered(false) }, import_react.default.createElement(StyledTd, { expandable }, import_react.default.createElement(Name, null, name), required ? import_react.default.createElement(Required, { title: "Required" }, "*") : null), compact ? null : import_react.default.createElement("td", null, hasDescription && import_react.default.createElement(Description, null, import_react.default.createElement(index_modern_default, null, description)), table.jsDocTags != null ? import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(TypeWithJsDoc, { hasDescription }, import_react.default.createElement(ArgValue, { value: type, initialExpandedArgs })), import_react.default.createElement(ArgJsDoc, { tags: table.jsDocTags })) : import_react.default.createElement(Type, { hasDescription }, import_react.default.createElement(ArgValue, { value: type, initialExpandedArgs }))), compact ? null : import_react.default.createElement("td", null, import_react.default.createElement(ArgValue, { value: defaultValue, initialExpandedArgs })), updateArgs ? import_react.default.createElement("td", null, import_react.default.createElement(ArgControl, { ...props, isHovered })) : null);
|
||
};
|
||
var ExpanderIcon = newStyled(Icons)(({ theme }) => ({ marginRight: 8, marginLeft: -10, marginTop: -2, height: 12, width: 12, color: theme.base === "light" ? curriedTransparentize$1(0.25, theme.color.defaultText) : curriedTransparentize$1(0.3, theme.color.defaultText), border: "none", display: "inline-block" }));
|
||
var FlexWrapper = newStyled.span(({ theme }) => ({ display: "flex", lineHeight: "20px", alignItems: "center" }));
|
||
var Section = newStyled.td(({ theme }) => ({ position: "relative", letterSpacing: "0.35em", textTransform: "uppercase", fontWeight: theme.typography.weight.bold, fontSize: theme.typography.size.s1 - 1, color: theme.base === "light" ? curriedTransparentize$1(0.4, theme.color.defaultText) : curriedTransparentize$1(0.6, theme.color.defaultText), background: `${theme.background.app} !important`, "& ~ td": { background: `${theme.background.app} !important` } }));
|
||
var Subsection = newStyled.td(({ theme }) => ({ position: "relative", fontWeight: theme.typography.weight.bold, fontSize: theme.typography.size.s2 - 1, background: theme.background.app }));
|
||
var StyledTd2 = newStyled.td(() => ({ position: "relative" }));
|
||
var StyledTr = newStyled.tr(({ theme }) => ({ "&:hover > td": { backgroundColor: `${curriedLighten$1(5e-3, theme.background.app)} !important`, boxShadow: `${theme.color.mediumlight} 0 - 1px 0 0 inset`, cursor: "row-resize" } }));
|
||
var ClickIntercept = newStyled.button(() => ({ background: "none", border: "none", padding: "0", font: "inherit", position: "absolute", top: 0, bottom: 0, left: 0, right: 0, height: "100%", width: "100%", color: "transparent", cursor: "row-resize !important" }));
|
||
var SectionRow = ({ level = "section", label, children, initialExpanded = true, colSpan = 3 }) => {
|
||
let [expanded, setExpanded] = (0, import_react.useState)(initialExpanded), Level = level === "subsection" ? Subsection : Section, itemCount = (children == null ? void 0 : children.length) || 0, caption = level === "subsection" ? `${itemCount} item${itemCount !== 1 ? "s" : ""}` : "", icon = expanded ? "arrowdown" : "arrowright", helperText = `${expanded ? "Hide" : "Show"} ${level === "subsection" ? itemCount : label} item${itemCount !== 1 ? "s" : ""}`;
|
||
return import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(StyledTr, { title: helperText }, import_react.default.createElement(Level, { colSpan: 1 }, import_react.default.createElement(ClickIntercept, { onClick: (e) => setExpanded(!expanded), tabIndex: 0 }, helperText), import_react.default.createElement(FlexWrapper, null, import_react.default.createElement(ExpanderIcon, { icon }), label)), import_react.default.createElement(StyledTd2, { colSpan: colSpan - 1 }, import_react.default.createElement(ClickIntercept, { onClick: (e) => setExpanded(!expanded), tabIndex: -1, style: { outline: "none" } }, helperText), expanded ? null : caption)), expanded ? children : null);
|
||
};
|
||
var Row = newStyled.div(({ theme }) => ({ display: "flex", gap: 16, borderBottom: `1px solid ${theme.appBorderColor}`, "&:last-child": { borderBottom: 0 } }));
|
||
var Column = newStyled.div(({ numColumn }) => ({ display: "flex", flexDirection: "column", flex: numColumn || 1, gap: 5, padding: "12px 20px" }));
|
||
var SkeletonText = newStyled.div(({ theme, width, height }) => ({ animation: `${theme.animation.glow} 1.5s ease-in-out infinite`, background: theme.appBorderColor, width: width || "100%", height: height || 16, borderRadius: 3 }));
|
||
var columnWidth = [2, 4, 2, 2];
|
||
var Skeleton = () => import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(Row, null, import_react.default.createElement(Column, { numColumn: columnWidth[0] }, import_react.default.createElement(SkeletonText, { width: "60%" })), import_react.default.createElement(Column, { numColumn: columnWidth[1] }, import_react.default.createElement(SkeletonText, { width: "30%" })), import_react.default.createElement(Column, { numColumn: columnWidth[2] }, import_react.default.createElement(SkeletonText, { width: "60%" })), import_react.default.createElement(Column, { numColumn: columnWidth[3] }, import_react.default.createElement(SkeletonText, { width: "60%" }))), import_react.default.createElement(Row, null, import_react.default.createElement(Column, { numColumn: columnWidth[0] }, import_react.default.createElement(SkeletonText, { width: "60%" })), import_react.default.createElement(Column, { numColumn: columnWidth[1] }, import_react.default.createElement(SkeletonText, { width: "80%" }), import_react.default.createElement(SkeletonText, { width: "30%" })), import_react.default.createElement(Column, { numColumn: columnWidth[2] }, import_react.default.createElement(SkeletonText, { width: "60%" })), import_react.default.createElement(Column, { numColumn: columnWidth[3] }, import_react.default.createElement(SkeletonText, { width: "60%" }))), import_react.default.createElement(Row, null, import_react.default.createElement(Column, { numColumn: columnWidth[0] }, import_react.default.createElement(SkeletonText, { width: "60%" })), import_react.default.createElement(Column, { numColumn: columnWidth[1] }, import_react.default.createElement(SkeletonText, { width: "80%" }), import_react.default.createElement(SkeletonText, { width: "30%" })), import_react.default.createElement(Column, { numColumn: columnWidth[2] }, import_react.default.createElement(SkeletonText, { width: "60%" })), import_react.default.createElement(Column, { numColumn: columnWidth[3] }, import_react.default.createElement(SkeletonText, { width: "60%" }))), import_react.default.createElement(Row, null, import_react.default.createElement(Column, { numColumn: columnWidth[0] }, import_react.default.createElement(SkeletonText, { width: "60%" })), import_react.default.createElement(Column, { numColumn: columnWidth[1] }, import_react.default.createElement(SkeletonText, { width: "80%" }), import_react.default.createElement(SkeletonText, { width: "30%" })), import_react.default.createElement(Column, { numColumn: columnWidth[2] }, import_react.default.createElement(SkeletonText, { width: "60%" })), import_react.default.createElement(Column, { numColumn: columnWidth[3] }, import_react.default.createElement(SkeletonText, { width: "60%" }))));
|
||
var Wrapper7 = newStyled.div(({ inAddonPanel, theme }) => ({ height: inAddonPanel ? "100%" : "auto", display: "flex", border: inAddonPanel ? "none" : `1px solid ${theme.appBorderColor}`, borderRadius: inAddonPanel ? 0 : theme.appBorderRadius, padding: inAddonPanel ? 0 : 40, alignItems: "center", justifyContent: "center", flexDirection: "column", gap: 15, background: theme.background.content, boxShadow: "rgba(0, 0, 0, 0.10) 0 1px 3px 0" }));
|
||
var Content = newStyled.div({ display: "flex", flexDirection: "column", gap: 4, maxWidth: 415 });
|
||
var Title2 = newStyled.div(({ theme }) => ({ fontWeight: theme.typography.weight.bold, fontSize: theme.typography.size.s2 - 1, textAlign: "center", color: theme.textColor }));
|
||
var Description2 = newStyled.div(({ theme }) => ({ fontWeight: theme.typography.weight.regular, fontSize: theme.typography.size.s2 - 1, textAlign: "center", color: theme.textMutedColor }));
|
||
var Links = newStyled.div(({ theme }) => ({ display: "flex", fontSize: theme.typography.size.s2 - 1, gap: 25 }));
|
||
var Divider = newStyled.div(({ theme }) => ({ width: 1, height: 16, backgroundColor: theme.appBorderColor }));
|
||
var Empty = ({ inAddonPanel }) => {
|
||
let [isLoading, setIsLoading] = (0, import_react.useState)(true);
|
||
return (0, import_react.useEffect)(() => {
|
||
let load = setTimeout(() => {
|
||
setIsLoading(false);
|
||
}, 100);
|
||
return () => clearTimeout(load);
|
||
}, []), isLoading ? null : import_react.default.createElement(Wrapper7, { inAddonPanel }, import_react.default.createElement(Content, null, import_react.default.createElement(Title2, null, inAddonPanel ? "Interactive story playground" : "Args table with interactive controls couldn't be auto-generated"), import_react.default.createElement(Description2, null, "Controls give you an easy to use interface to test your components. Set your story args and you'll see controls appearing here automatically.")), import_react.default.createElement(Links, null, inAddonPanel && import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(Link2, { href: "https://youtu.be/0gOfS6K0x0E", target: "_blank", withArrow: true }, import_react.default.createElement(Icons, { icon: "video" }), " Watch 5m video"), import_react.default.createElement(Divider, null), import_react.default.createElement(Link2, { href: "https://storybook.js.org/docs/react/essentials/controls", target: "_blank", withArrow: true }, "Read docs")), !inAddonPanel && import_react.default.createElement(Link2, { href: "https://storybook.js.org/docs/react/essentials/controls", target: "_blank", withArrow: true }, "Learn how to set that up")));
|
||
};
|
||
var TableWrapper = newStyled.table(({ theme, compact, inAddonPanel }) => ({ "&&": { borderSpacing: 0, color: theme.color.defaultText, "td, th": { padding: 0, border: "none", verticalAlign: "top", textOverflow: "ellipsis" }, fontSize: theme.typography.size.s2 - 1, lineHeight: "20px", textAlign: "left", width: "100%", marginTop: inAddonPanel ? 0 : 25, marginBottom: inAddonPanel ? 0 : 40, "thead th:first-of-type, td:first-of-type": { width: "25%" }, "th:first-of-type, td:first-of-type": { paddingLeft: 20 }, "th:nth-of-type(2), td:nth-of-type(2)": { ...compact ? null : { width: "35%" } }, "td:nth-of-type(3)": { ...compact ? null : { width: "15%" } }, "th:last-of-type, td:last-of-type": { paddingRight: 20, ...compact ? null : { width: "25%" } }, th: { color: theme.base === "light" ? curriedTransparentize$1(0.25, theme.color.defaultText) : curriedTransparentize$1(0.45, theme.color.defaultText), paddingTop: 10, paddingBottom: 10, paddingLeft: 15, paddingRight: 15 }, td: { paddingTop: "10px", paddingBottom: "10px", "&:not(:first-of-type)": { paddingLeft: 15, paddingRight: 15 }, "&:last-of-type": { paddingRight: 20 } }, marginLeft: inAddonPanel ? 0 : 1, marginRight: inAddonPanel ? 0 : 1, tbody: { ...inAddonPanel ? null : { filter: theme.base === "light" ? "drop-shadow(0px 1px 3px rgba(0, 0, 0, 0.10))" : "drop-shadow(0px 1px 3px rgba(0, 0, 0, 0.20))" }, "> tr > *": { background: theme.background.content, borderTop: `1px solid ${theme.appBorderColor}` }, ...inAddonPanel ? null : { "> tr:first-of-type > *": { borderBlockStart: `1px solid ${theme.appBorderColor}` }, "> tr:last-of-type > *": { borderBlockEnd: `1px solid ${theme.appBorderColor}` }, "> tr > *:first-of-type": { borderInlineStart: `1px solid ${theme.appBorderColor}` }, "> tr > *:last-of-type": { borderInlineEnd: `1px solid ${theme.appBorderColor}` }, "> tr:first-of-type > td:first-of-type": { borderTopLeftRadius: theme.appBorderRadius }, "> tr:first-of-type > td:last-of-type": { borderTopRightRadius: theme.appBorderRadius }, "> tr:last-of-type > td:first-of-type": { borderBottomLeftRadius: theme.appBorderRadius }, "> tr:last-of-type > td:last-of-type": { borderBottomRightRadius: theme.appBorderRadius } } } } }));
|
||
var StyledIconButton = newStyled(IconButton)(({ theme }) => ({ color: theme.barTextColor, margin: "-4px -12px -4px 0" }));
|
||
var ControlHeadingWrapper = newStyled.span({ display: "flex", justifyContent: "space-between" });
|
||
var sortFns = { alpha: (a, b) => a.name.localeCompare(b.name), requiredFirst: (a, b) => {
|
||
var _a, _b;
|
||
return +!!((_a = b.type) == null ? void 0 : _a.required) - +!!((_b = a.type) == null ? void 0 : _b.required) || a.name.localeCompare(b.name);
|
||
}, none: void 0 };
|
||
var groupRows = (rows, sort) => {
|
||
let sections = { ungrouped: [], ungroupedSubsections: {}, sections: {} };
|
||
if (!rows)
|
||
return sections;
|
||
Object.entries(rows).forEach(([key, row]) => {
|
||
let { category, subcategory } = (row == null ? void 0 : row.table) || {};
|
||
if (category) {
|
||
let section = sections.sections[category] || { ungrouped: [], subsections: {} };
|
||
if (!subcategory)
|
||
section.ungrouped.push({ key, ...row });
|
||
else {
|
||
let subsection = section.subsections[subcategory] || [];
|
||
subsection.push({ key, ...row }), section.subsections[subcategory] = subsection;
|
||
}
|
||
sections.sections[category] = section;
|
||
} else if (subcategory) {
|
||
let subsection = sections.ungroupedSubsections[subcategory] || [];
|
||
subsection.push({ key, ...row }), sections.ungroupedSubsections[subcategory] = subsection;
|
||
} else
|
||
sections.ungrouped.push({ key, ...row });
|
||
});
|
||
let sortFn = sortFns[sort], sortSubsection = (record) => sortFn ? Object.keys(record).reduce((acc, cur) => ({ ...acc, [cur]: record[cur].sort(sortFn) }), {}) : record;
|
||
return { ungrouped: sections.ungrouped.sort(sortFn), ungroupedSubsections: sortSubsection(sections.ungroupedSubsections), sections: Object.keys(sections.sections).reduce((acc, cur) => ({ ...acc, [cur]: { ungrouped: sections.sections[cur].ungrouped.sort(sortFn), subsections: sortSubsection(sections.sections[cur].subsections) } }), {}) };
|
||
};
|
||
var safeIncludeConditionalArg = (row, args, globals) => {
|
||
try {
|
||
return v(row, args, globals);
|
||
} catch (err) {
|
||
return import_client_logger.once.warn(err.message), false;
|
||
}
|
||
};
|
||
var ArgsTable = (props) => {
|
||
let { updateArgs, resetArgs, compact, inAddonPanel, initialExpandedArgs, sort = "none", isLoading } = props;
|
||
if ("error" in props) {
|
||
let { error } = props;
|
||
return import_react.default.createElement(EmptyBlock, null, error, " ", import_react.default.createElement(Link2, { href: "http://storybook.js.org/docs/", target: "_blank", withArrow: true }, "Read the docs"));
|
||
}
|
||
if (isLoading)
|
||
return import_react.default.createElement(Skeleton, null);
|
||
let { rows, args, globals } = "rows" in props && props, groups = groupRows((0, import_pickBy.default)(rows, (row) => {
|
||
var _a;
|
||
return !((_a = row == null ? void 0 : row.table) == null ? void 0 : _a.disable) && safeIncludeConditionalArg(row, args || {}, globals || {});
|
||
}), sort), hasNoUngrouped = groups.ungrouped.length === 0, hasNoSections = Object.entries(groups.sections).length === 0, hasNoUngroupedSubsections = Object.entries(groups.ungroupedSubsections).length === 0;
|
||
if (hasNoUngrouped && hasNoSections && hasNoUngroupedSubsections)
|
||
return import_react.default.createElement(Empty, { inAddonPanel });
|
||
let colSpan = 1;
|
||
updateArgs && (colSpan += 1), compact || (colSpan += 2);
|
||
let expandable = Object.keys(groups.sections).length > 0, common = { updateArgs, compact, inAddonPanel, initialExpandedArgs };
|
||
return import_react.default.createElement(ResetWrapper, null, import_react.default.createElement(TableWrapper, { compact, inAddonPanel, className: "docblock-argstable sb-unstyled" }, import_react.default.createElement("thead", { className: "docblock-argstable-head" }, import_react.default.createElement("tr", null, import_react.default.createElement("th", null, import_react.default.createElement("span", null, "Name")), compact ? null : import_react.default.createElement("th", null, import_react.default.createElement("span", null, "Description")), compact ? null : import_react.default.createElement("th", null, import_react.default.createElement("span", null, "Default")), updateArgs ? import_react.default.createElement("th", null, import_react.default.createElement(ControlHeadingWrapper, null, "Control", " ", !isLoading && resetArgs && import_react.default.createElement(StyledIconButton, { onClick: () => resetArgs(), title: "Reset controls" }, import_react.default.createElement(Icons, { icon: "undo", "aria-hidden": true })))) : null)), import_react.default.createElement("tbody", { className: "docblock-argstable-body" }, groups.ungrouped.map((row) => import_react.default.createElement(ArgRow, { key: row.key, row, arg: args && args[row.key], ...common })), Object.entries(groups.ungroupedSubsections).map(([subcategory, subsection]) => import_react.default.createElement(SectionRow, { key: subcategory, label: subcategory, level: "subsection", colSpan }, subsection.map((row) => import_react.default.createElement(ArgRow, { key: row.key, row, arg: args && args[row.key], expandable, ...common })))), Object.entries(groups.sections).map(([category, section]) => import_react.default.createElement(SectionRow, { key: category, label: category, level: "section", colSpan }, section.ungrouped.map((row) => import_react.default.createElement(ArgRow, { key: row.key, row, arg: args && args[row.key], ...common })), Object.entries(section.subsections).map(([subcategory, subsection]) => import_react.default.createElement(SectionRow, { key: subcategory, label: subcategory, level: "subsection", colSpan }, subsection.map((row) => import_react.default.createElement(ArgRow, { key: row.key, row, arg: args && args[row.key], expandable, ...common })))))))));
|
||
};
|
||
var TabbedArgsTable = ({ tabs, ...props }) => {
|
||
let entries = Object.entries(tabs);
|
||
return entries.length === 1 ? import_react.default.createElement(ArgsTable, { ...entries[0][1], ...props }) : import_react.default.createElement(TabsState, null, entries.map((entry) => {
|
||
let [label, table] = entry, id = `prop_table_div_${label}`;
|
||
return import_react.default.createElement("div", { key: id, id, title: label }, ({ active }) => active ? import_react.default.createElement(ArgsTable, { key: `prop_table_${label}`, ...table, ...props }) : null);
|
||
}));
|
||
};
|
||
var Label4 = newStyled.div(({ theme }) => ({ marginRight: 30, fontSize: `${theme.typography.size.s1}px`, color: theme.base === "light" ? curriedTransparentize$1(0.4, theme.color.defaultText) : curriedTransparentize$1(0.6, theme.color.defaultText) }));
|
||
var Sample = newStyled.div({ overflow: "hidden", whiteSpace: "nowrap", textOverflow: "ellipsis" });
|
||
var TypeSpecimen = newStyled.div({ display: "flex", flexDirection: "row", alignItems: "baseline", "&:not(:last-child)": { marginBottom: "1rem" } });
|
||
var Wrapper8 = newStyled.div(withReset, ({ theme }) => ({ ...getBlockBackgroundStyle(theme), margin: "25px 0 40px", padding: "30px 20px" }));
|
||
var Typeset = ({ fontFamily, fontSizes, fontWeight, sampleText, ...props }) => import_react.default.createElement(Wrapper8, { ...props, className: "docblock-typeset sb-unstyled" }, fontSizes.map((size) => import_react.default.createElement(TypeSpecimen, { key: size }, import_react.default.createElement(Label4, null, size), import_react.default.createElement(Sample, { style: { fontFamily, fontSize: size, fontWeight, lineHeight: 1.2 } }, sampleText || "Was he a beast if music could move him so?"))));
|
||
var ItemTitle = newStyled.div(({ theme }) => ({ fontWeight: theme.typography.weight.bold, color: theme.color.defaultText }));
|
||
var ItemSubtitle = newStyled.div(({ theme }) => ({ color: theme.base === "light" ? curriedTransparentize$1(0.2, theme.color.defaultText) : curriedTransparentize$1(0.6, theme.color.defaultText) }));
|
||
var ItemDescription = newStyled.div({ flex: "0 0 30%", lineHeight: "20px", marginTop: 5 });
|
||
var SwatchLabel = newStyled.div(({ theme }) => ({ flex: 1, textAlign: "center", fontFamily: theme.typography.fonts.mono, fontSize: theme.typography.size.s1, lineHeight: 1, overflow: "hidden", color: theme.base === "light" ? curriedTransparentize$1(0.4, theme.color.defaultText) : curriedTransparentize$1(0.6, theme.color.defaultText), "> div": { display: "inline-block", overflow: "hidden", maxWidth: "100%", textOverflow: "ellipsis" }, span: { display: "block", marginTop: 2 } }));
|
||
var SwatchLabels = newStyled.div({ display: "flex", flexDirection: "row" });
|
||
var Swatch = newStyled.div(({ background }) => ({ position: "relative", flex: 1, "&::before": { position: "absolute", top: 0, left: 0, width: "100%", height: "100%", background, content: '""' } }));
|
||
var SwatchColors = newStyled.div(({ theme }) => ({ ...getBlockBackgroundStyle(theme), display: "flex", flexDirection: "row", height: 50, marginBottom: 5, overflow: "hidden", backgroundColor: "white", backgroundImage: "repeating-linear-gradient(-45deg, #ccc, #ccc 1px, #fff 1px, #fff 16px)", backgroundClip: "padding-box" }));
|
||
var SwatchSpecimen = newStyled.div({ display: "flex", flexDirection: "column", flex: 1, position: "relative", marginBottom: 30 });
|
||
var Swatches = newStyled.div({ flex: 1, display: "flex", flexDirection: "row" });
|
||
var Item = newStyled.div({ display: "flex", alignItems: "flex-start" });
|
||
var ListName = newStyled.div({ flex: "0 0 30%" });
|
||
var ListSwatches = newStyled.div({ flex: 1 });
|
||
var ListHeading = newStyled.div(({ theme }) => ({ display: "flex", flexDirection: "row", alignItems: "center", paddingBottom: 20, fontWeight: theme.typography.weight.bold, color: theme.base === "light" ? curriedTransparentize$1(0.4, theme.color.defaultText) : curriedTransparentize$1(0.6, theme.color.defaultText) }));
|
||
var List = newStyled.div(({ theme }) => ({ fontSize: theme.typography.size.s2, lineHeight: "20px", display: "flex", flexDirection: "column" }));
|
||
function renderSwatch(color, index) {
|
||
return import_react.default.createElement(Swatch, { key: `${color}-${index}`, title: color, background: color });
|
||
}
|
||
function renderSwatchLabel(color, index, colorDescription) {
|
||
return import_react.default.createElement(SwatchLabel, { key: `${color}-${index}`, title: color }, import_react.default.createElement("div", null, color, colorDescription && import_react.default.createElement("span", null, colorDescription)));
|
||
}
|
||
function renderSwatchSpecimen(colors) {
|
||
return Array.isArray(colors) ? import_react.default.createElement(SwatchSpecimen, null, import_react.default.createElement(SwatchColors, null, colors.map((color, index) => renderSwatch(color, index))), import_react.default.createElement(SwatchLabels, null, colors.map((color, index) => renderSwatchLabel(color, index)))) : import_react.default.createElement(SwatchSpecimen, null, import_react.default.createElement(SwatchColors, null, Object.values(colors).map((color, index) => renderSwatch(color, index))), import_react.default.createElement(SwatchLabels, null, Object.keys(colors).map((color, index) => renderSwatchLabel(color, index, colors[color]))));
|
||
}
|
||
var ColorItem = ({ title, subtitle, colors }) => import_react.default.createElement(Item, null, import_react.default.createElement(ItemDescription, null, import_react.default.createElement(ItemTitle, null, title), import_react.default.createElement(ItemSubtitle, null, subtitle)), import_react.default.createElement(Swatches, null, renderSwatchSpecimen(colors)));
|
||
var ColorPalette = ({ children, ...props }) => import_react.default.createElement(ResetWrapper, null, import_react.default.createElement(List, { ...props, className: "docblock-colorpalette sb-unstyled" }, import_react.default.createElement(ListHeading, null, import_react.default.createElement(ListName, null, "Name"), import_react.default.createElement(ListSwatches, null, "Swatches")), children));
|
||
var ItemLabel = newStyled.div(({ theme }) => ({ fontFamily: theme.typography.fonts.base, fontSize: theme.typography.size.s2, color: theme.color.defaultText, marginLeft: 10, lineHeight: 1.2 }));
|
||
var ItemSpecimen = newStyled.div(({ theme }) => ({ ...getBlockBackgroundStyle(theme), overflow: "hidden", height: 40, width: 40, display: "flex", alignItems: "center", justifyContent: "center", flex: "none", "> img, > svg": { width: 20, height: 20 } }));
|
||
var Item2 = newStyled.div({ display: "inline-flex", flexDirection: "row", alignItems: "center", flex: "0 1 calc(20% - 10px)", minWidth: 120, margin: "0px 10px 30px 0" });
|
||
var List2 = newStyled.div({ display: "flex", flexFlow: "row wrap" });
|
||
var IconItem = ({ name, children }) => import_react.default.createElement(Item2, null, import_react.default.createElement(ItemSpecimen, null, children), import_react.default.createElement(ItemLabel, null, name));
|
||
var IconGallery = ({ children, ...props }) => import_react.default.createElement(ResetWrapper, null, import_react.default.createElement(List2, { ...props, className: "docblock-icongallery sb-unstyled" }, children));
|
||
var anchorBlockIdFromId = (storyId) => `anchor--${storyId}`;
|
||
var Anchor = ({ storyId, children }) => import_react.default.createElement("div", { id: anchorBlockIdFromId(storyId), className: "sb-anchor" }, children);
|
||
import_global.global && import_global.global.__DOCS_CONTEXT__ === void 0 && (import_global.global.__DOCS_CONTEXT__ = (0, import_react.createContext)(null), import_global.global.__DOCS_CONTEXT__.displayName = "DocsContext");
|
||
var DocsContext = import_global.global ? import_global.global.__DOCS_CONTEXT__ : (0, import_react.createContext)(null);
|
||
var useOf = (moduleExportOrType, validTypes) => (0, import_react.useContext)(DocsContext).resolveOf(moduleExportOrType, validTypes);
|
||
function extractComponentArgTypes(component, parameters) {
|
||
let { extractArgTypes } = parameters.docs || {};
|
||
if (!extractArgTypes)
|
||
throw new Error("Args unsupported. See Args documentation for your framework.");
|
||
return extractArgTypes(component);
|
||
}
|
||
function getArgTypesFromResolved(resolved, props) {
|
||
if (resolved.type === "component") {
|
||
let { component, projectAnnotations: { parameters: parameters2 } } = resolved;
|
||
return { argTypes: extractComponentArgTypes(component, parameters2), parameters: parameters2 };
|
||
}
|
||
if (resolved.type === "meta") {
|
||
let { preparedMeta: { argTypes: argTypes2, parameters: parameters2 } } = resolved;
|
||
return { argTypes: argTypes2, parameters: parameters2 };
|
||
}
|
||
let { story: { argTypes, parameters } } = resolved;
|
||
return { argTypes, parameters };
|
||
}
|
||
var ArgTypes = (props) => {
|
||
var _a;
|
||
let { of } = props;
|
||
if ("of" in props && of === void 0)
|
||
throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");
|
||
let resolved = useOf(of || "meta"), { argTypes, parameters } = getArgTypesFromResolved(resolved), argTypesParameters = ((_a = parameters.docs) == null ? void 0 : _a.argTypes) || {}, include = props.include ?? argTypesParameters.include, exclude = props.exclude ?? argTypesParameters.exclude, sort = props.sort ?? argTypesParameters.sort, filteredArgTypes = (0, import_preview_api.filterArgTypes)(argTypes, include, exclude);
|
||
return import_react.default.createElement(ArgsTable, { rows: filteredArgTypes, sort });
|
||
};
|
||
var PRIMARY_STORY = "^";
|
||
var titleCase = (str2) => str2.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
|
||
var getComponentName = (component) => {
|
||
if (component)
|
||
return typeof component == "string" ? component.includes("-") ? titleCase(component) : component : component.__docgenInfo && component.__docgenInfo.displayName ? component.__docgenInfo.displayName : component.name;
|
||
};
|
||
function scrollToElement(element, block = "start") {
|
||
element.scrollIntoView({ behavior: "smooth", block, inline: "nearest" });
|
||
}
|
||
function useStory(storyId, context) {
|
||
let stories = useStories([storyId], context);
|
||
return stories && stories[0];
|
||
}
|
||
function useStories(storyIds, context) {
|
||
let [storiesById, setStories] = (0, import_react.useState)({});
|
||
return (0, import_react.useEffect)(() => {
|
||
Promise.all(storyIds.map(async (storyId) => {
|
||
let story = await context.loadStory(storyId);
|
||
setStories((current) => current[storyId] === story ? current : { ...current, [storyId]: story });
|
||
}));
|
||
}), storyIds.map((storyId) => {
|
||
if (storiesById[storyId])
|
||
return storiesById[storyId];
|
||
try {
|
||
return context.storyById(storyId);
|
||
} catch {
|
||
return null;
|
||
}
|
||
});
|
||
}
|
||
var useArgs = (storyId, context) => {
|
||
let storyContext = context.getStoryContext(context.storyById()), [args, setArgs] = (0, import_react.useState)(storyContext.args);
|
||
(0, import_react.useEffect)(() => {
|
||
let cb = (changed) => {
|
||
changed.storyId === storyId && setArgs(changed.args);
|
||
};
|
||
return context.channel.on(import_core_events.STORY_ARGS_UPDATED, cb), () => context.channel.off(import_core_events.STORY_ARGS_UPDATED, cb);
|
||
}, [storyId]);
|
||
let updateArgs = (0, import_react.useCallback)((updatedArgs) => context.channel.emit(import_core_events.UPDATE_STORY_ARGS, { storyId, updatedArgs }), [storyId]), resetArgs = (0, import_react.useCallback)((argNames) => context.channel.emit(import_core_events.RESET_STORY_ARGS, { storyId, argNames }), [storyId]);
|
||
return [args, updateArgs, resetArgs];
|
||
};
|
||
var useGlobals = (context) => {
|
||
let storyContext = context.getStoryContext(context.storyById()), [globals, setGlobals] = (0, import_react.useState)(storyContext.globals);
|
||
return (0, import_react.useEffect)(() => {
|
||
let cb = (changed) => {
|
||
setGlobals(changed.globals);
|
||
};
|
||
return context.channel.on(import_core_events.GLOBALS_UPDATED, cb), () => context.channel.off(import_core_events.GLOBALS_UPDATED, cb);
|
||
}, []), [globals];
|
||
};
|
||
var extractComponentArgTypes2 = (component, parameters, include, exclude) => {
|
||
let { extractArgTypes } = parameters.docs || {};
|
||
if (!extractArgTypes)
|
||
throw new Error("Args unsupported. See Args documentation for your framework.");
|
||
let argTypes = extractArgTypes(component);
|
||
return argTypes = (0, import_preview_api.filterArgTypes)(argTypes, include, exclude), argTypes;
|
||
};
|
||
var isShortcut = (value2) => value2 && [PRIMARY_STORY].includes(value2);
|
||
var getComponent = (props = {}, component) => {
|
||
let { of } = props, { story } = props;
|
||
if (isShortcut(of) || isShortcut(story))
|
||
return component || null;
|
||
if (!of)
|
||
throw new Error("No component found.");
|
||
return of;
|
||
};
|
||
var addComponentTabs = (tabs, components22, parameters, include, exclude, sort) => ({ ...tabs, ...(0, import_mapValues.default)(components22, (comp) => ({ rows: extractComponentArgTypes2(comp, parameters, include, exclude), sort })) });
|
||
var StoryTable = (props) => {
|
||
let context = (0, import_react.useContext)(DocsContext), { story: storyName, component, subcomponents, showComponent, include, exclude, sort } = props;
|
||
try {
|
||
let storyId;
|
||
switch (storyName) {
|
||
case PRIMARY_STORY: {
|
||
storyId = context.storyById().id;
|
||
break;
|
||
}
|
||
default:
|
||
storyId = context.storyIdByName(storyName);
|
||
}
|
||
let story = useStory(storyId, context), [args, updateArgs, resetArgs] = useArgs(storyId, context), [globals] = useGlobals(context);
|
||
if (!story)
|
||
return import_react.default.createElement(ArgsTable, { isLoading: true, updateArgs, resetArgs });
|
||
let argTypes = (0, import_preview_api.filterArgTypes)(story.argTypes, include, exclude), mainLabel = getComponentName(component) || "Story", tabs = { [mainLabel]: { rows: argTypes, args, globals, updateArgs, resetArgs } }, storyHasArgsWithControls = argTypes && Object.values(argTypes).find((v2) => !!(v2 == null ? void 0 : v2.control));
|
||
if (storyHasArgsWithControls || (updateArgs = null, resetArgs = null, tabs = {}), component && (!storyHasArgsWithControls || showComponent) && (tabs = addComponentTabs(tabs, { [mainLabel]: component }, story.parameters, include, exclude)), subcomponents) {
|
||
if (Array.isArray(subcomponents))
|
||
throw new Error("Unexpected subcomponents array. Expected an object whose keys are tab labels and whose values are components.");
|
||
tabs = addComponentTabs(tabs, subcomponents, story.parameters, include, exclude);
|
||
}
|
||
return import_react.default.createElement(TabbedArgsTable, { tabs, sort });
|
||
} catch (err) {
|
||
return import_react.default.createElement(ArgsTable, { error: err.message });
|
||
}
|
||
};
|
||
var ComponentsTable = (props) => {
|
||
let { components: components22, include, exclude, sort, parameters } = props, tabs = addComponentTabs({}, components22, parameters, include, exclude);
|
||
return import_react.default.createElement(TabbedArgsTable, { tabs, sort });
|
||
};
|
||
var ArgsTable2 = (props) => {
|
||
var _a;
|
||
(0, import_client_logger.deprecate)(esm_default`The ArgsTable doc block is deprecated. Instead use the ArgTypes doc block for static tables or the Controls doc block for tables with controls.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#argstable-block
|
||
`);
|
||
let context = (0, import_react.useContext)(DocsContext), parameters, component, subcomponents;
|
||
try {
|
||
({ parameters, component, subcomponents } = context.storyById());
|
||
} catch {
|
||
let { of } = props;
|
||
if ("of" in props && of === void 0)
|
||
throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");
|
||
({ projectAnnotations: { parameters } } = context.resolveOf(of, ["component"]));
|
||
}
|
||
let { include, exclude, components: components22, sort: sortProp } = props, { story: storyName } = props, sort = sortProp || ((_a = parameters.controls) == null ? void 0 : _a.sort), main = getComponent(props, component);
|
||
if (storyName)
|
||
return import_react.default.createElement(StoryTable, { ...props, component: main, subcomponents, sort });
|
||
if (!components22 && !subcomponents) {
|
||
let mainProps;
|
||
try {
|
||
mainProps = { rows: extractComponentArgTypes2(main, parameters, include, exclude) };
|
||
} catch (err) {
|
||
mainProps = { error: err.message };
|
||
}
|
||
return import_react.default.createElement(ArgsTable, { ...mainProps, sort });
|
||
}
|
||
if (components22)
|
||
return import_react.default.createElement(ComponentsTable, { ...props, components: components22, sort, parameters });
|
||
let mainLabel = getComponentName(main);
|
||
return import_react.default.createElement(ComponentsTable, { ...props, components: { [mainLabel]: main, ...subcomponents }, sort, parameters });
|
||
};
|
||
ArgsTable2.defaultProps = { of: PRIMARY_STORY };
|
||
function argsHash(args) {
|
||
return stringify(args);
|
||
}
|
||
var SourceContext = (0, import_react.createContext)({ sources: {} });
|
||
var UNKNOWN_ARGS_HASH = "--unknown--";
|
||
var SourceContainer = ({ children, channel }) => {
|
||
let [sources, setSources] = (0, import_react.useState)({});
|
||
return (0, import_react.useEffect)(() => {
|
||
let handleSnippetRendered = (idOrEvent, inputSource = null, inputFormat = false) => {
|
||
let { id, args = void 0, source, format: format2 } = typeof idOrEvent == "string" ? { id: idOrEvent, source: inputSource, format: inputFormat } : idOrEvent, hash = args ? argsHash(args) : UNKNOWN_ARGS_HASH;
|
||
setSources((current) => ({ ...current, [id]: { ...current[id], [hash]: { code: source, format: format2 } } }));
|
||
};
|
||
return channel.on(SNIPPET_RENDERED, handleSnippetRendered), () => channel.off(SNIPPET_RENDERED, handleSnippetRendered);
|
||
}, []), import_react.default.createElement(SourceContext.Provider, { value: { sources } }, children);
|
||
};
|
||
var SourceState = ((SourceState2) => (SourceState2.OPEN = "open", SourceState2.CLOSED = "closed", SourceState2.NONE = "none", SourceState2))(SourceState || {});
|
||
var getSourceState = (stories) => {
|
||
let states = stories.map((story) => {
|
||
var _a, _b;
|
||
return (_b = (_a = story.parameters.docs) == null ? void 0 : _a.source) == null ? void 0 : _b.state;
|
||
}).filter(Boolean);
|
||
return states.length === 0 ? "closed" : states[0];
|
||
};
|
||
var getStorySource = (storyId, args, sourceContext) => {
|
||
let { sources } = sourceContext, sourceMap = sources == null ? void 0 : sources[storyId];
|
||
return (sourceMap == null ? void 0 : sourceMap[argsHash(args)]) || (sourceMap == null ? void 0 : sourceMap[UNKNOWN_ARGS_HASH]) || { code: "" };
|
||
};
|
||
var getSnippet = ({ snippet, storyContext, typeFromProps, transformFromProps }) => {
|
||
var _a, _b, _c, _d, _e, _f;
|
||
let { __isArgsStory: isArgsStory } = storyContext.parameters, sourceParameters = ((_a = storyContext.parameters.docs) == null ? void 0 : _a.source) || {}, type = typeFromProps || sourceParameters.type || SourceType.AUTO;
|
||
if (sourceParameters.code !== void 0)
|
||
return sourceParameters.code;
|
||
let code = type === SourceType.DYNAMIC || type === SourceType.AUTO && snippet && isArgsStory ? snippet : sourceParameters.originalSource || "";
|
||
return sourceParameters.transformSource && (0, import_client_logger.deprecate)(esm_default`The \`transformSource\` parameter at \`parameters.docs.source.transformSource\` is deprecated, please use \`parameters.docs.source.transform\` instead.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#source-block
|
||
`), ((_b = storyContext.parameters.docs) == null ? void 0 : _b.transformSource) && (0, import_client_logger.deprecate)(esm_default`The \`transformSource\` parameter at \`parameters.docs.transformSource\` is deprecated, please use \`parameters.docs.source.transform\` instead.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#source-block
|
||
`), ((_c = storyContext.parameters.jsx) == null ? void 0 : _c.transformSource) && (0, import_client_logger.deprecate)(esm_default`The \`transformSource\` parameter at \`parameters.jsx.transformSource\` is deprecated, please use \`parameters.docs.source.transform\` instead.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#source-block
|
||
`), ((_f = transformFromProps ?? sourceParameters.transform ?? sourceParameters.transformSource ?? ((_d = storyContext.parameters.docs) == null ? void 0 : _d.transformSource) ?? ((_e = storyContext.parameters.jsx) == null ? void 0 : _e.transformSource)) == null ? void 0 : _f(code, storyContext)) || code;
|
||
};
|
||
var useSourceProps = (props, docsContext, sourceContext) => {
|
||
var _a, _b, _c;
|
||
let storyIds = props.ids || (props.id ? [props.id] : []), storiesFromIds = useStories(storyIds, docsContext), stories = storiesFromIds, { of } = props;
|
||
if ("of" in props && of === void 0)
|
||
throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");
|
||
if (of)
|
||
stories = [docsContext.resolveOf(of, ["story"]).story];
|
||
else if (stories.length === 0)
|
||
try {
|
||
stories = [docsContext.storyById()];
|
||
} catch {
|
||
}
|
||
if (!storiesFromIds.every(Boolean))
|
||
return { error: "Oh no! The source is not available.", state: "none" };
|
||
let sourceParameters = ((_c = (_b = (_a = stories[0]) == null ? void 0 : _a.parameters) == null ? void 0 : _b.docs) == null ? void 0 : _c.source) || {}, { code } = props, format2 = props.format ?? sourceParameters.format, language = props.language ?? sourceParameters.language ?? "jsx", dark = props.dark ?? sourceParameters.dark ?? false;
|
||
code || (code = stories.map((story, index) => {
|
||
var _a2, _b2;
|
||
if (!story)
|
||
return "";
|
||
let storyContext = docsContext.getStoryContext(story), argsForSource = props.__forceInitialArgs ? storyContext.initialArgs : storyContext.unmappedArgs, source = getStorySource(story.id, argsForSource, sourceContext);
|
||
return index === 0 && (format2 = source.format ?? ((_b2 = (_a2 = story.parameters.docs) == null ? void 0 : _a2.source) == null ? void 0 : _b2.format) ?? false), getSnippet({ snippet: source.code, storyContext: { ...storyContext, args: argsForSource }, typeFromProps: props.type, transformFromProps: props.transform });
|
||
}).join(`
|
||
|
||
`));
|
||
let state = getSourceState(stories);
|
||
return code ? { code, format: format2, language, dark, state } : { error: "Oh no! The source is not available.", state };
|
||
};
|
||
var Source2 = (props) => {
|
||
props.id && (0, import_client_logger.deprecate)(esm_default`The \`id\` prop on Source is deprecated, please use the \`of\` prop instead to reference a story.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#source-block
|
||
`), props.ids && (0, import_client_logger.deprecate)(esm_default`The \`ids\` prop on Source is deprecated, please use the \`of\` prop instead to reference a story.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#source-block
|
||
`);
|
||
let sourceContext = (0, import_react.useContext)(SourceContext), docsContext = (0, import_react.useContext)(DocsContext), { state, ...sourceProps } = useSourceProps(props, docsContext, sourceContext);
|
||
return import_react.default.createElement(Source, { ...sourceProps });
|
||
};
|
||
var getStoryId2 = (props, context) => {
|
||
let { id, of, meta, story } = props;
|
||
if ("of" in props && of === void 0)
|
||
throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");
|
||
if (id)
|
||
return (0, import_client_logger.deprecate)(esm_default`Referencing stories by \`id\` is deprecated, please use \`of\` instead.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#story-block'`), id;
|
||
let { name } = props;
|
||
return name ? ((0, import_client_logger.deprecate)(esm_default`Referencing stories by \`name\` is deprecated, please use \`of\` instead.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#story-block'`), context.storyIdByName(name)) : (story && (0, import_client_logger.deprecate)(esm_default`The \`story\` prop is deprecated, please export your stories from CSF files and reference them with \`of={}\`.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#story-block'`), meta && context.referenceMeta(meta, false), context.resolveOf(of || story || "story", ["story"]).story.id);
|
||
};
|
||
var getStoryProps = (props, story, context) => {
|
||
let { parameters = {} } = story || {}, { docs = {} } = parameters, storyParameters = docs.story || {};
|
||
if (docs.disable)
|
||
return null;
|
||
let { inlineStories, iframeHeight } = docs;
|
||
typeof inlineStories < "u" && (0, import_client_logger.deprecate)(esm_default`The \`docs.inlineStories\` parameter is deprecated, use \`docs.story.inline\` instead.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#autodocs-changes'
|
||
`);
|
||
let inline = props.inline ?? storyParameters.inline ?? inlineStories ?? false;
|
||
if (typeof iframeHeight < "u" && (0, import_client_logger.deprecate)(esm_default`The \`docs.iframeHeight\` parameter is deprecated, use \`docs.story.iframeHeight\` instead.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#autodocs-changes'
|
||
`), inline) {
|
||
let height2 = props.height ?? storyParameters.height, autoplay = props.autoplay ?? storyParameters.autoplay ?? false;
|
||
return { story, inline: true, height: height2, autoplay, forceInitialArgs: !!props.__forceInitialArgs, primary: !!props.__primary, renderStoryToElement: context.renderStoryToElement };
|
||
}
|
||
let height = props.height ?? storyParameters.height ?? storyParameters.iframeHeight ?? iframeHeight ?? "100px";
|
||
return { story, inline: false, height, primary: !!props.__primary };
|
||
};
|
||
var Story2 = (props = { __forceInitialArgs: false, __primary: false }) => {
|
||
let context = (0, import_react.useContext)(DocsContext), storyId = getStoryId2(props, context), story = useStory(storyId, context);
|
||
if (!story)
|
||
return import_react.default.createElement(StorySkeleton, null);
|
||
let storyProps = getStoryProps(props, story, context);
|
||
return storyProps ? import_react.default.createElement(Story, { ...storyProps }) : null;
|
||
};
|
||
var useDeprecatedPreviewProps = ({ withSource, mdxSource, children, layout: layoutProp, ...props }, docsContext, sourceContext) => {
|
||
let storyIds = import_react.Children.toArray(children).filter((c) => c.props && (c.props.id || c.props.name || c.props.of)).map((c) => getStoryId2(c.props, docsContext)), stories = useStories(storyIds, docsContext), isLoading = stories.some((s) => !s), sourceProps = useSourceProps({ ...mdxSource ? { code: decodeURI(mdxSource) } : { ids: storyIds }, ...props.of && { of: props.of } }, docsContext, sourceContext);
|
||
if (withSource === "none")
|
||
return { isLoading, previewProps: props };
|
||
let layout = layoutProp;
|
||
return import_react.Children.forEach(children, (child) => {
|
||
var _a, _b;
|
||
layout || (layout = (_b = (_a = child == null ? void 0 : child.props) == null ? void 0 : _a.parameters) == null ? void 0 : _b.layout);
|
||
}), stories.forEach((story) => {
|
||
var _a, _b;
|
||
layout || !story || (layout = (story == null ? void 0 : story.parameters.layout) ?? ((_b = (_a = story.parameters.docs) == null ? void 0 : _a.canvas) == null ? void 0 : _b.layout));
|
||
}), { isLoading, previewProps: { ...props, layout: layout ?? "padded", withSource: sourceProps, isExpanded: (withSource || sourceProps.state) === "open" } };
|
||
};
|
||
var Canvas = (props) => {
|
||
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
||
let docsContext = (0, import_react.useContext)(DocsContext), sourceContext = (0, import_react.useContext)(SourceContext), { children, of, source } = props;
|
||
if ("of" in props && of === void 0)
|
||
throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");
|
||
let { isLoading, previewProps } = useDeprecatedPreviewProps(props, docsContext, sourceContext), story, sourceProps, hookError;
|
||
try {
|
||
({ story } = useOf(of || "story", ["story"]));
|
||
} catch (error) {
|
||
children || (hookError = error);
|
||
}
|
||
try {
|
||
sourceProps = useSourceProps({ ...source, ...of && { of } }, docsContext, sourceContext);
|
||
} catch (error) {
|
||
children || (hookError = error);
|
||
}
|
||
if (hookError)
|
||
throw hookError;
|
||
if (props.withSource && (0, import_client_logger.deprecate)(esm_default`Setting source state with \`withSource\` is deprecated, please use \`sourceState\` with 'hidden', 'shown' or 'none' instead.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#canvas-block
|
||
`), props.mdxSource && (0, import_client_logger.deprecate)(esm_default`Setting source code with \`mdxSource\` is deprecated, please use source={{code: '...'}} instead.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#canvas-block
|
||
`), (props.isColumn !== void 0 || props.columns !== void 0) && (0, import_client_logger.deprecate)(esm_default`\`isColumn\` and \`columns\` props are deprecated as the Canvas block now only supports showing a single story.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#canvas-block
|
||
`), children)
|
||
return (0, import_client_logger.deprecate)(esm_default`Passing children to Canvas is deprecated, please use the \`of\` prop instead to reference a story.
|
||
|
||
Please refer to the migration guide: https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#canvas-block
|
||
`), isLoading ? import_react.default.createElement(PreviewSkeleton, null) : import_react.default.createElement(Preview, { ...previewProps }, children);
|
||
let layout = props.layout ?? story.parameters.layout ?? ((_b = (_a = story.parameters.docs) == null ? void 0 : _a.canvas) == null ? void 0 : _b.layout) ?? "padded", withToolbar = props.withToolbar ?? ((_d = (_c = story.parameters.docs) == null ? void 0 : _c.canvas) == null ? void 0 : _d.withToolbar) ?? false, additionalActions = props.additionalActions ?? ((_f = (_e = story.parameters.docs) == null ? void 0 : _e.canvas) == null ? void 0 : _f.additionalActions), sourceState = props.sourceState ?? ((_h = (_g = story.parameters.docs) == null ? void 0 : _g.canvas) == null ? void 0 : _h.sourceState) ?? "hidden", className = props.className ?? ((_j = (_i = story.parameters.docs) == null ? void 0 : _i.canvas) == null ? void 0 : _j.className);
|
||
return import_react.default.createElement(Preview, { withSource: sourceState === "none" ? void 0 : sourceProps, isExpanded: sourceState === "shown", withToolbar, additionalActions, className, layout }, import_react.default.createElement(Story2, { of: of || story.moduleExport, meta: props.meta, ...props.story }));
|
||
};
|
||
var useGlobals2 = (story, context) => {
|
||
let storyContext = context.getStoryContext(story), [globals, setGlobals] = (0, import_react.useState)(storyContext.globals);
|
||
return (0, import_react.useEffect)(() => {
|
||
let onGlobalsUpdated = (changed) => {
|
||
setGlobals(changed.globals);
|
||
};
|
||
return context.channel.on(import_core_events.GLOBALS_UPDATED, onGlobalsUpdated), () => context.channel.off(import_core_events.GLOBALS_UPDATED, onGlobalsUpdated);
|
||
}, [context.channel]), [globals];
|
||
};
|
||
var useArgs2 = (story, context) => {
|
||
let result = useArgsIfDefined(story, context);
|
||
if (!result)
|
||
throw new Error("No result when story was defined");
|
||
return result;
|
||
};
|
||
var useArgsIfDefined = (story, context) => {
|
||
let storyContext = story ? context.getStoryContext(story) : { args: {} }, { id: storyId } = story || { id: "none" }, [args, setArgs] = (0, import_react.useState)(storyContext.args);
|
||
(0, import_react.useEffect)(() => {
|
||
let onArgsUpdated = (changed) => {
|
||
changed.storyId === storyId && setArgs(changed.args);
|
||
};
|
||
return context.channel.on(import_core_events.STORY_ARGS_UPDATED, onArgsUpdated), () => context.channel.off(import_core_events.STORY_ARGS_UPDATED, onArgsUpdated);
|
||
}, [storyId, context.channel]);
|
||
let updateArgs = (0, import_react.useCallback)((updatedArgs) => context.channel.emit(import_core_events.UPDATE_STORY_ARGS, { storyId, updatedArgs }), [storyId, context.channel]), resetArgs = (0, import_react.useCallback)((argNames) => context.channel.emit(import_core_events.RESET_STORY_ARGS, { storyId, argNames }), [storyId, context.channel]);
|
||
return story && [args, updateArgs, resetArgs];
|
||
};
|
||
var Controls3 = (props) => {
|
||
var _a;
|
||
let { of } = props;
|
||
if ("of" in props && of === void 0)
|
||
throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");
|
||
let context = (0, import_react.useContext)(DocsContext), { story } = context.resolveOf(of || "story", ["story"]), { parameters, argTypes } = story, controlsParameters = ((_a = parameters.docs) == null ? void 0 : _a.controls) || {}, include = props.include ?? controlsParameters.include, exclude = props.exclude ?? controlsParameters.exclude, sort = props.sort ?? controlsParameters.sort, [args, updateArgs, resetArgs] = useArgs2(story, context), [globals] = useGlobals2(story, context), filteredArgTypes = (0, import_preview_api.filterArgTypes)(argTypes, include, exclude);
|
||
return import_react.default.createElement(ArgsTable, { rows: filteredArgTypes, args, globals, updateArgs, resetArgs, sort });
|
||
};
|
||
var { document: document2 } = import_global.global;
|
||
var assertIsFn = (val) => {
|
||
if (typeof val != "function")
|
||
throw new Error(`Expected story function, got: ${val}`);
|
||
return val;
|
||
};
|
||
var AddContext = (props) => {
|
||
let { children, ...rest } = props, parentContext = import_react.default.useContext(DocsContext);
|
||
return import_react.default.createElement(DocsContext.Provider, { value: { ...parentContext, ...rest } }, children);
|
||
};
|
||
var CodeOrSourceMdx = ({ className, children, ...rest }) => {
|
||
if (typeof className != "string" && (typeof children != "string" || !children.match(/[\n\r]/g)))
|
||
return import_react.default.createElement(Code, null, children);
|
||
let language = className && className.split("-");
|
||
return import_react.default.createElement(Source, { language: language && language[1] || "plaintext", format: false, code: children, ...rest });
|
||
};
|
||
function navigate(context, url) {
|
||
context.channel.emit(import_core_events.NAVIGATE_URL, url);
|
||
}
|
||
var A = components2.a;
|
||
var AnchorInPage = ({ hash, children }) => {
|
||
let context = (0, import_react.useContext)(DocsContext);
|
||
return import_react.default.createElement(A, { href: hash, target: "_self", onClick: (event) => {
|
||
let id = hash.substring(1);
|
||
document2.getElementById(id) && navigate(context, hash);
|
||
} }, children);
|
||
};
|
||
var AnchorMdx = (props) => {
|
||
let { href, target, children, ...rest } = props, context = (0, import_react.useContext)(DocsContext);
|
||
if (href) {
|
||
if (href.startsWith("#"))
|
||
return import_react.default.createElement(AnchorInPage, { hash: href }, children);
|
||
if (target !== "_blank" && !href.startsWith("https://"))
|
||
return import_react.default.createElement(A, { href, onClick: (event) => {
|
||
event.button === 0 && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey && (event.preventDefault(), navigate(context, event.currentTarget.getAttribute("href")));
|
||
}, target, ...rest }, children);
|
||
}
|
||
return import_react.default.createElement(A, { ...props });
|
||
};
|
||
var SUPPORTED_MDX_HEADERS = ["h1", "h2", "h3", "h4", "h5", "h6"];
|
||
var OcticonHeaders = SUPPORTED_MDX_HEADERS.reduce((acc, headerType) => ({ ...acc, [headerType]: newStyled(headerType)({ "& svg": { position: "relative", top: "-0.1em", visibility: "hidden" }, "&:hover svg": { visibility: "visible" } }) }), {});
|
||
var OcticonAnchor = newStyled.a(() => ({ float: "left", lineHeight: "inherit", paddingRight: "10px", marginLeft: "-24px", color: "inherit" }));
|
||
var HeaderWithOcticonAnchor = ({ as, id, children, ...rest }) => {
|
||
let context = (0, import_react.useContext)(DocsContext), OcticonHeader = OcticonHeaders[as], hash = `#${id}`;
|
||
return import_react.default.createElement(OcticonHeader, { id, ...rest }, import_react.default.createElement(OcticonAnchor, { "aria-hidden": "true", href: hash, tabIndex: -1, target: "_self", onClick: (event) => {
|
||
document2.getElementById(id) && navigate(context, hash);
|
||
} }, import_react.default.createElement(Icons, { icon: "link" })), children);
|
||
};
|
||
var HeaderMdx = (props) => {
|
||
let { as, id, children, ...rest } = props;
|
||
if (id)
|
||
return import_react.default.createElement(HeaderWithOcticonAnchor, { as, id, ...rest }, children);
|
||
let Component4 = as, { as: omittedAs, ...withoutAs } = props;
|
||
return import_react.default.createElement(Component4, { ...nameSpaceClassNames(withoutAs, as) });
|
||
};
|
||
var HeadersMdx = SUPPORTED_MDX_HEADERS.reduce((acc, headerType) => ({ ...acc, [headerType]: (props) => import_react.default.createElement(HeaderMdx, { as: headerType, ...props }) }), {});
|
||
var Markdown2 = (props) => {
|
||
var _a;
|
||
if (!props.children)
|
||
return null;
|
||
if (typeof props.children != "string")
|
||
throw new Error(esm_default`The Markdown block only accepts children as a single string, but children were of type: '${typeof props.children}'
|
||
This is often caused by not wrapping the child in a template string.
|
||
|
||
This is invalid:
|
||
<Markdown>
|
||
# Some heading
|
||
A paragraph
|
||
</Markdown>
|
||
|
||
Instead do:
|
||
<Markdown>
|
||
{\`
|
||
# Some heading
|
||
A paragraph
|
||
\`}
|
||
</Markdown>
|
||
`);
|
||
return import_react.default.createElement(index_modern_default, { ...props, options: { forceBlock: true, overrides: { code: CodeOrSourceMdx, a: AnchorMdx, ...HeadersMdx, ...(_a = props == null ? void 0 : props.options) == null ? void 0 : _a.overrides }, ...props == null ? void 0 : props.options } });
|
||
};
|
||
var DescriptionType = ((DescriptionType2) => (DescriptionType2.INFO = "info", DescriptionType2.NOTES = "notes", DescriptionType2.DOCGEN = "docgen", DescriptionType2.AUTO = "auto", DescriptionType2))(DescriptionType || {});
|
||
var DEPRECATION_MIGRATION_LINK = "https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#description-block-parametersnotes-and-parametersinfo";
|
||
var getNotes = (notes) => notes && (typeof notes == "string" ? notes : str(notes.markdown) || str(notes.text));
|
||
var getInfo = (info) => info && (typeof info == "string" ? info : str(info.text));
|
||
var noDescription = (component) => null;
|
||
var getDescriptionFromResolvedOf = (resolvedOf) => {
|
||
var _a, _b, _c, _d, _e, _f, _g, _h;
|
||
switch (resolvedOf.type) {
|
||
case "story":
|
||
return ((_b = (_a = resolvedOf.story.parameters.docs) == null ? void 0 : _a.description) == null ? void 0 : _b.story) || null;
|
||
case "meta": {
|
||
let { parameters, component } = resolvedOf.preparedMeta, metaDescription = (_d = (_c = parameters.docs) == null ? void 0 : _c.description) == null ? void 0 : _d.component;
|
||
return metaDescription || ((_f = (_e = parameters.docs) == null ? void 0 : _e.extractComponentDescription) == null ? void 0 : _f.call(_e, component, { component, parameters })) || null;
|
||
}
|
||
case "component": {
|
||
let { component, projectAnnotations: { parameters } } = resolvedOf;
|
||
return ((_h = (_g = parameters.docs) == null ? void 0 : _g.extractComponentDescription) == null ? void 0 : _h.call(_g, component, { component, parameters })) || null;
|
||
}
|
||
default:
|
||
throw new Error(`Unrecognized module type resolved from 'useOf', got: ${resolvedOf.type}`);
|
||
}
|
||
};
|
||
var getDescriptionFromDeprecatedProps = ({ type, markdown, children }, { storyById }) => {
|
||
let { component, parameters } = storyById();
|
||
if (children || markdown)
|
||
return children || markdown;
|
||
let { notes, info, docs } = parameters;
|
||
(notes || info) && (0, import_client_logger.deprecate)(`Using 'parameters.notes' or 'parameters.info' properties to describe stories is deprecated. See ${DEPRECATION_MIGRATION_LINK}`);
|
||
let { extractComponentDescription = noDescription, description } = docs || {}, componentDescriptionParameter = description == null ? void 0 : description.component;
|
||
if (componentDescriptionParameter)
|
||
return componentDescriptionParameter;
|
||
switch (type) {
|
||
case "info":
|
||
return getInfo(info);
|
||
case "notes":
|
||
return getNotes(notes);
|
||
case "docgen":
|
||
case "auto":
|
||
default:
|
||
return extractComponentDescription(component, { component, ...parameters });
|
||
}
|
||
};
|
||
var DescriptionContainer = (props) => {
|
||
let { of, type, markdown: markdownProp, children } = props;
|
||
if ("of" in props && of === void 0)
|
||
throw new Error("Unexpected `of={undefined}`, did you mistype a CSF file reference?");
|
||
let context = (0, import_react.useContext)(DocsContext), resolvedOf = useOf(of || "meta"), markdown;
|
||
return type || markdownProp || children ? markdown = getDescriptionFromDeprecatedProps(props, context) : markdown = getDescriptionFromResolvedOf(resolvedOf), type && (0, import_client_logger.deprecate)(`Manually specifying description type is deprecated. See ${DEPRECATION_MIGRATION_LINK}`), markdownProp && (0, import_client_logger.deprecate)(`The 'markdown' prop on the Description block is deprecated. See ${DEPRECATION_MIGRATION_LINK}`), children && (0, import_client_logger.deprecate)(`The 'children' prop on the Description block is deprecated. See ${DEPRECATION_MIGRATION_LINK}`), markdown ? import_react.default.createElement(Markdown2, null, markdown) : null;
|
||
};
|
||
var Wrapper9 = newStyled.div(({ theme }) => ({ width: "10rem", "@media (max-width: 768px)": { display: "none" } }));
|
||
var Content2 = newStyled.div(({ theme }) => ({ position: "fixed", top: 0, width: "10rem", paddingTop: "4rem", fontFamily: theme.typography.fonts.base, fontSize: theme.typography.size.s2, WebkitFontSmoothing: "antialiased", MozOsxFontSmoothing: "grayscale", WebkitTapHighlightColor: "rgba(0, 0, 0, 0)", WebkitOverflowScrolling: "touch", "& *": { boxSizing: "border-box" }, "& > .toc-wrapper > .toc-list": { paddingLeft: 0, borderLeft: `solid 2px ${theme.color.mediumlight}`, ".toc-list": { paddingLeft: 0, borderLeft: `solid 2px ${theme.color.mediumlight}`, ".toc-list": { paddingLeft: 0, borderLeft: `solid 2px ${theme.color.mediumlight}` } } }, "& .toc-list-item": { position: "relative", listStyleType: "none", marginLeft: 20, paddingTop: 3, paddingBottom: 3 }, "& .toc-list-item::before": { content: '""', position: "absolute", height: "100%", top: 0, left: 0, transform: "translateX(calc(-2px - 20px))", borderLeft: `solid 2px ${theme.color.mediumdark}`, opacity: 0, transition: "opacity 0.2s" }, "& .toc-list-item.is-active-li::before": { opacity: 1 }, "& .toc-list-item > a": { color: theme.color.defaultText, textDecoration: "none" }, "& .toc-list-item.is-active-li > a": { fontWeight: 600, color: theme.color.secondary, textDecoration: "none" } }));
|
||
var Heading = newStyled.p(({ theme }) => ({ fontWeight: 600, fontSize: "0.875em", color: theme.textColor, textTransform: "uppercase", marginBottom: 10 }));
|
||
var OptionalTitle = ({ title }) => title === null ? null : typeof title == "string" ? import_react.default.createElement(Heading, null, title) : title;
|
||
var TableOfContents = ({ title, disable, headingSelector, contentsSelector, ignoreSelector, unsafeTocbotOptions }) => ((0, import_react.useEffect)(() => {
|
||
let configuration = { tocSelector: ".toc-wrapper", contentSelector: contentsSelector ?? ".sbdocs-content", headingSelector: headingSelector ?? "h3", ignoreSelector: ignoreSelector ?? ".skip-toc", headingsOffset: 40, scrollSmoothOffset: -40, orderedList: false, onClick: () => false, ...unsafeTocbotOptions }, timeout = setTimeout(() => tocbot.init(configuration), 100);
|
||
return () => {
|
||
clearTimeout(timeout), tocbot.destroy();
|
||
};
|
||
}, [disable]), import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(Wrapper9, null, disable ? null : import_react.default.createElement(Content2, null, import_react.default.createElement(OptionalTitle, { title: title || null }), import_react.default.createElement("div", { className: "toc-wrapper" })))));
|
||
var { document: document3, window: globalWindow3 } = import_global.global;
|
||
var DocsContainer = ({ context, theme, children }) => {
|
||
var _a, _b, _c, _d, _e;
|
||
let toc;
|
||
try {
|
||
toc = (_b = (_a = context.resolveOf("meta", ["meta"]).preparedMeta.parameters) == null ? void 0 : _a.docs) == null ? void 0 : _b.toc;
|
||
} catch {
|
||
toc = (_e = (_d = (_c = context == null ? void 0 : context.projectAnnotations) == null ? void 0 : _c.parameters) == null ? void 0 : _d.docs) == null ? void 0 : _e.toc;
|
||
}
|
||
return (0, import_react.useEffect)(() => {
|
||
let url;
|
||
try {
|
||
if (url = new URL(globalWindow3.parent.location.toString()), url.hash) {
|
||
let element = document3.getElementById(url.hash.substring(1));
|
||
element && setTimeout(() => {
|
||
scrollToElement(element);
|
||
}, 200);
|
||
}
|
||
} catch {
|
||
}
|
||
}), import_react.default.createElement(DocsContext.Provider, { value: context }, import_react.default.createElement(SourceContainer, { channel: context.channel }, import_react.default.createElement(ThemeProvider, { theme: ensure(theme) }, import_react.default.createElement(DocsPageWrapper, { toc: toc ? import_react.default.createElement(TableOfContents, { className: "sbdocs sbdocs-toc--custom", ...toc }) : null }, children))));
|
||
};
|
||
var STORY_KIND_PATH_SEPARATOR = /\s*\/\s*/;
|
||
var extractTitle = (title) => {
|
||
let groups = title.trim().split(STORY_KIND_PATH_SEPARATOR);
|
||
return groups && groups[groups.length - 1] || title;
|
||
};
|
||
var Title3 = ({ children }) => {
|
||
let context = (0, import_react.useContext)(DocsContext), content = children || extractTitle(context.storyById().title);
|
||
return content ? import_react.default.createElement(Title, { className: "sbdocs-title sb-unstyled" }, content) : null;
|
||
};
|
||
var Subtitle2 = ({ children }) => {
|
||
let docsContext = (0, import_react.useContext)(DocsContext), { parameters } = docsContext.storyById(), content = children || (parameters == null ? void 0 : parameters.componentSubtitle);
|
||
return content ? import_react.default.createElement(Subtitle, { className: "sbdocs-subtitle sb-unstyled" }, content) : null;
|
||
};
|
||
var Subheading = ({ children, disableAnchor }) => {
|
||
if (disableAnchor || typeof children != "string")
|
||
return import_react.default.createElement(H3, null, children);
|
||
let tagID = children.toLowerCase().replace(/[^a-z0-9]/gi, "-");
|
||
return import_react.default.createElement(HeaderMdx, { as: "h3", id: tagID }, children);
|
||
};
|
||
var DocsStory = ({ of, expanded = true, withToolbar: withToolbarProp = false, __forceInitialArgs = false, __primary = false }) => {
|
||
var _a, _b;
|
||
let { story } = useOf(of || "story", ["story"]), withToolbar = ((_b = (_a = story.parameters.docs) == null ? void 0 : _a.canvas) == null ? void 0 : _b.withToolbar) ?? withToolbarProp;
|
||
return import_react.default.createElement(Anchor, { storyId: story.id }, expanded && import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(Subheading, null, story.name), import_react.default.createElement(DescriptionContainer, { of })), import_react.default.createElement(Canvas, { of, withToolbar, story: { __forceInitialArgs, __primary }, source: { __forceInitialArgs } }));
|
||
};
|
||
var Primary = ({ name }) => {
|
||
let docsContext = (0, import_react.useContext)(DocsContext);
|
||
name && (0, import_client_logger.deprecate)(esm_default`\`name\` prop is deprecated on the Primary block.
|
||
The Primary block should only be used to render the primary story, which is automatically found.
|
||
`);
|
||
let storyId = name && docsContext.storyIdByName(name), story = docsContext.storyById(storyId);
|
||
return story ? import_react.default.createElement(DocsStory, { of: story.moduleExport, expanded: false, __primary: true, withToolbar: true }) : null;
|
||
};
|
||
var Heading2 = ({ children, disableAnchor, ...props }) => {
|
||
if (disableAnchor || typeof children != "string")
|
||
return import_react.default.createElement(H2, null, children);
|
||
let tagID = children.toLowerCase().replace(/[^a-z0-9]/gi, "-");
|
||
return import_react.default.createElement(HeaderMdx, { as: "h2", id: tagID, ...props }, children);
|
||
};
|
||
var StyledHeading = newStyled(Heading2)(({ theme }) => ({ fontSize: `${theme.typography.size.s2 - 1}px`, fontWeight: theme.typography.weight.bold, lineHeight: "16px", letterSpacing: "0.35em", textTransform: "uppercase", color: theme.textMutedColor, border: 0, marginBottom: "12px", "&:first-of-type": { marginTop: "56px" } }));
|
||
var Stories = ({ title, includePrimary = true }) => {
|
||
let { componentStories } = (0, import_react.useContext)(DocsContext), stories = componentStories().filter((story) => {
|
||
var _a, _b;
|
||
return !((_b = (_a = story.parameters) == null ? void 0 : _a.docs) == null ? void 0 : _b.disable);
|
||
});
|
||
return includePrimary || (stories = stories.slice(1)), !stories || stories.length === 0 ? null : import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(StyledHeading, null, title), stories.map((story) => story && import_react.default.createElement(DocsStory, { key: story.id, of: story.moduleExport, expanded: true, __forceInitialArgs: true })));
|
||
};
|
||
Stories.defaultProps = { title: "Stories" };
|
||
var DocsPage = () => {
|
||
let resolvedOf = useOf("meta", ["meta"]), { stories } = resolvedOf.csfFile, isSingleStory = Object.keys(stories).length === 1;
|
||
return import_react.default.createElement(import_react.default.Fragment, null, import_react.default.createElement(Title3, null), import_react.default.createElement(Subtitle2, null), import_react.default.createElement(DescriptionContainer, { of: "meta" }), isSingleStory ? import_react.default.createElement(DescriptionContainer, { of: "story" }) : null, import_react.default.createElement(Primary, null), import_react.default.createElement(Controls3, null), isSingleStory ? null : import_react.default.createElement(Stories, null));
|
||
};
|
||
function Docs({ context, docsParameter }) {
|
||
let Container = docsParameter.container || DocsContainer, Page = docsParameter.page || DocsPage;
|
||
return import_react.default.createElement(Container, { context, theme: docsParameter.theme }, import_react.default.createElement(Page, null));
|
||
}
|
||
var ExternalDocsContext = class extends import_preview_api.DocsContext {
|
||
constructor(channel, store, renderStoryToElement, processMetaExports) {
|
||
super(channel, store, renderStoryToElement, []);
|
||
this.channel = channel;
|
||
this.store = store;
|
||
this.renderStoryToElement = renderStoryToElement;
|
||
this.processMetaExports = processMetaExports;
|
||
this.referenceMeta = (metaExports, attach) => {
|
||
let csfFile = this.processMetaExports(metaExports);
|
||
this.referenceCSFFile(csfFile), super.referenceMeta(metaExports, attach);
|
||
};
|
||
}
|
||
};
|
||
var ConstantMap = class {
|
||
constructor(prefix) {
|
||
this.prefix = prefix;
|
||
this.entries = /* @__PURE__ */ new Map();
|
||
}
|
||
get(key) {
|
||
return this.entries.has(key) || this.entries.set(key, `${this.prefix}${this.entries.size}`), this.entries.get(key);
|
||
}
|
||
};
|
||
var ExternalPreview = class extends import_preview_api.Preview {
|
||
constructor(projectAnnotations) {
|
||
super(new import_channels.Channel({}));
|
||
this.projectAnnotations = projectAnnotations;
|
||
this.importPaths = new ConstantMap("./importPath/");
|
||
this.titles = new ConstantMap("title-");
|
||
this.storyIndex = { v: 4, entries: {} };
|
||
this.moduleExportsByImportPath = {};
|
||
this.processMetaExports = (metaExports) => {
|
||
let importPath = this.importPaths.get(metaExports);
|
||
this.moduleExportsByImportPath[importPath] = metaExports;
|
||
let title = metaExports.default.title || this.titles.get(metaExports), csfFile = this.storyStore.processCSFFileWithCache(metaExports, importPath, title);
|
||
return Object.values(csfFile.stories).forEach(({ id, name }) => {
|
||
this.storyIndex.entries[id] = { id, importPath, title, name, type: "story" };
|
||
}), this.onStoriesChanged({ storyIndex: this.storyIndex }), csfFile;
|
||
};
|
||
this.docsContext = () => new ExternalDocsContext(this.channel, this.storyStore, this.renderStoryToElement.bind(this), this.processMetaExports.bind(this));
|
||
this.initialize({ getStoryIndex: () => this.storyIndex, importFn: (path) => Promise.resolve(this.moduleExportsByImportPath[path]), getProjectAnnotations: () => (0, import_preview_api.composeConfigs)([{ parameters: { docs: { story: { inline: true } } } }, this.projectAnnotations]) });
|
||
}
|
||
};
|
||
function usePreview(projectAnnotations) {
|
||
let previewRef = (0, import_react.useRef)();
|
||
return previewRef.current || (previewRef.current = new ExternalPreview(projectAnnotations)), previewRef.current;
|
||
}
|
||
function ExternalDocs({ projectAnnotationsList, children }) {
|
||
var _a;
|
||
let projectAnnotations = (0, import_preview_api.composeConfigs)(projectAnnotationsList), preview2 = usePreview(projectAnnotations), docsParameter = { ...(_a = projectAnnotations.parameters) == null ? void 0 : _a.docs, page: () => children };
|
||
return import_react.default.createElement(Docs, { docsParameter, context: preview2.docsContext() });
|
||
}
|
||
var preview;
|
||
var ExternalDocsContainer = ({ projectAnnotations, children }) => (preview || (preview = new ExternalPreview(projectAnnotations)), import_react.default.createElement(DocsContext.Provider, { value: preview.docsContext() }, import_react.default.createElement(ThemeProvider, { theme: ensure(themes.light) }, children)));
|
||
var Meta = ({ of }) => {
|
||
let context = (0, import_react.useContext)(DocsContext);
|
||
of && context.referenceMeta(of, true);
|
||
try {
|
||
let primary = context.storyById();
|
||
return import_react.default.createElement(Anchor, { storyId: primary.id });
|
||
} catch {
|
||
return null;
|
||
}
|
||
};
|
||
var Unstyled = (props) => import_react.default.createElement("div", { ...props, className: "sb-unstyled" });
|
||
var Wrapper10 = ({ children }) => import_react.default.createElement("div", { style: { fontFamily: "sans-serif" } }, children);
|
||
|
||
export {
|
||
BooleanControl,
|
||
parseDate,
|
||
parseTime,
|
||
formatDate,
|
||
formatTime,
|
||
DateControl,
|
||
parse2,
|
||
format,
|
||
NumberControl,
|
||
OptionsControl,
|
||
ObjectControl,
|
||
RangeControl,
|
||
TextControl,
|
||
FilesControl,
|
||
ColorControl,
|
||
ArgsTable,
|
||
Typeset,
|
||
ColorItem,
|
||
ColorPalette,
|
||
IconItem,
|
||
IconGallery,
|
||
anchorBlockIdFromId,
|
||
Anchor,
|
||
DocsContext,
|
||
useOf,
|
||
ArgTypes,
|
||
PRIMARY_STORY,
|
||
extractComponentArgTypes2,
|
||
getComponent,
|
||
StoryTable,
|
||
ComponentsTable,
|
||
ArgsTable2,
|
||
argsHash,
|
||
SourceContext,
|
||
UNKNOWN_ARGS_HASH,
|
||
SourceContainer,
|
||
SourceState,
|
||
useSourceProps,
|
||
Source2,
|
||
getStoryId2,
|
||
getStoryProps,
|
||
Story2,
|
||
Canvas,
|
||
Controls3,
|
||
assertIsFn,
|
||
AddContext,
|
||
CodeOrSourceMdx,
|
||
AnchorMdx,
|
||
HeaderMdx,
|
||
HeadersMdx,
|
||
Markdown2,
|
||
DescriptionType,
|
||
DescriptionContainer,
|
||
DocsContainer,
|
||
extractTitle,
|
||
Title3,
|
||
Subtitle2,
|
||
Subheading,
|
||
DocsStory,
|
||
Primary,
|
||
Heading2,
|
||
Stories,
|
||
DocsPage,
|
||
Docs,
|
||
ExternalDocs,
|
||
ExternalDocsContainer,
|
||
Meta,
|
||
Unstyled,
|
||
Wrapper10
|
||
};
|
||
//# sourceMappingURL=chunk-MRDNCWBJ.js.map
|