@flamingo-stack/openframe-frontend-core 0.0.838 → 0.0.840
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build/export-map.json +1 -1
- package/dist/{chunk-JFR3OFE6.cjs → chunk-275AQ6LC.cjs} +6 -6
- package/dist/{chunk-5BM7X4GA.cjs → chunk-5GBLXY5F.cjs} +2 -2
- package/dist/{chunk-5L3UKDC6.cjs → chunk-6LDL3UZE.cjs} +9 -9
- package/dist/{chunk-SWMUW3RR.cjs → chunk-744JXTDP.cjs} +19 -19
- package/dist/{chunk-46LATWQR.cjs → chunk-7WKRMJI6.cjs} +5 -5
- package/dist/{chunk-2X5LYDNA.cjs → chunk-AT6D7BAZ.cjs} +5 -5
- package/dist/{chunk-C4OQIYGW.cjs → chunk-CCRXBFNL.cjs} +8 -8
- package/dist/{chunk-LC65AC6M.cjs → chunk-COWMXUHN.cjs} +2 -0
- package/dist/{chunk-5E4YEHHO.cjs → chunk-DGY5KEPY.cjs} +55 -55
- package/dist/{chunk-B4THEQOW.cjs → chunk-DYDQLS2R.cjs} +744 -561
- package/dist/{chunk-LWMWY3JO.cjs → chunk-E7M54JWW.cjs} +14 -14
- package/dist/{chunk-Z7A7IZWL.cjs → chunk-EV6BPF47.cjs} +236 -210
- package/dist/{chunk-7XRFAHJF.cjs → chunk-FHI4I3TQ.cjs} +9 -9
- package/dist/{chunk-ZABZIM2Y.cjs → chunk-FRL2ZN4O.cjs} +3 -3
- package/dist/{chunk-7Z536SPR.cjs → chunk-FW7RKWPY.cjs} +15 -1
- package/dist/{chunk-U4MJ2Z4V.cjs → chunk-GMK4JGC2.cjs} +46 -46
- package/dist/{chunk-NV5AHL4G.cjs → chunk-GUKFMMDZ.cjs} +3 -3
- package/dist/{chunk-JI34QKPJ.cjs → chunk-HXTZZE3R.cjs} +253 -131
- package/dist/{chunk-MMPMQUQM.cjs → chunk-IELPVUPR.cjs} +18 -18
- package/dist/{chunk-64PF3UC7.cjs → chunk-INBFKUZA.cjs} +17 -17
- package/dist/{chunk-APOMNC7H.cjs → chunk-IUDBG3HJ.cjs} +3 -3
- package/dist/{chunk-4JHO2NVI.cjs → chunk-J2IXYCEH.cjs} +26 -10
- package/dist/{chunk-V322TUBY.cjs → chunk-JM2XA7VY.cjs} +28 -28
- package/dist/{chunk-GPXKG34G.cjs → chunk-JUEAZCD6.cjs} +46 -46
- package/dist/{chunk-2QAUQPGC.cjs → chunk-MYAPG3FQ.cjs} +21 -21
- package/dist/{chunk-GRHF5SWL.cjs → chunk-NFNSPLGC.cjs} +3 -3
- package/dist/{chunk-4TUHHKLR.cjs → chunk-Q6WUHYOG.cjs} +72 -72
- package/dist/{chunk-H3WTYAVR.cjs → chunk-RSJYTQEA.cjs} +30 -30
- package/dist/{chunk-MG3HJIGG.cjs → chunk-UAI4VMEF.cjs} +4 -4
- package/dist/{chunk-S5RMRQKT.cjs → chunk-UZPYYHF5.cjs} +18 -18
- package/dist/{chunk-TMD55O5U.cjs → chunk-VBH2RCFM.cjs} +73 -73
- package/dist/{chunk-FNNDGOR3.cjs → chunk-WCK5T3UD.cjs} +43 -43
- package/dist/{chunk-TRZEFT2N.cjs → chunk-WI7EXAZT.cjs} +9 -5
- package/dist/{chunk-7QNGILIY.cjs → chunk-Z35PL3UR.cjs} +32 -32
- package/dist/{chunk-ENK75WN4.cjs → chunk-ZAO5SYBJ.cjs} +4 -4
- package/dist/{cloud-tenants-GLPDB2F5.cjs → cloud-tenants-PV63RZ73.cjs} +19 -19
- package/dist/components/case-studies/index.cjs +33 -33
- package/dist/components/chat/chat-nav-sidebar.d.ts.map +1 -1
- package/dist/components/chat/chat-nav-sidebar.js +17 -3
- package/dist/components/chat/index.cjs +13 -13
- package/dist/components/contact/index.cjs +20 -20
- package/dist/components/docs/index.cjs +23 -23
- package/dist/components/embeds/index.cjs +20 -20
- package/dist/components/faq/index.cjs +21 -21
- package/dist/components/features/command-box.d.ts.map +1 -1
- package/dist/components/features/command-box.js +4 -23
- package/dist/components/features/index.cjs +29 -19
- package/dist/components/features/software/index.d.ts +1 -0
- package/dist/components/features/software/index.d.ts.map +1 -1
- package/dist/components/features/software/index.js +12 -0
- package/dist/components/features/software/software-action-form.d.ts +9 -1
- package/dist/components/features/software/software-action-form.d.ts.map +1 -1
- package/dist/components/features/software/software-action-form.js +18 -1
- package/dist/components/features/software/update-settings-fields.d.ts +43 -0
- package/dist/components/features/software/update-settings-fields.d.ts.map +1 -0
- package/dist/components/features/software/update-settings-fields.js +202 -0
- package/dist/components/help-center-pages/download-apps-page.d.ts +1 -1
- package/dist/components/help-center-pages/download-apps-page.d.ts.map +1 -1
- package/dist/components/help-center-pages/download-apps-page.js +2 -3
- package/dist/components/help-center-pages/index.cjs +122 -123
- package/dist/components/index.cjs +86 -76
- package/dist/components/meeting-scheduler/index.cjs +82 -82
- package/dist/components/navigation/account-popover.d.ts.map +1 -1
- package/dist/components/navigation/account-popover.js +26 -2
- package/dist/components/navigation/app-layout-side-panel.d.ts.map +1 -1
- package/dist/components/navigation/app-layout-side-panel.js +2 -9
- package/dist/components/navigation/index.cjs +22 -22
- package/dist/components/navigation/navigation-sidebar-grouped.d.ts.map +1 -1
- package/dist/components/navigation/navigation-sidebar-grouped.js +30 -6
- package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
- package/dist/components/navigation/navigation-sidebar-item.js +14 -1
- package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
- package/dist/components/navigation/navigation-sidebar.js +72 -3
- package/dist/components/onboarding-guides/index.cjs +22 -22
- package/dist/components/product-demo/fixtures/software-update.d.ts +2 -0
- package/dist/components/product-demo/fixtures/software-update.d.ts.map +1 -1
- package/dist/components/product-demo/fixtures/software-update.js +3 -2
- package/dist/components/product-demo/index.cjs +30 -30
- package/dist/components/related-content/index.cjs +8 -8
- package/dist/components/tickets/index.cjs +24 -24
- package/dist/components/ui/index.cjs +19 -19
- package/dist/components/ui/panel-resize-handle.d.ts +27 -6
- package/dist/components/ui/panel-resize-handle.d.ts.map +1 -1
- package/dist/components/ui/panel-resize-handle.js +27 -3
- package/dist/{devices-GHPW5WCO.cjs → devices-VECG5JNC.cjs} +20 -20
- package/dist/{embeddable-chat-RBC7F4TL.cjs → embeddable-chat-VRYAQQF6.cjs} +90 -90
- package/dist/hooks/index.cjs +11 -7
- package/dist/hooks/ui/index.d.ts +1 -0
- package/dist/hooks/ui/index.d.ts.map +1 -1
- package/dist/hooks/ui/index.js +1 -0
- package/dist/hooks/ui/use-clipped-label-tooltip.d.ts +14 -0
- package/dist/hooks/ui/use-clipped-label-tooltip.d.ts.map +1 -0
- package/dist/hooks/ui/use-clipped-label-tooltip.js +13 -0
- package/dist/hooks/ui/use-is-truncated.d.ts.map +1 -1
- package/dist/hooks/ui/use-is-truncated.js +1 -0
- package/dist/hooks/ui/use-media-query.d.ts.map +1 -1
- package/dist/hooks/ui/use-media-query.js +1 -0
- package/dist/hooks/ui/use-resizable-panel-size.d.ts +1 -0
- package/dist/hooks/ui/use-resizable-panel-size.d.ts.map +1 -1
- package/dist/hooks/ui/use-resizable-panel-size.js +5 -1
- package/dist/index.cjs +38 -24
- package/dist/{knowledge-4TOSY2S5.cjs → knowledge-YJSDJIXT.cjs} +20 -20
- package/dist/{logs-MUODFY6N.cjs → logs-42JG3NZ5.cjs} +26 -26
- package/dist/{policies-TJHO3VLE.cjs → policies-D4QNVJ26.cjs} +23 -23
- package/dist/{remote-session-CN3G7JNR.cjs → remote-session-EE6477O3.cjs} +10 -10
- package/dist/{scripts-X5CMYE2V.cjs → scripts-4VFYBXBE.cjs} +26 -26
- package/dist/{software-update-2UZKHTYM.cjs → software-update-OSDZQ5CP.cjs} +25 -25
- package/dist/{tickets-board-PLYD2NSY.cjs → tickets-board-44HO3LR4.cjs} +10 -10
- package/dist/types/navigation.d.ts +36 -0
- package/dist/types/navigation.d.ts.map +1 -1
- package/dist/utils/notifications.cjs +2 -0
- package/dist/utils/notifications.d.ts +1 -1
- package/dist/utils/notifications.d.ts.map +1 -1
- package/dist/utils/notifications.js +2 -0
- package/package.json +1 -1
- package/src/components/chat/chat-nav-sidebar.tsx +17 -4
- package/src/components/features/command-box.tsx +17 -19
- package/src/components/features/notifications/notification-category-icon.tsx +1 -1
- package/src/components/features/software/index.ts +11 -0
- package/src/components/features/software/software-action-form.tsx +28 -1
- package/src/components/features/software/update-settings-fields.tsx +265 -0
- package/src/components/help-center-pages/download-apps-page.tsx +4 -5
- package/src/components/navigation/account-popover.tsx +31 -2
- package/src/components/navigation/app-layout-side-panel.tsx +2 -7
- package/src/components/navigation/navigation-sidebar-grouped.tsx +37 -6
- package/src/components/navigation/navigation-sidebar-item.tsx +18 -1
- package/src/components/navigation/navigation-sidebar.tsx +116 -7
- package/src/components/product-demo/fixtures/software-update.ts +2 -2
- package/src/components/ui/panel-resize-handle.tsx +50 -8
- package/src/hooks/ui/index.ts +1 -0
- package/src/hooks/ui/use-clipped-label-tooltip.ts +20 -0
- package/src/hooks/ui/use-is-truncated.ts +2 -0
- package/src/hooks/ui/use-media-query.ts +2 -0
- package/src/hooks/ui/use-resizable-panel-size.ts +7 -1
- package/src/types/navigation.ts +37 -0
- package/src/utils/notifications.ts +2 -0
|
@@ -3,6 +3,7 @@ import { type SoftwareScheduleTiming } from './schedule-fields';
|
|
|
3
3
|
import { type SoftwareActionKind } from './software-action-copy';
|
|
4
4
|
import { type SoftwareRow } from './software-row';
|
|
5
5
|
import { type PackageSearchSlotProps } from './software-row-fields';
|
|
6
|
+
import { type SoftwareUpdateSettingsValues } from './update-settings-fields';
|
|
6
7
|
/** Run the packages now, or at a scheduled start. */
|
|
7
8
|
export type SoftwareRunMode = 'now' | 'schedule';
|
|
8
9
|
/** Everything the form holds: the packages and when they run. The devices are the host's. */
|
|
@@ -12,6 +13,8 @@ export interface SoftwareActionFormValues<TRef extends string = string> {
|
|
|
12
13
|
date: Date | null;
|
|
13
14
|
time: string;
|
|
14
15
|
timeReference: TRef;
|
|
16
|
+
/** UPDATE only: "Update Settings". Undefined for INSTALL, and when the form hides them (`showUpdateSettings`). */
|
|
17
|
+
updateSettings?: SoftwareUpdateSettingsValues;
|
|
15
18
|
}
|
|
16
19
|
/** What the device picker slot is told: which devices the chosen packages can run on. */
|
|
17
20
|
export interface SoftwareDeviceScope {
|
|
@@ -54,6 +57,11 @@ export interface SoftwareActionFormProps<TRef extends string = string> {
|
|
|
54
57
|
* schedule's fields on the same row, so the devices start higher.
|
|
55
58
|
*/
|
|
56
59
|
runModeLayout?: 'stacked' | 'inline';
|
|
60
|
+
/**
|
|
61
|
+
* UPDATE only: the "Update Settings" block under the timing. Default false, so a host that does not send the
|
|
62
|
+
* settings yet never shows choices that go nowhere; the host that submits `updateSettings` passes true.
|
|
63
|
+
*/
|
|
64
|
+
showUpdateSettings?: boolean;
|
|
57
65
|
/** The "Device Selection" heading over the picker. Default true; a host that titles the picker itself passes false. */
|
|
58
66
|
showDeviceHeading?: boolean;
|
|
59
67
|
className?: string;
|
|
@@ -67,5 +75,5 @@ export interface SoftwareActionFormProps<TRef extends string = string> {
|
|
|
67
75
|
* catalog and picking devices are the host's queries, so both are slots: the
|
|
68
76
|
* product passes its data-bound field and picker, a fixture passes static ones.
|
|
69
77
|
*/
|
|
70
|
-
export declare function SoftwareActionForm<TRef extends string = string>({ action, onBack, showHeader, onSubmit, submitDisabled, submitting, timing, initialValues, renderPackageSearch, renderDevicePicker, addRows, runModeLayout, showDeviceHeading, className, }: SoftwareActionFormProps<TRef>): import("react").JSX.Element;
|
|
78
|
+
export declare function SoftwareActionForm<TRef extends string = string>({ action, onBack, showHeader, onSubmit, submitDisabled, submitting, timing, initialValues, renderPackageSearch, renderDevicePicker, addRows, runModeLayout, showUpdateSettings, showDeviceHeading, className, }: SoftwareActionFormProps<TRef>): import("react").JSX.Element;
|
|
71
79
|
//# sourceMappingURL=software-action-form.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"software-action-form.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/software-action-form.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAKjD,OAAO,EAA0B,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,sBAAsB,EAAqB,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"software-action-form.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/software-action-form.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAKjD,OAAO,EAA0B,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,KAAK,sBAAsB,EAAqB,MAAM,uBAAuB,CAAC;AACvF,OAAO,EAGL,KAAK,4BAA4B,EAClC,MAAM,0BAA0B,CAAC;AAElC,qDAAqD;AACrD,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,UAAU,CAAC;AAEjD,6FAA6F;AAC7F,MAAM,WAAW,wBAAwB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IACpE,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,IAAI,CAAC;IACpB,kHAAkH;IAClH,cAAc,CAAC,EAAE,4BAA4B,CAAC;CAC/C;AAED,yFAAyF;AACzF,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM;IACnE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,gHAAgH;IAChH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4EAA4E;IAC5E,QAAQ,EAAE,CAAC,MAAM,EAAE,wBAAwB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,MAAM,EAAE,sBAAsB,CAAC,IAAI,CAAC,CAAC;IACrC,uGAAuG;IACvG,aAAa,EAAE,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,GAAG;QAAE,aAAa,EAAE,IAAI,CAAA;KAAE,CAAC;IACjF,6CAA6C;IAC7C,mBAAmB,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,SAAS,CAAC;IAClE,iEAAiE;IACjE,kBAAkB,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,SAAS,CAAC;IAC9D,qGAAqG;IACrG,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,aAAa,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC;IACrC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,uHAAuH;IACvH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,EAAE,EAC/D,MAAM,EACN,MAAM,EACN,UAAiB,EACjB,QAAQ,EACR,cAAsB,EACtB,UAAkB,EAClB,MAAM,EACN,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,OAAc,EACd,aAAyB,EACzB,kBAA0B,EAC1B,iBAAwB,EACxB,SAAuE,GACxE,EAAE,uBAAuB,CAAC,IAAI,CAAC,+BAsH/B"}
|
|
@@ -9,6 +9,10 @@ import { SoftwareScheduleFields } from "./schedule-fields.js";
|
|
|
9
9
|
import { SOFTWARE_ACTION_COPY } from "./software-action-copy.js";
|
|
10
10
|
import { newSoftwareRow } from "./software-row.js";
|
|
11
11
|
import { SoftwareRowFields } from "./software-row-fields.js";
|
|
12
|
+
import {
|
|
13
|
+
DEFAULT_SOFTWARE_UPDATE_SETTINGS,
|
|
14
|
+
SoftwareUpdateSettingsFields
|
|
15
|
+
} from "./update-settings-fields.js";
|
|
12
16
|
const INITIAL_ROWS = () => [newSoftwareRow("row-0")];
|
|
13
17
|
function SoftwareActionForm({
|
|
14
18
|
action,
|
|
@@ -23,6 +27,7 @@ function SoftwareActionForm({
|
|
|
23
27
|
renderDevicePicker,
|
|
24
28
|
addRows = true,
|
|
25
29
|
runModeLayout = "stacked",
|
|
30
|
+
showUpdateSettings = false,
|
|
26
31
|
showDeviceHeading = true,
|
|
27
32
|
className = "px-[var(--spacing-system-l)] pb-[var(--spacing-system-l)]"
|
|
28
33
|
}) {
|
|
@@ -32,13 +37,24 @@ function SoftwareActionForm({
|
|
|
32
37
|
const [date, setDate] = useState(initialValues.date ?? null);
|
|
33
38
|
const [time, setTime] = useState(initialValues.time ?? "");
|
|
34
39
|
const [timeReference, setTimeReference] = useState(initialValues.timeReference);
|
|
40
|
+
const [updateSettings, setUpdateSettings] = useState(
|
|
41
|
+
() => initialValues.updateSettings ?? DEFAULT_SOFTWARE_UPDATE_SETTINGS
|
|
42
|
+
);
|
|
43
|
+
const withUpdateSettings = action === "UPDATE" && showUpdateSettings;
|
|
35
44
|
const osTypesKey = [...new Set(rows.map((row) => PACKAGE_MANAGER_OS[row.packageManager]))].sort().join(",");
|
|
36
45
|
const actions = [
|
|
37
46
|
...onBack ? [{ label: "Cancel", onClick: onBack, variant: "outline", showOnlyMobile: true }] : [],
|
|
38
47
|
{
|
|
39
48
|
label: mode === "now" ? copy.runLabel : copy.scheduleLabel,
|
|
40
49
|
variant: "accent",
|
|
41
|
-
onClick: () => onSubmit({
|
|
50
|
+
onClick: () => onSubmit({
|
|
51
|
+
rows,
|
|
52
|
+
mode,
|
|
53
|
+
date,
|
|
54
|
+
time,
|
|
55
|
+
timeReference,
|
|
56
|
+
updateSettings: withUpdateSettings ? updateSettings : void 0
|
|
57
|
+
}),
|
|
42
58
|
disabled: submitDisabled,
|
|
43
59
|
loading: submitting
|
|
44
60
|
}
|
|
@@ -112,6 +128,7 @@ function SoftwareActionForm({
|
|
|
112
128
|
runModeField,
|
|
113
129
|
scheduleFields
|
|
114
130
|
] }),
|
|
131
|
+
withUpdateSettings && /* @__PURE__ */ jsx(SoftwareUpdateSettingsFields, { value: updateSettings, onChange: setUpdateSettings }),
|
|
115
132
|
showDeviceHeading && /* @__PURE__ */ jsx("h2", { className: "pt-[var(--spacing-system-l)] text-ods-text-primary text-h2", children: "Device Selection" }),
|
|
116
133
|
renderDevicePicker({ osTypes: osTypesKey.split(","), osTypesKey })
|
|
117
134
|
]
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** What an update does on a device where the app is running. */
|
|
2
|
+
export type SoftwareUpdateMode = 'WAIT' | 'FORCE';
|
|
3
|
+
/** "If the app is running": one update's behaviour on a device where the app is open. */
|
|
4
|
+
export interface SoftwareUpdatePolicy {
|
|
5
|
+
mode: SoftwareUpdateMode;
|
|
6
|
+
/** WAIT only: "Countdown after the deadline". Off, the update waits for the user however long it takes. */
|
|
7
|
+
deadlineEnabled: boolean;
|
|
8
|
+
/** WAIT only: seconds after the first try before the countdown starts. */
|
|
9
|
+
deadlineSeconds: number;
|
|
10
|
+
/** Seconds of countdown before the app is closed: after the deadline (WAIT) or right away (FORCE). */
|
|
11
|
+
countdownSeconds: number;
|
|
12
|
+
}
|
|
13
|
+
/** The Update Software form's "Update Settings": this update, and whether later releases follow it. */
|
|
14
|
+
export interface SoftwareUpdateSettingsValues {
|
|
15
|
+
policy: SoftwareUpdatePolicy;
|
|
16
|
+
/** "Keep it auto-updated": every new version is installed on the same devices after this update. */
|
|
17
|
+
autoUpdate: boolean;
|
|
18
|
+
/** "Same settings for auto-update": auto-updates run with `policy`; off, with `autoUpdatePolicy`. */
|
|
19
|
+
sameForAutoUpdate: boolean;
|
|
20
|
+
autoUpdatePolicy: SoftwareUpdatePolicy;
|
|
21
|
+
}
|
|
22
|
+
export declare const SOFTWARE_UPDATE_DEADLINE_OPTIONS: ReadonlyArray<{
|
|
23
|
+
seconds: number;
|
|
24
|
+
label: string;
|
|
25
|
+
}>;
|
|
26
|
+
export declare const SOFTWARE_UPDATE_COUNTDOWN_OPTIONS: ReadonlyArray<{
|
|
27
|
+
seconds: number;
|
|
28
|
+
label: string;
|
|
29
|
+
}>;
|
|
30
|
+
/** Wait & notify, a countdown 7 days after the first try, 5 minutes long: what the server applies when sent none. */
|
|
31
|
+
export declare const DEFAULT_SOFTWARE_UPDATE_POLICY: SoftwareUpdatePolicy;
|
|
32
|
+
export declare const DEFAULT_SOFTWARE_UPDATE_SETTINGS: SoftwareUpdateSettingsValues;
|
|
33
|
+
export interface SoftwareUpdateSettingsFieldsProps {
|
|
34
|
+
value: SoftwareUpdateSettingsValues;
|
|
35
|
+
onChange: (value: SoftwareUpdateSettingsValues) => void;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Update Software's "Update Settings" (design 988:21462, the separate auto-update
|
|
39
|
+
* rules 1034:8173): what happens on a device where the app is running, and
|
|
40
|
+
* whether later releases are installed the same way.
|
|
41
|
+
*/
|
|
42
|
+
export declare function SoftwareUpdateSettingsFields({ value, onChange }: SoftwareUpdateSettingsFieldsProps): import("react").JSX.Element;
|
|
43
|
+
//# sourceMappingURL=update-settings-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-settings-fields.d.ts","sourceRoot":"","sources":["../../../../src/components/features/software/update-settings-fields.tsx"],"names":[],"mappings":"AAgBA,gEAAgE;AAChE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,CAAC;AAElD,yFAAyF;AACzF,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,kBAAkB,CAAC;IACzB,2GAA2G;IAC3G,eAAe,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,eAAe,EAAE,MAAM,CAAC;IACxB,sGAAsG;IACtG,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,uGAAuG;AACvG,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,oGAAoG;IACpG,UAAU,EAAE,OAAO,CAAC;IACpB,qGAAqG;IACrG,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,oBAAoB,CAAC;CACxC;AAKD,eAAO,MAAM,gCAAgC,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAM9F,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAK/F,CAAC;AAEF,qHAAqH;AACrH,eAAO,MAAM,8BAA8B,EAAE,oBAK5C,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,4BAK9C,CAAC;AAqHF,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,4BAA4B,CAAC;IACpC,QAAQ,EAAE,CAAC,KAAK,EAAE,4BAA4B,KAAK,IAAI,CAAC;CACzD;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,iCAAiC,+BAkElG"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { InfoCircleIcon } from "../../icons-v2-generated/index.js";
|
|
4
|
+
import {
|
|
5
|
+
Alert,
|
|
6
|
+
CheckboxBlock,
|
|
7
|
+
Label,
|
|
8
|
+
RadioGroupBlock,
|
|
9
|
+
Select,
|
|
10
|
+
SelectContent,
|
|
11
|
+
SelectItem,
|
|
12
|
+
SelectTrigger,
|
|
13
|
+
SelectValue
|
|
14
|
+
} from "../../ui/index.js";
|
|
15
|
+
const DAY = 24 * 60 * 60;
|
|
16
|
+
const MINUTE = 60;
|
|
17
|
+
const SOFTWARE_UPDATE_DEADLINE_OPTIONS = [
|
|
18
|
+
{ seconds: DAY, label: "1 day after the first try" },
|
|
19
|
+
{ seconds: 3 * DAY, label: "3 days after the first try" },
|
|
20
|
+
{ seconds: 7 * DAY, label: "7 days after the first try" },
|
|
21
|
+
{ seconds: 14 * DAY, label: "14 days after the first try" },
|
|
22
|
+
{ seconds: 30 * DAY, label: "30 days after the first try" }
|
|
23
|
+
];
|
|
24
|
+
const SOFTWARE_UPDATE_COUNTDOWN_OPTIONS = [
|
|
25
|
+
{ seconds: MINUTE, label: "1 minute" },
|
|
26
|
+
{ seconds: 5 * MINUTE, label: "5 minutes" },
|
|
27
|
+
{ seconds: 15 * MINUTE, label: "15 minutes" },
|
|
28
|
+
{ seconds: 30 * MINUTE, label: "30 minutes" }
|
|
29
|
+
];
|
|
30
|
+
const DEFAULT_SOFTWARE_UPDATE_POLICY = {
|
|
31
|
+
mode: "WAIT",
|
|
32
|
+
deadlineEnabled: true,
|
|
33
|
+
deadlineSeconds: 7 * DAY,
|
|
34
|
+
countdownSeconds: 5 * MINUTE
|
|
35
|
+
};
|
|
36
|
+
const DEFAULT_SOFTWARE_UPDATE_SETTINGS = {
|
|
37
|
+
policy: DEFAULT_SOFTWARE_UPDATE_POLICY,
|
|
38
|
+
autoUpdate: true,
|
|
39
|
+
sameForAutoUpdate: true,
|
|
40
|
+
autoUpdatePolicy: DEFAULT_SOFTWARE_UPDATE_POLICY
|
|
41
|
+
};
|
|
42
|
+
const MODE_OPTIONS = [
|
|
43
|
+
{
|
|
44
|
+
value: "WAIT",
|
|
45
|
+
label: "Wait & notify",
|
|
46
|
+
description: "The user gets Update now or Ask Later. If they close the app, it updates then."
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
value: "FORCE",
|
|
50
|
+
label: "Force Update",
|
|
51
|
+
description: "The user gets a short countdown, then the app closes and updates."
|
|
52
|
+
}
|
|
53
|
+
];
|
|
54
|
+
const SAME_SETTINGS_DESCRIPTION = {
|
|
55
|
+
WAIT: 'Auto-updates follow "If the app is running" above. Uncheck to set them separately.',
|
|
56
|
+
FORCE: "Later releases will also be force-updated."
|
|
57
|
+
};
|
|
58
|
+
const groupLabelClass = "text-h5 text-ods-text-secondary";
|
|
59
|
+
function SecondsSelect({
|
|
60
|
+
label,
|
|
61
|
+
value,
|
|
62
|
+
options,
|
|
63
|
+
onChange
|
|
64
|
+
}) {
|
|
65
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-col gap-[var(--spacing-system-xxs)]", children: [
|
|
66
|
+
/* @__PURE__ */ jsx(Label, { className: "text-h4", children: label }),
|
|
67
|
+
/* @__PURE__ */ jsxs(Select, { value: String(value), onValueChange: (next) => onChange(Number(next)), children: [
|
|
68
|
+
/* @__PURE__ */ jsx(SelectTrigger, { "aria-label": label, children: /* @__PURE__ */ jsx(SelectValue, {}) }),
|
|
69
|
+
/* @__PURE__ */ jsx(SelectContent, { children: options.map((option) => /* @__PURE__ */ jsx(SelectItem, { value: String(option.seconds), children: option.label }, option.seconds)) })
|
|
70
|
+
] })
|
|
71
|
+
] });
|
|
72
|
+
}
|
|
73
|
+
function UpdatePolicyFields({
|
|
74
|
+
name,
|
|
75
|
+
label,
|
|
76
|
+
policy,
|
|
77
|
+
onChange
|
|
78
|
+
}) {
|
|
79
|
+
const waits = policy.mode === "WAIT";
|
|
80
|
+
const deadline = waits && policy.deadlineEnabled;
|
|
81
|
+
const countdown = /* @__PURE__ */ jsx(
|
|
82
|
+
SecondsSelect,
|
|
83
|
+
{
|
|
84
|
+
label: "Countdown",
|
|
85
|
+
value: policy.countdownSeconds,
|
|
86
|
+
options: SOFTWARE_UPDATE_COUNTDOWN_OPTIONS,
|
|
87
|
+
onChange: (countdownSeconds) => onChange({ ...policy, countdownSeconds })
|
|
88
|
+
}
|
|
89
|
+
);
|
|
90
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[var(--spacing-system-m)]", children: [
|
|
91
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[var(--spacing-system-xxs)]", children: [
|
|
92
|
+
/* @__PURE__ */ jsx("span", { className: groupLabelClass, children: label }),
|
|
93
|
+
/* @__PURE__ */ jsx(
|
|
94
|
+
RadioGroupBlock,
|
|
95
|
+
{
|
|
96
|
+
name,
|
|
97
|
+
"aria-label": label,
|
|
98
|
+
variant: "grouped",
|
|
99
|
+
value: policy.mode,
|
|
100
|
+
onValueChange: (mode) => onChange({ ...policy, mode }),
|
|
101
|
+
options: MODE_OPTIONS,
|
|
102
|
+
itemClassName: "py-[var(--spacing-system-sf)]"
|
|
103
|
+
}
|
|
104
|
+
)
|
|
105
|
+
] }),
|
|
106
|
+
waits ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[var(--spacing-system-xsf)]", children: [
|
|
107
|
+
/* @__PURE__ */ jsx(
|
|
108
|
+
CheckboxBlock,
|
|
109
|
+
{
|
|
110
|
+
id: `${name}-deadline`,
|
|
111
|
+
checked: policy.deadlineEnabled,
|
|
112
|
+
onCheckedChange: (deadlineEnabled) => onChange({ ...policy, deadlineEnabled }),
|
|
113
|
+
label: "Countdown after the deadline",
|
|
114
|
+
description: "If the update still isn\u2019t installed by the deadline, the user gets a countdown and then it installs."
|
|
115
|
+
}
|
|
116
|
+
),
|
|
117
|
+
deadline && /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-[var(--spacing-system-lf)] content-md:grid-cols-3 content-md:items-start", children: [
|
|
118
|
+
/* @__PURE__ */ jsx(
|
|
119
|
+
SecondsSelect,
|
|
120
|
+
{
|
|
121
|
+
label: "Deadline",
|
|
122
|
+
value: policy.deadlineSeconds,
|
|
123
|
+
options: SOFTWARE_UPDATE_DEADLINE_OPTIONS,
|
|
124
|
+
onChange: (deadlineSeconds) => onChange({ ...policy, deadlineSeconds })
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
countdown
|
|
128
|
+
] })
|
|
129
|
+
] }) : /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-[var(--spacing-system-lf)] content-md:grid-cols-3", children: countdown })
|
|
130
|
+
] });
|
|
131
|
+
}
|
|
132
|
+
function SoftwareUpdateSettingsFields({ value, onChange }) {
|
|
133
|
+
return /* @__PURE__ */ jsxs("section", { "aria-labelledby": "software-update-settings", className: "flex flex-col gap-[var(--spacing-system-l)]", children: [
|
|
134
|
+
/* @__PURE__ */ jsx("h2", { id: "software-update-settings", className: "pt-[var(--spacing-system-l)] text-ods-text-primary text-h2", children: "Update Settings" }),
|
|
135
|
+
/* @__PURE__ */ jsx(
|
|
136
|
+
UpdatePolicyFields,
|
|
137
|
+
{
|
|
138
|
+
name: "updatePolicy",
|
|
139
|
+
label: "If the app is running",
|
|
140
|
+
policy: value.policy,
|
|
141
|
+
onChange: (policy) => onChange({ ...value, policy })
|
|
142
|
+
}
|
|
143
|
+
),
|
|
144
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[var(--spacing-system-xxs)]", children: [
|
|
145
|
+
/* @__PURE__ */ jsx("span", { className: groupLabelClass, children: "Auto-update" }),
|
|
146
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-[var(--spacing-system-sf)]", children: [
|
|
147
|
+
/* @__PURE__ */ jsx(
|
|
148
|
+
CheckboxBlock,
|
|
149
|
+
{
|
|
150
|
+
id: "software-auto-update",
|
|
151
|
+
checked: value.autoUpdate,
|
|
152
|
+
onCheckedChange: (autoUpdate) => onChange({ ...value, autoUpdate }),
|
|
153
|
+
label: "Keep it auto-updated",
|
|
154
|
+
description: "After this update, OpenFrame installs each new version from Winget or Brew on the selected devices. When off, only this update runs."
|
|
155
|
+
}
|
|
156
|
+
),
|
|
157
|
+
value.autoUpdate && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
158
|
+
/* @__PURE__ */ jsx(
|
|
159
|
+
CheckboxBlock,
|
|
160
|
+
{
|
|
161
|
+
id: "software-auto-update-same",
|
|
162
|
+
checked: value.sameForAutoUpdate,
|
|
163
|
+
onCheckedChange: (sameForAutoUpdate) => onChange({ ...value, sameForAutoUpdate }),
|
|
164
|
+
label: "Same settings for auto-update",
|
|
165
|
+
description: SAME_SETTINGS_DESCRIPTION[value.policy.mode]
|
|
166
|
+
}
|
|
167
|
+
),
|
|
168
|
+
!value.sameForAutoUpdate && /* @__PURE__ */ jsx("div", { className: "rounded-[6px] border border-ods-border p-[var(--spacing-system-m)]", children: /* @__PURE__ */ jsx(
|
|
169
|
+
UpdatePolicyFields,
|
|
170
|
+
{
|
|
171
|
+
name: "autoUpdatePolicy",
|
|
172
|
+
label: "For auto-updates",
|
|
173
|
+
policy: value.autoUpdatePolicy,
|
|
174
|
+
onChange: (autoUpdatePolicy) => onChange({ ...value, autoUpdatePolicy })
|
|
175
|
+
}
|
|
176
|
+
) })
|
|
177
|
+
] })
|
|
178
|
+
] })
|
|
179
|
+
] }),
|
|
180
|
+
/* @__PURE__ */ jsxs(
|
|
181
|
+
Alert,
|
|
182
|
+
{
|
|
183
|
+
role: "note",
|
|
184
|
+
className: "flex items-center gap-[var(--spacing-system-m)] rounded-[6px] border-ods-border bg-ods-card p-[var(--spacing-system-m)]",
|
|
185
|
+
children: [
|
|
186
|
+
/* @__PURE__ */ jsx("span", { className: "shrink-0 text-ods-text-secondary", children: /* @__PURE__ */ jsx(InfoCircleIcon, { size: 24, color: "currentColor" }) }),
|
|
187
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-[var(--spacing-system-xxs)]", children: [
|
|
188
|
+
/* @__PURE__ */ jsx("p", { className: "text-ods-text-primary text-h3", children: "Apps installed by hand get reinstalled" }),
|
|
189
|
+
/* @__PURE__ */ jsx("p", { className: "text-ods-text-secondary text-h6", children: "On the first update, OpenFrame reinstalls them with Winget or Brew so it can keep them updated." })
|
|
190
|
+
] })
|
|
191
|
+
]
|
|
192
|
+
}
|
|
193
|
+
)
|
|
194
|
+
] });
|
|
195
|
+
}
|
|
196
|
+
export {
|
|
197
|
+
DEFAULT_SOFTWARE_UPDATE_POLICY,
|
|
198
|
+
DEFAULT_SOFTWARE_UPDATE_SETTINGS,
|
|
199
|
+
SOFTWARE_UPDATE_COUNTDOWN_OPTIONS,
|
|
200
|
+
SOFTWARE_UPDATE_DEADLINE_OPTIONS,
|
|
201
|
+
SoftwareUpdateSettingsFields
|
|
202
|
+
};
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* lists its platforms; it does not hide them behind tabs, so nothing moves
|
|
6
6
|
* when a visitor looks for another system). In a card the installer is THE
|
|
7
7
|
* action (the other architecture is a quieter button) and each package
|
|
8
|
-
* manager is one
|
|
8
|
+
* manager is one row under it, with its copy button.
|
|
9
9
|
* - The mobile app: the store badges, and the install QR code beside them. The
|
|
10
10
|
* code and the address it encodes are the server's (`mobile.install`): the
|
|
11
11
|
* website's install link, which the server answers with a redirect to the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"download-apps-page.d.ts","sourceRoot":"","sources":["../../../src/components/help-center-pages/download-apps-page.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAKtD,OAAO,EASL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAErB,MAAM,uBAAuB,CAAC;AAoB/B,MAAM,WAAW,qBAAqB;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;gFAC4E;IAC5E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,UAAU,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,CAAC;IACvD,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wGAAwG;IACxG,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACxD;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnE,0GAA0G;IAC1G,GAAG,CAAC,EAAE,qBAAqB,CAAC;CAC7B;AAED,kGAAkG;AAClG,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,MAAM,EAAE,SAAS,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"download-apps-page.d.ts","sourceRoot":"","sources":["../../../src/components/help-center-pages/download-apps-page.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,KAAK,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAKtD,OAAO,EASL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAErB,MAAM,uBAAuB,CAAC;AAoB/B,MAAM,WAAW,qBAAqB;IACpC,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;gFAC4E;IAC5E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,UAAU,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,KAAK,CAAC;IACvD,6FAA6F;IAC7F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0DAA0D;IAC1D,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,wGAAwG;IACxG,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACxD;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACnE,0GAA0G;IAC1G,GAAG,CAAC,EAAE,qBAAqB,CAAC;CAC7B;AAED,kGAAkG;AAClG,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,MAAM,EAAE,SAAS,CAAC;CACnB;AAuPD,wBAAgB,gBAAgB,CAAC,EAC/B,QAA6B,EAC7B,WAAW,EACX,KAAY,EACZ,UAAkB,EAClB,KAAK,EACL,QAAQ,EACR,WAAkB,EAClB,kBAAyB,EACzB,gBAAgB,EAChB,WAAW,EACX,GAAG,GACJ,EAAE,qBAAqB,+BA2FvB"}
|
|
@@ -34,7 +34,7 @@ import { MobileAppQr } from "../ui/mobile-app-qr.js";
|
|
|
34
34
|
import { AppStoreBadge, GooglePlayBadge, StoreBadgeLinks } from "../ui/store-badges.js";
|
|
35
35
|
const SECTIONS_CLASS = "flex flex-col gap-[var(--spacing-system-xlf)]";
|
|
36
36
|
const SECTION_CLASS = "flex flex-col gap-[var(--spacing-system-lf)]";
|
|
37
|
-
const CARDS_GRID_CLASS = "grid grid-cols-1 gap-[var(--spacing-system-lf)] content-
|
|
37
|
+
const CARDS_GRID_CLASS = "grid grid-cols-1 gap-[var(--spacing-system-lf)] content-lg:grid-cols-2";
|
|
38
38
|
const cardsGridClass = (cards) => cards > 1 ? CARDS_GRID_CLASS : "grid grid-cols-1";
|
|
39
39
|
const CARD_CLASS = "flex flex-col gap-[var(--spacing-system-lf)] rounded-md border border-ods-border bg-ods-card p-[var(--spacing-system-lf)]";
|
|
40
40
|
const CARD_HEADER_CLASS = "flex items-center gap-[var(--spacing-system-sf)]";
|
|
@@ -128,8 +128,7 @@ function SystemCard({
|
|
|
128
128
|
{
|
|
129
129
|
title: row.label ?? void 0,
|
|
130
130
|
command: row.command,
|
|
131
|
-
|
|
132
|
-
commandClassName: "text-ods-accent",
|
|
131
|
+
commandClassName: "break-words text-ods-accent",
|
|
133
132
|
copyAriaLabel: `Copy the ${row.label ?? "install"} command`,
|
|
134
133
|
onCopy: () => {
|
|
135
134
|
void copy(row.command);
|