@heymantle/litho 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/cjs/components/ActionList.js +267 -0
  4. package/dist/cjs/components/AnnouncementBar.js +73 -0
  5. package/dist/cjs/components/AppProvider.js +245 -0
  6. package/dist/cjs/components/Autocomplete.js +351 -0
  7. package/dist/cjs/components/Badge.js +234 -0
  8. package/dist/cjs/components/Banner.js +264 -0
  9. package/dist/cjs/components/Box.js +247 -0
  10. package/dist/cjs/components/Button.js +1018 -0
  11. package/dist/cjs/components/ButtonGroup.js +196 -0
  12. package/dist/cjs/components/Card.js +593 -0
  13. package/dist/cjs/components/Checkbox.js +175 -0
  14. package/dist/cjs/components/ChoiceList.js +160 -0
  15. package/dist/cjs/components/Collapsible.js +42 -0
  16. package/dist/cjs/components/ColorField.js +159 -0
  17. package/dist/cjs/components/ContextualSaveBar.js +53 -0
  18. package/dist/cjs/components/DatePicker.js +547 -0
  19. package/dist/cjs/components/Divider.js +50 -0
  20. package/dist/cjs/components/DropZone.js +547 -0
  21. package/dist/cjs/components/EmptyState.js +111 -0
  22. package/dist/cjs/components/Filters.js +874 -0
  23. package/dist/cjs/components/FooterHelp.js +48 -0
  24. package/dist/cjs/components/Form.js +44 -0
  25. package/dist/cjs/components/Frame.js +386 -0
  26. package/dist/cjs/components/FrameSaveBar.js +239 -0
  27. package/dist/cjs/components/Grid.js +151 -0
  28. package/dist/cjs/components/HorizontalStack.js +180 -0
  29. package/dist/cjs/components/Icon.js +346 -0
  30. package/dist/cjs/components/Image.js +191 -0
  31. package/dist/cjs/components/InlineError.js +57 -0
  32. package/dist/cjs/components/Label.js +78 -0
  33. package/dist/cjs/components/Layout.js +228 -0
  34. package/dist/cjs/components/LayoutSection.js +133 -0
  35. package/dist/cjs/components/Link.js +128 -0
  36. package/dist/cjs/components/List.js +69 -0
  37. package/dist/cjs/components/Listbox.js +211 -0
  38. package/dist/cjs/components/Loading.js +103 -0
  39. package/dist/cjs/components/Modal.js +449 -0
  40. package/dist/cjs/components/Navigation.js +331 -0
  41. package/dist/cjs/components/Page.js +529 -0
  42. package/dist/cjs/components/Pagination.js +109 -0
  43. package/dist/cjs/components/Pane.js +128 -0
  44. package/dist/cjs/components/Popover.js +365 -0
  45. package/dist/cjs/components/PopoverManager.js +34 -0
  46. package/dist/cjs/components/ProgressBar.js +124 -0
  47. package/dist/cjs/components/RadioButton.js +172 -0
  48. package/dist/cjs/components/RadioButtonCard.js +193 -0
  49. package/dist/cjs/components/RangeSlider.js +235 -0
  50. package/dist/cjs/components/ResourceList.js +105 -0
  51. package/dist/cjs/components/Select.js +300 -0
  52. package/dist/cjs/components/SkeletonText.js +130 -0
  53. package/dist/cjs/components/Spinner.js +72 -0
  54. package/dist/cjs/components/Table.js +1184 -0
  55. package/dist/cjs/components/Tabs.js +421 -0
  56. package/dist/cjs/components/Tag.js +165 -0
  57. package/dist/cjs/components/Text.js +274 -0
  58. package/dist/cjs/components/TextField.js +584 -0
  59. package/dist/cjs/components/Thumbnail.js +73 -0
  60. package/dist/cjs/components/TimePicker.js +23 -0
  61. package/dist/cjs/components/Tip.js +220 -0
  62. package/dist/cjs/components/Tooltip.js +431 -0
  63. package/dist/cjs/components/TopBar.js +210 -0
  64. package/dist/cjs/components/VerticalStack.js +161 -0
  65. package/dist/cjs/index.js +308 -0
  66. package/dist/cjs/styles/Table.js +591 -0
  67. package/dist/cjs/utilities/dates.js +339 -0
  68. package/dist/cjs/utilities/useIndexResourceState.js +175 -0
  69. package/dist/cjs/utilities/useMounted.js +67 -0
  70. package/dist/cjs/utilities/useTableScrollState.js +142 -0
  71. package/dist/esm/components/ActionList.js +216 -0
  72. package/dist/esm/components/AnnouncementBar.js +63 -0
  73. package/dist/esm/components/AppProvider.js +185 -0
  74. package/dist/esm/components/Autocomplete.js +300 -0
  75. package/dist/esm/components/Badge.js +225 -0
  76. package/dist/esm/components/Banner.js +254 -0
  77. package/dist/esm/components/Box.js +238 -0
  78. package/dist/esm/components/Button.js +967 -0
  79. package/dist/esm/components/ButtonGroup.js +137 -0
  80. package/dist/esm/components/Card.js +537 -0
  81. package/dist/esm/components/Checkbox.js +165 -0
  82. package/dist/esm/components/ChoiceList.js +145 -0
  83. package/dist/esm/components/Collapsible.js +32 -0
  84. package/dist/esm/components/ColorField.js +149 -0
  85. package/dist/esm/components/ContextualSaveBar.js +43 -0
  86. package/dist/esm/components/DatePicker.js +532 -0
  87. package/dist/esm/components/Divider.js +41 -0
  88. package/dist/esm/components/DropZone.js +537 -0
  89. package/dist/esm/components/EmptyState.js +101 -0
  90. package/dist/esm/components/Filters.js +823 -0
  91. package/dist/esm/components/FooterHelp.js +38 -0
  92. package/dist/esm/components/Form.js +35 -0
  93. package/dist/esm/components/Frame.js +376 -0
  94. package/dist/esm/components/FrameSaveBar.js +229 -0
  95. package/dist/esm/components/Grid.js +142 -0
  96. package/dist/esm/components/HorizontalStack.js +171 -0
  97. package/dist/esm/components/Icon.js +296 -0
  98. package/dist/esm/components/Image.js +141 -0
  99. package/dist/esm/components/InlineError.js +43 -0
  100. package/dist/esm/components/Label.js +63 -0
  101. package/dist/esm/components/Layout.js +164 -0
  102. package/dist/esm/components/LayoutSection.js +82 -0
  103. package/dist/esm/components/Link.js +119 -0
  104. package/dist/esm/components/List.js +61 -0
  105. package/dist/esm/components/Listbox.js +201 -0
  106. package/dist/esm/components/Loading.js +93 -0
  107. package/dist/esm/components/Modal.js +390 -0
  108. package/dist/esm/components/Navigation.js +321 -0
  109. package/dist/esm/components/Page.js +473 -0
  110. package/dist/esm/components/Pagination.js +99 -0
  111. package/dist/esm/components/Pane.js +118 -0
  112. package/dist/esm/components/Popover.js +350 -0
  113. package/dist/esm/components/PopoverManager.js +24 -0
  114. package/dist/esm/components/ProgressBar.js +114 -0
  115. package/dist/esm/components/RadioButton.js +157 -0
  116. package/dist/esm/components/RadioButtonCard.js +178 -0
  117. package/dist/esm/components/RangeSlider.js +225 -0
  118. package/dist/esm/components/ResourceList.js +95 -0
  119. package/dist/esm/components/Select.js +285 -0
  120. package/dist/esm/components/SkeletonText.js +120 -0
  121. package/dist/esm/components/Spinner.js +63 -0
  122. package/dist/esm/components/Table.js +1129 -0
  123. package/dist/esm/components/Tabs.js +366 -0
  124. package/dist/esm/components/Tag.js +151 -0
  125. package/dist/esm/components/Text.js +265 -0
  126. package/dist/esm/components/TextField.js +533 -0
  127. package/dist/esm/components/Thumbnail.js +63 -0
  128. package/dist/esm/components/TimePicker.js +13 -0
  129. package/dist/esm/components/Tip.js +169 -0
  130. package/dist/esm/components/Tooltip.js +380 -0
  131. package/dist/esm/components/TopBar.js +200 -0
  132. package/dist/esm/components/VerticalStack.js +152 -0
  133. package/dist/esm/index.js +61 -0
  134. package/dist/esm/styles/Table.js +581 -0
  135. package/dist/esm/utilities/dates.js +289 -0
  136. package/dist/esm/utilities/useIndexResourceState.js +158 -0
  137. package/dist/esm/utilities/useMounted.js +57 -0
  138. package/dist/esm/utilities/useTableScrollState.js +132 -0
  139. package/index.css +1137 -0
  140. package/package.json +53 -0
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Icon } from "../index.js";
3
+ import { CircleInformationMajor } from "@shopify/polaris-icons";
4
+ /**
5
+ * Renders a `FooterHelp` component, which provides additional information
6
+ * or guidance to users, typically displayed at the bottom of a page. The component
7
+ * centers its content within a rounded, styled box that includes an icon and customizable text.
8
+ *
9
+ * @component
10
+ * @param {Object} [props] - The props for the FooterHelp component.
11
+ * @param {React.ReactNode} [props.children] - The content to display next to the information icon.
12
+ * This is typically a text string or any valid React node.
13
+ *
14
+ * @returns {JSX.Element} The rendered FooterHelp component.
15
+ *
16
+ * @example
17
+ * // Basic usage:
18
+ * <FooterHelp>Need more help? Contact support.</FooterHelp>
19
+ */ function FooterHelp() {
20
+ var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
21
+ var children = props.children;
22
+ return /*#__PURE__*/ _jsx("div", {
23
+ className: "Litho-FooterHelp flex justify-center",
24
+ children: /*#__PURE__*/ _jsxs("div", {
25
+ className: "flex items-center gap-3 rounded-full bg-surface-lower py-3 pl-4 pr-5 mx-auto my-5",
26
+ children: [
27
+ /*#__PURE__*/ _jsx(Icon, {
28
+ source: CircleInformationMajor,
29
+ color: "subdued"
30
+ }),
31
+ /*#__PURE__*/ _jsx("span", {
32
+ children: children
33
+ })
34
+ ]
35
+ })
36
+ });
37
+ }
38
+ export default FooterHelp;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * A reusable Form component.
3
+ *
4
+ * @param {Object} [props={}] - The properties passed to the component.
5
+ * @param {string} [props.method="get"] - The HTTP method for the form submission.
6
+ * @param {function} [props.onSubmit] - The function to call when the form is submitted.
7
+ * @param {React.ReactNode} [props.children] - The child elements to be rendered inside the form.
8
+ * @returns {JSX.Element} The rendered form component.
9
+ */ import { jsx as _jsx } from "react/jsx-runtime";
10
+ function Form() {
11
+ var props = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
12
+ var acceptCharset = props.acceptCharset, action = props.action, autoComplete = props.autoComplete, children = props.children, encType = props.encType, _props_method = props.method, method = _props_method === void 0 ? 'post' : _props_method, name = props.name, noValidate = props.noValidate, _props_preventDefault = props.preventDefault, preventDefault = _props_preventDefault === void 0 ? true : _props_preventDefault, target = props.target, onSubmit = props.onSubmit;
13
+ function handleSubmit(event) {
14
+ if (preventDefault) {
15
+ event.preventDefault();
16
+ }
17
+ if (onSubmit) {
18
+ onSubmit(event);
19
+ }
20
+ }
21
+ return /*#__PURE__*/ _jsx("form", {
22
+ method: method,
23
+ onSubmit: handleSubmit,
24
+ acceptCharset: acceptCharset,
25
+ action: action,
26
+ autoComplete: autoComplete,
27
+ encType: encType,
28
+ name: name,
29
+ noValidate: noValidate,
30
+ target: target,
31
+ children: children
32
+ });
33
+ }
34
+ ;
35
+ export default Form;
@@ -0,0 +1,376 @@
1
+ "use client";
2
+ function _array_like_to_array(arr, len) {
3
+ if (len == null || len > arr.length) len = arr.length;
4
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
5
+ return arr2;
6
+ }
7
+ function _array_with_holes(arr) {
8
+ if (Array.isArray(arr)) return arr;
9
+ }
10
+ function _iterable_to_array_limit(arr, i) {
11
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
12
+ if (_i == null) return;
13
+ var _arr = [];
14
+ var _n = true;
15
+ var _d = false;
16
+ var _s, _e;
17
+ try {
18
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
19
+ _arr.push(_s.value);
20
+ if (i && _arr.length === i) break;
21
+ }
22
+ } catch (err) {
23
+ _d = true;
24
+ _e = err;
25
+ } finally{
26
+ try {
27
+ if (!_n && _i["return"] != null) _i["return"]();
28
+ } finally{
29
+ if (_d) throw _e;
30
+ }
31
+ }
32
+ return _arr;
33
+ }
34
+ function _non_iterable_rest() {
35
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
36
+ }
37
+ function _sliced_to_array(arr, i) {
38
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
39
+ }
40
+ function _unsupported_iterable_to_array(o, minLen) {
41
+ if (!o) return;
42
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
43
+ var n = Object.prototype.toString.call(o).slice(8, -1);
44
+ if (n === "Object" && o.constructor) n = o.constructor.name;
45
+ if (n === "Map" || n === "Set") return Array.from(n);
46
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
47
+ }
48
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
49
+ import { useEffect, useContext, useState, useMemo } from "react";
50
+ import { DarkModeContext, FrameContext } from "./AppProvider.js";
51
+ import { tv } from "tailwind-variants";
52
+ import { CancelMajor, SearchMajor, QuestionMarkInverseMajor } from "@shopify/polaris-icons";
53
+ import { Button, Icon, FrameSaveBar, TopBar, Popover, ActionList } from "../index.js";
54
+ var frameStyles = tv({
55
+ base: "Litho-Frame bg-surface-normal",
56
+ variants: {
57
+ paneIsOpen: {
58
+ true: "md:mr-[var(--litho-pane-width)]"
59
+ }
60
+ },
61
+ defaultVariants: {
62
+ paneIsOpen: false
63
+ }
64
+ });
65
+ var frameHeaderStyles = tv({
66
+ base: "Litho-Frame-Header bg-surface-normal fixed left-0 right-0 top-0",
67
+ variants: {
68
+ paneIsOpen: {
69
+ true: "md:mr-[var(--litho-pane-width)]"
70
+ }
71
+ },
72
+ defaultVariants: {
73
+ paneIsOpen: false
74
+ }
75
+ });
76
+ var navigationStyles = tv({
77
+ base: "Litho-Frame-Navigation fixed @md:z-auto left-0 top-0 bottom-0 overflow-hidden transform transition-transform duration-300 @md:transform-none @md:shadow-none bg-surface-normal w-[var(--litho-nav-width)] @md:mt-[var(--litho-top-bar-height)]",
78
+ variants: {
79
+ showMobileNavigation: {
80
+ true: "translate-x-0 opacity-100 shadow-modal",
81
+ false: "-translate-x-full opacity-0 @md:translate-x-0 @md:opacity-100"
82
+ },
83
+ hideScrollBar: {
84
+ true: "no-scrollbar"
85
+ }
86
+ }
87
+ });
88
+ var navigationOverlayStyles = tv({
89
+ base: "Litho-Frame-Navigation-Overlay fixed @md:z-auto inset-0 bg-tint-10 dark:bg-tint-25 opacity-0 pointer-events-none @md:hidden @md:pointer-events-none transition-opacity duration-300 overflow-hidden",
90
+ variants: {
91
+ showMobileNavigation: {
92
+ true: "opacity-100 pointer-events-auto"
93
+ }
94
+ }
95
+ });
96
+ var contentStyles = tv({
97
+ base: "Litho-Frame-Content relative",
98
+ variants: {
99
+ contentIsInIframe: {
100
+ true: "Litho-Frame-Content--InIframe h-screen overflow-hidden",
101
+ false: ""
102
+ },
103
+ contentIsFullPage: {
104
+ true: "",
105
+ false: "pt-[var(--litho-top-bar-height)]"
106
+ },
107
+ hasNavigation: {
108
+ true: "@md:ml-[var(--litho-nav-width)]",
109
+ false: ""
110
+ }
111
+ },
112
+ defaultVariants: {
113
+ contentIsFullPage: false,
114
+ hasNavigation: false
115
+ }
116
+ });
117
+ var logoStyles = tv({
118
+ base: "Litho-Logo fixed @md:z-1350 left-0 top-[var(--litho-header-offset)] px-5.5 h-[var(--litho-header-height)] flex items-center justify-start @md:opacity-100 transform transition duration-300 @md:transform-none @md:pointer-events-auto",
119
+ variants: {
120
+ showMobileNavigation: {
121
+ true: "translate-x-0 opacity-100",
122
+ false: ""
123
+ },
124
+ modalIsOpen: {
125
+ true: "Litho-Logo--ModalOpen",
126
+ false: ""
127
+ }
128
+ },
129
+ compoundVariants: [
130
+ {
131
+ alwaysShowLogo: true,
132
+ showMobileNavigation: false,
133
+ className: ""
134
+ },
135
+ {
136
+ alwaysShowLogo: false,
137
+ showMobileNavigation: false,
138
+ className: "-translate-x-full opacity-0 @md:translate-x-0 @md:opacity-100"
139
+ }
140
+ ],
141
+ defaultVariants: {
142
+ alwaysShowLogo: false
143
+ }
144
+ });
145
+ /**
146
+ * Frame component that provides a layout structure with top bar, navigation, logo, and content.
147
+ * @param {Object} props - Props for the Frame component.
148
+ * @param {React.ReactNode} props.navigation - Component to render as the navigation menu.
149
+ * @param {React.ReactNode} props.announcement - Component to render an announcement bar.
150
+ * @param {Object} props.logo - Logo configuration.
151
+ * @param {string} props.logo.url - URL for the logo link.
152
+ * @param {string} props.logo.source - Source for the logo image.
153
+ * @param {string} props.logo.accessibilityLabel - Accessibility label for the logo image.
154
+ * @param {number} props.logo.width - Width of the logo image.
155
+ * @param {boolean} props.showSearchTrigger - Whether to show the search trigger.
156
+ * @param {React.ReactNode} props.searchModal - Modal to render as the search modal.
157
+ * @param {function} props.onToggleSearchModal - Function to toggle the search modal.
158
+ * @param {string} [props.className] - Additional CSS classes for the Frame.
159
+ * @param {React.ReactNode} props.children - Content to render within the Frame.
160
+ * @param {boolean} [props.alwaysShowUserMenuInTopBar] - Whether to always show the user menu in the top bar.
161
+ * @param {React.ReactNode} [props.headerAccessory] - Accessory to render in the header.
162
+ * @returns {React.ReactElement} The rendered Frame component.
163
+ */ var Frame = function(param) {
164
+ var navigation = param.navigation, announcement = param.announcement, logo = param.logo, children = param.children, className = param.className, userMenu = param.userMenu, moreActions = param.moreActions, _param_showSearchTrigger = param.showSearchTrigger, showSearchTrigger = _param_showSearchTrigger === void 0 ? true : _param_showSearchTrigger, _param_alwaysShowUserMenuInTopBar = param.alwaysShowUserMenuInTopBar, alwaysShowUserMenuInTopBar = _param_alwaysShowUserMenuInTopBar === void 0 ? false : _param_alwaysShowUserMenuInTopBar, searchModal = param.searchModal, onToggleSearchModal = param.onToggleSearchModal, headerAccessory = param.headerAccessory;
165
+ var darkMode = useContext(DarkModeContext).darkMode;
166
+ var _useContext = useContext(FrameContext), contentIsInIframe = _useContext.contentIsInIframe, contentIsFullPage = _useContext.contentIsFullPage, showMobileNavigation = _useContext.showMobileNavigation, setShowMobileNavigation = _useContext.setShowMobileNavigation, modalIsOpen = _useContext.modalIsOpen, paneIsOpen = _useContext.paneIsOpen, embedded = _useContext.embedded;
167
+ var _useState = _sliced_to_array(useState(""), 2), searchTriggerShortcutText = _useState[0], setSearchTriggerShortcutText = _useState[1];
168
+ useEffect(function() {
169
+ if (/Mac/i.test(navigator.platform)) {
170
+ setSearchTriggerShortcutText("⌘K");
171
+ } else {
172
+ setSearchTriggerShortcutText("Ctrl+K");
173
+ }
174
+ }, []);
175
+ var hasAnnouncement = !!announcement;
176
+ var _useState1 = _sliced_to_array(useState(false), 2), showMoreActionsPopover = _useState1[0], setShowMoreActionsPopover = _useState1[1];
177
+ useEffect(function() {
178
+ if (!!announcement) {
179
+ var _document_querySelector, _document_querySelector1;
180
+ var announcementBarHeight = (_document_querySelector = document.querySelector(".Litho-Frame-Header .Litho-AnnouncementBar")) === null || _document_querySelector === void 0 ? void 0 : _document_querySelector.offsetHeight;
181
+ if (announcementBarHeight) {
182
+ document.documentElement.style.setProperty("--litho-header-offset", "".concat(announcementBarHeight, "px"));
183
+ } else {
184
+ document.documentElement.style.setProperty("--litho-header-offset", "0px");
185
+ }
186
+ var headerHeight = (_document_querySelector1 = document.querySelector(".Litho-Frame-Header")) === null || _document_querySelector1 === void 0 ? void 0 : _document_querySelector1.offsetHeight;
187
+ if (headerHeight) {
188
+ document.documentElement.style.setProperty("--litho-top-bar-height", "".concat(headerHeight, "px"));
189
+ document.documentElement.style.setProperty("--litho-table-header-sticky-at", "".concat(headerHeight, "px"));
190
+ } else {
191
+ document.documentElement.style.setProperty("--litho-top-bar-height", "56px");
192
+ document.documentElement.style.setProperty("--litho-table-header-sticky-at", "56px");
193
+ }
194
+ }
195
+ }, [
196
+ announcement
197
+ ]);
198
+ useEffect(function() {
199
+ var handleSearchShortcut = function(e) {
200
+ if ((e.metaKey || e.ctrlKey) && e.key === "k") {
201
+ e.preventDefault();
202
+ onToggleSearchModal();
203
+ }
204
+ };
205
+ window.addEventListener("keydown", handleSearchShortcut);
206
+ return function() {
207
+ window.removeEventListener("keydown", handleSearchShortcut);
208
+ };
209
+ }, []);
210
+ var contentClass = useMemo(function() {
211
+ return contentStyles({
212
+ contentIsInIframe: contentIsInIframe,
213
+ contentIsFullPage: contentIsFullPage,
214
+ hasNavigation: !!navigation && !contentIsFullPage
215
+ });
216
+ }, [
217
+ contentIsInIframe,
218
+ contentIsFullPage,
219
+ navigation
220
+ ]);
221
+ var logoSource = darkMode ? logo.darkSource : logo.source;
222
+ var searchTrigger = showSearchTrigger ? /*#__PURE__*/ _jsxs("div", {
223
+ className: "w-full pl-2 pr-3 h-8 rounded-md flex items-center gap-2 cursor-pointer bg-tint-2 hover:bg-tint-3 active:bg-tint-4 dark:bg-tint-alt-2 dark:hover:bg-tint-alt-3 dark:active:bg-tint-alt-4",
224
+ onClick: function() {
225
+ return onToggleSearchModal();
226
+ },
227
+ children: [
228
+ /*#__PURE__*/ _jsx(Icon, {
229
+ source: SearchMajor,
230
+ color: "subdued"
231
+ }),
232
+ /*#__PURE__*/ _jsxs("div", {
233
+ className: "flex-1 text-low flex items-center justify-between gap-1",
234
+ children: [
235
+ /*#__PURE__*/ _jsx("span", {
236
+ children: "Search"
237
+ }),
238
+ /*#__PURE__*/ _jsx("span", {
239
+ className: "text-xs text-lowest hidden @md:block",
240
+ children: searchTriggerShortcutText
241
+ })
242
+ ]
243
+ })
244
+ ]
245
+ }) : null;
246
+ var alwaysShowLogo = !contentIsFullPage && logo && alwaysShowUserMenuInTopBar;
247
+ return /*#__PURE__*/ _jsx("div", {
248
+ className: "".concat(frameStyles({
249
+ paneIsOpen: paneIsOpen
250
+ }), " ").concat(className),
251
+ children: /*#__PURE__*/ _jsxs("div", {
252
+ className: embedded ? "" : "@container",
253
+ children: [
254
+ !contentIsFullPage && /*#__PURE__*/ _jsx("div", {
255
+ className: logoStyles({
256
+ showMobileNavigation: showMobileNavigation,
257
+ modalIsOpen: modalIsOpen,
258
+ alwaysShowLogo: alwaysShowLogo
259
+ }),
260
+ children: /*#__PURE__*/ _jsx("a", {
261
+ href: logo.url,
262
+ className: "block py-1 px-2 relative -left-2 ".concat(logo.url ? " cursor-pointer" : ""),
263
+ children: /*#__PURE__*/ _jsx("img", {
264
+ src: logoSource,
265
+ alt: logo.accessibilityLabel,
266
+ style: (logo === null || logo === void 0 ? void 0 : logo.width) ? {
267
+ width: logo.width
268
+ } : undefined
269
+ })
270
+ })
271
+ }),
272
+ !contentIsFullPage && /*#__PURE__*/ _jsxs(_Fragment, {
273
+ children: [
274
+ /*#__PURE__*/ _jsx(FrameSaveBar, {
275
+ logo: logo
276
+ }),
277
+ /*#__PURE__*/ _jsxs("div", {
278
+ className: frameHeaderStyles({
279
+ paneIsOpen: paneIsOpen
280
+ }),
281
+ children: [
282
+ announcement,
283
+ /*#__PURE__*/ _jsx(TopBar, {
284
+ hasNavigation: !!navigation,
285
+ userMenu: userMenu,
286
+ headerAccessory: headerAccessory,
287
+ searchTrigger: searchTrigger,
288
+ alwaysShowUserMenuInTopBar: alwaysShowUserMenuInTopBar
289
+ })
290
+ ]
291
+ })
292
+ ]
293
+ }),
294
+ /*#__PURE__*/ _jsx("div", {
295
+ className: contentClass,
296
+ children: children
297
+ }),
298
+ !contentIsFullPage && navigation && /*#__PURE__*/ _jsxs(_Fragment, {
299
+ children: [
300
+ /*#__PURE__*/ _jsx("div", {
301
+ className: navigationStyles({
302
+ showMobileNavigation: showMobileNavigation,
303
+ hasAnnouncement: hasAnnouncement
304
+ }),
305
+ children: /*#__PURE__*/ _jsxs("div", {
306
+ className: "relative h-full flex flex-col",
307
+ children: [
308
+ showSearchTrigger && /*#__PURE__*/ _jsx("div", {
309
+ className: "pt-4 hidden @md:block pb-0 px-3",
310
+ children: searchTrigger
311
+ }),
312
+ /*#__PURE__*/ _jsx("div", {
313
+ className: "flex-1 pt-3 overflow-y-auto overflow-x-hidden bg-surface-normal overscroll-contain",
314
+ children: navigation
315
+ }),
316
+ /*#__PURE__*/ _jsxs("div", {
317
+ className: "hidden @md:flex py-2 px-3 items-center justify-between relative w-full overflow-hidden",
318
+ children: [
319
+ /*#__PURE__*/ _jsx("div", {
320
+ className: "absolute top-0 left-0 right-0 h-px bg-gradient-to-r from-tint-4 to-transparent pointer-events-none dark:from-tint-alt-3"
321
+ }),
322
+ /*#__PURE__*/ _jsx("div", {
323
+ className: "truncate",
324
+ children: userMenu
325
+ }),
326
+ moreActions && /*#__PURE__*/ _jsx(Popover, {
327
+ active: showMoreActionsPopover,
328
+ onClose: function() {
329
+ return setShowMoreActionsPopover(false);
330
+ },
331
+ preferredAlignment: "right",
332
+ preferredPosition: "above",
333
+ containerClassName: "shrink-0 whitespace-nowrap flex-none",
334
+ activator: /*#__PURE__*/ _jsx(Button, {
335
+ icon: QuestionMarkInverseMajor,
336
+ iconColor: "subdued",
337
+ plain: true,
338
+ onClick: function() {
339
+ return setShowMoreActionsPopover(!showMoreActionsPopover);
340
+ }
341
+ }),
342
+ children: /*#__PURE__*/ _jsx(ActionList, {
343
+ sections: moreActions,
344
+ onActionAnyItem: function() {
345
+ return setShowMoreActionsPopover(false);
346
+ }
347
+ })
348
+ })
349
+ ]
350
+ })
351
+ ]
352
+ })
353
+ }),
354
+ /*#__PURE__*/ _jsx("div", {
355
+ className: navigationOverlayStyles({
356
+ showMobileNavigation: showMobileNavigation
357
+ }),
358
+ onClick: function() {
359
+ return setShowMobileNavigation(false);
360
+ },
361
+ children: /*#__PURE__*/ _jsx("div", {
362
+ className: "fixed cursor-pointer top-2.5 @md:hidden p-2 rounded-full bg-tint-10 hover:bg-tint-12 dark:bg-tint-alt-10 dark:hover:bg-tint-alt-12 left-56.5",
363
+ children: /*#__PURE__*/ _jsx(Icon, {
364
+ source: CancelMajor,
365
+ color: "alternate"
366
+ })
367
+ })
368
+ })
369
+ ]
370
+ }),
371
+ searchModal
372
+ ]
373
+ })
374
+ });
375
+ };
376
+ export default Frame;
@@ -0,0 +1,229 @@
1
+ "use client";
2
+ function _array_like_to_array(arr, len) {
3
+ if (len == null || len > arr.length) len = arr.length;
4
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
5
+ return arr2;
6
+ }
7
+ function _array_with_holes(arr) {
8
+ if (Array.isArray(arr)) return arr;
9
+ }
10
+ function _iterable_to_array_limit(arr, i) {
11
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
12
+ if (_i == null) return;
13
+ var _arr = [];
14
+ var _n = true;
15
+ var _d = false;
16
+ var _s, _e;
17
+ try {
18
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
19
+ _arr.push(_s.value);
20
+ if (i && _arr.length === i) break;
21
+ }
22
+ } catch (err) {
23
+ _d = true;
24
+ _e = err;
25
+ } finally{
26
+ try {
27
+ if (!_n && _i["return"] != null) _i["return"]();
28
+ } finally{
29
+ if (_d) throw _e;
30
+ }
31
+ }
32
+ return _arr;
33
+ }
34
+ function _non_iterable_rest() {
35
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
36
+ }
37
+ function _sliced_to_array(arr, i) {
38
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
39
+ }
40
+ function _unsupported_iterable_to_array(o, minLen) {
41
+ if (!o) return;
42
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
43
+ var n = Object.prototype.toString.call(o).slice(8, -1);
44
+ if (n === "Object" && o.constructor) n = o.constructor.name;
45
+ if (n === "Map" || n === "Set") return Array.from(n);
46
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
47
+ }
48
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
49
+ import { useContext, useEffect, useState } from "react";
50
+ import { FormContext, DarkModeContext, FrameContext } from "./AppProvider.js";
51
+ import { tv } from "tailwind-variants";
52
+ import { Button, Text, Icon, Tooltip } from "../index.js";
53
+ import { ChevronUpMinor, ChevronDownMinor } from "@shopify/polaris-icons";
54
+ var styles = tv({
55
+ base: "Litho-FrameSaveBar fixed top-[var(--litho-header-offset)] right-0 left-0 h-[var(--litho-header-height)] px-4 @md:px-5 flex items-center gap-2 bg-surface-alternate dark:bg-brand transition-opacity transition-transform duration-300 transform",
56
+ variants: {
57
+ visible: {
58
+ true: "opacity-100 pointer-events-auto",
59
+ false: "opacity-0 pointer-events-none"
60
+ },
61
+ tucked: {
62
+ true: "-translate-y-full",
63
+ false: "translate-y-0"
64
+ },
65
+ paneIsOpen: {
66
+ true: "right-[var(--litho-pane-width)]",
67
+ false: "right-0"
68
+ }
69
+ },
70
+ defaultVariants: {
71
+ visible: false,
72
+ tucked: false,
73
+ paneIsOpen: false
74
+ }
75
+ });
76
+ var toggleStyles = tv({
77
+ base: "Litho-FrameSaveBar__Toggle hidden @md:block bg-surface-alternate dark:bg-brand rounded-b-md fixed -translate-x-1/2 top-0 transition-transform duration-300 transform",
78
+ variants: {
79
+ tucked: {
80
+ true: "translate-y-0",
81
+ false: "-translate-y-full"
82
+ },
83
+ paneIsOpen: {
84
+ true: "left-[calc(50%-var(--litho-pane-width)/2)]",
85
+ false: "left-1/2"
86
+ }
87
+ },
88
+ defaultVariants: {
89
+ tucked: false,
90
+ paneIsOpen: false
91
+ }
92
+ });
93
+ /**
94
+ * FrameSaveBar component sisplays a save bar at the top of the screen with contextual save and discard actions.
95
+ * @param {Object} props.logo - Logo configuration.
96
+ * @returns {JSX.Element} The rendered FrameSaveBar component
97
+ */ function FrameSaveBar(param) {
98
+ var logo = param.logo;
99
+ var darkMode = useContext(DarkModeContext).darkMode;
100
+ var paneIsOpen = useContext(FrameContext).paneIsOpen;
101
+ var _useContext = useContext(FormContext), showGlobalContextualSaveBar = _useContext.showGlobalContextualSaveBar, message = _useContext.message, saveAction = _useContext.saveAction, discardAction = _useContext.discardAction;
102
+ var _useState = _sliced_to_array(useState(false), 2), visible = _useState[0], setVisible = _useState[1];
103
+ var _useState1 = _sliced_to_array(useState(false), 2), show = _useState1[0], setShow = _useState1[1];
104
+ var _useState2 = _sliced_to_array(useState(false), 2), tucked = _useState2[0], setTucked = _useState2[1];
105
+ useEffect(function() {
106
+ if (showGlobalContextualSaveBar) {
107
+ setVisible(true);
108
+ var timer = setTimeout(function() {
109
+ return setShow(true);
110
+ }, 10);
111
+ return function() {
112
+ return clearTimeout(timer);
113
+ };
114
+ } else {
115
+ setShow(false);
116
+ var timer1 = setTimeout(function() {
117
+ return setVisible(false);
118
+ }, 300);
119
+ return function() {
120
+ return clearTimeout(timer1);
121
+ };
122
+ }
123
+ }, [
124
+ showGlobalContextualSaveBar
125
+ ]);
126
+ var logoSource = darkMode ? logo.source : logo.darkSource;
127
+ if (!visible) return null;
128
+ return /*#__PURE__*/ _jsxs(_Fragment, {
129
+ children: [
130
+ /*#__PURE__*/ _jsx("div", {
131
+ className: toggleStyles({
132
+ tucked: tucked,
133
+ paneIsOpen: paneIsOpen
134
+ }),
135
+ children: /*#__PURE__*/ _jsx(Tooltip, {
136
+ content: "Show save bar",
137
+ position: "below",
138
+ alignment: "center",
139
+ children: /*#__PURE__*/ _jsx("div", {
140
+ className: "cursor-pointer w-8 h-8 flex items-center justify-center",
141
+ onClick: function() {
142
+ return setTucked(false);
143
+ },
144
+ children: /*#__PURE__*/ _jsx(Icon, {
145
+ source: ChevronDownMinor,
146
+ color: "FrameSaveBar"
147
+ })
148
+ })
149
+ })
150
+ }),
151
+ /*#__PURE__*/ _jsxs("div", {
152
+ className: styles({
153
+ visible: show,
154
+ tucked: tucked,
155
+ paneIsOpen: paneIsOpen
156
+ }),
157
+ children: [
158
+ /*#__PURE__*/ _jsx("div", {
159
+ className: "hidden @md:block py-1 px-0.5 w-51.5",
160
+ children: /*#__PURE__*/ _jsx("img", {
161
+ src: logoSource,
162
+ alt: logo.accessibilityLabel,
163
+ style: (logo === null || logo === void 0 ? void 0 : logo.width) ? {
164
+ width: logo.width
165
+ } : undefined
166
+ })
167
+ }),
168
+ /*#__PURE__*/ _jsxs("div", {
169
+ className: "flex-1 flex items-center justify-between gap-2",
170
+ children: [
171
+ /*#__PURE__*/ _jsxs("div", {
172
+ className: "flex items-center gap-2 min-w-0",
173
+ children: [
174
+ /*#__PURE__*/ _jsx(Text, {
175
+ variant: "headingMd",
176
+ color: "FrameSaveBar",
177
+ truncate: true,
178
+ children: message
179
+ }),
180
+ /*#__PURE__*/ _jsx("div", {
181
+ className: "hidden @md:block",
182
+ children: /*#__PURE__*/ _jsx(Tooltip, {
183
+ content: "Hide save bar",
184
+ position: "below",
185
+ alignment: "center",
186
+ children: /*#__PURE__*/ _jsx("div", {
187
+ className: "cursor-pointer w-8 h-8 flex items-center justify-center hover:bg-tint-1 active:bg-tint-2 rounded-md",
188
+ onClick: function() {
189
+ return setTucked(true);
190
+ },
191
+ children: /*#__PURE__*/ _jsx(Icon, {
192
+ source: ChevronUpMinor,
193
+ color: "FrameSaveBar"
194
+ })
195
+ })
196
+ })
197
+ })
198
+ ]
199
+ }),
200
+ /*#__PURE__*/ _jsxs("div", {
201
+ className: "flex items-center gap-2",
202
+ children: [
203
+ discardAction && /*#__PURE__*/ _jsx(Button, {
204
+ primary: true,
205
+ onClick: discardAction.onAction,
206
+ loading: discardAction.loading,
207
+ accessibilityLabel: discardAction.accessibilityLabel,
208
+ disabled: discardAction.disabled,
209
+ className: discardAction.loading || discardAction.disabled ? "border-transparent!" : undefined,
210
+ children: discardAction.content
211
+ }),
212
+ saveAction && /*#__PURE__*/ _jsx(Button, {
213
+ highlight: true,
214
+ onClick: saveAction.onAction,
215
+ loading: saveAction.loading,
216
+ accessibilityLabel: saveAction.accessibilityLabel,
217
+ disabled: saveAction.disabled,
218
+ children: saveAction.content
219
+ })
220
+ ]
221
+ })
222
+ ]
223
+ })
224
+ ]
225
+ })
226
+ ]
227
+ });
228
+ }
229
+ export default FrameSaveBar;