@helpwave/hightide 0.0.17 → 0.0.19
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/components/modals/ConfirmDialog.js +9 -7
- package/dist/components/modals/ConfirmDialog.js.map +1 -1
- package/dist/components/modals/ConfirmDialog.mjs +9 -7
- package/dist/components/modals/ConfirmDialog.mjs.map +1 -1
- package/dist/components/modals/DiscardChangesDialog.js +9 -7
- package/dist/components/modals/DiscardChangesDialog.js.map +1 -1
- package/dist/components/modals/DiscardChangesDialog.mjs +9 -7
- package/dist/components/modals/DiscardChangesDialog.mjs.map +1 -1
- package/dist/components/modals/InputModal.js +9 -7
- package/dist/components/modals/InputModal.js.map +1 -1
- package/dist/components/modals/InputModal.mjs +9 -7
- package/dist/components/modals/InputModal.mjs.map +1 -1
- package/dist/components/modals/LanguageModal.js +9 -7
- package/dist/components/modals/LanguageModal.js.map +1 -1
- package/dist/components/modals/LanguageModal.mjs +9 -7
- package/dist/components/modals/LanguageModal.mjs.map +1 -1
- package/dist/components/modals/Modal.js +9 -7
- package/dist/components/modals/Modal.js.map +1 -1
- package/dist/components/modals/Modal.mjs +9 -7
- package/dist/components/modals/Modal.mjs.map +1 -1
- package/dist/components/user-input/ToggleableInput.d.mts +7 -7
- package/dist/components/user-input/ToggleableInput.d.ts +7 -7
- package/dist/components/user-input/ToggleableInput.js +45 -9
- package/dist/components/user-input/ToggleableInput.js.map +1 -1
- package/dist/components/user-input/ToggleableInput.mjs +44 -9
- package/dist/components/user-input/ToggleableInput.mjs.map +1 -1
- package/dist/css/globals.css +8 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +52 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +55 -18
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/user-input/ToggleableInput.tsx","../../../src/hooks/useSaveDelay.ts","../../../src/util/noop.ts"],"sourcesContent":["import { useState } from 'react'\nimport type { HTMLInputTypeAttribute, InputHTMLAttributes } from 'react'\nimport { Pencil } from 'lucide-react'\nimport clsx from 'clsx'\nimport { useSaveDelay } from '../../hooks/useSaveDelay'\nimport { noop } from '../../util/noop'\n\ntype InputProps = {\n /**\n * used for the label's `for` attribute\n */\n id: string,\n value: string,\n /**\n * @default 'text'\n */\n type?: HTMLInputTypeAttribute,\n /**\n * Callback for when the input's value changes\n * This is pretty much required but made optional for the rare cases where it actually isn't need such as when used with disabled\n * That could be enforced through a union type but that seems a bit overkill\n * @default noop\n */\n onChange?: (text: string) => void,\n labelClassName?: string,\n initialState?: 'editing' | 'display',\n size?: number,\n disclaimer?: string,\n onEditCompleted?: (text: string) => void,\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'id' | 'value' | 'label' | 'type' | 'onChange' | 'crossOrigin'>\n\n/**\n * A Text input component for inputting text. It changes appearance upon entering the edit mode and switches\n * back to display mode on loss of focus or on enter\n *\n * The State is managed by the parent\n */\nexport const ToggleableInput = ({\n id,\n type = 'text',\n value,\n onChange = noop,\n labelClassName = '',\n initialState = 'display',\n size = 20,\n disclaimer,\n onBlur,\n onEditCompleted = noop,\n ...restProps\n}: InputProps) => {\n const [isEditing, setIsEditing] = useState(initialState !== 'display')\n const { restartTimer, clearUpdateTimer } = useSaveDelay(() => undefined, 3000)\n\n const onEditCompletedWrapper = (text: string) => {\n onEditCompleted(text)\n clearUpdateTimer()\n }\n\n return (\n <div>\n <div\n className=\"row items-center w-full gap-x-2 overflow-hidden\"\n onClick={() => !isEditing ? setIsEditing(!isEditing) : undefined}\n >\n <div className={clsx('row overflow-hidden', { 'flex-1': isEditing })}>\n {isEditing ? (\n <input\n autoFocus\n {...restProps}\n value={value}\n type={type}\n id={id}\n onChange={event => {\n const value = event.target.value\n restartTimer(() => {\n onEditCompletedWrapper(value)\n })\n onChange(value)\n }}\n onBlur={(event) => {\n if (onBlur) {\n onBlur(event)\n }\n onEditCompletedWrapper(value)\n setIsEditing(false)\n }}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n setIsEditing(false)\n onEditCompletedWrapper(value)\n }\n }}\n className={clsx(labelClassName, `w-full border-none rounded-none focus:ring-0 shadow-transparent decoration-primary p-0 underline-offset-4`, {\n underline: isEditing\n })}\n onFocus={event => event.target.select()}\n />\n ) : (\n <span\n className={clsx(labelClassName, 'max-w-xs break-words overflow-hidden')}\n >\n {value}\n </span>\n )}\n </div>\n <Pencil className={clsx(`min-w-[${size}px] cursor-pointer`, { 'text-transparent': isEditing })} size={size} />\n </div>\n {(isEditing && disclaimer) && (\n <label className=\"text-negative\">\n {disclaimer}\n </label>\n )}\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\n\nexport function useSaveDelay(setNotificationStatus: (isShowing: boolean) => void, delay: number) {\n const [updateTimer, setUpdateTimer] = useState<NodeJS.Timeout | undefined>(undefined)\n const [notificationTimer, setNotificationTimer] = useState<NodeJS.Timeout | undefined>(undefined)\n\n const restartTimer = (onSave: () => void) => {\n clearTimeout(updateTimer)\n setUpdateTimer(setTimeout(() => {\n onSave()\n setNotificationStatus(true)\n // Show Saved Notification for fade animation duration\n clearTimeout(notificationTimer)\n setNotificationTimer(setTimeout(() => {\n setNotificationStatus(false)\n clearTimeout(notificationTimer)\n }, delay))\n clearTimeout(updateTimer)\n }, delay))\n }\n\n const clearUpdateTimer = (hasSaved = true) => {\n clearTimeout(updateTimer)\n if (hasSaved) {\n setNotificationStatus(true)\n clearTimeout(notificationTimer)\n setNotificationTimer(setTimeout(() => {\n setNotificationStatus(false)\n clearTimeout(notificationTimer)\n }, delay))\n } else {\n setNotificationStatus(false)\n }\n }\n\n useEffect(() => {\n return () => {\n clearTimeout(updateTimer)\n clearTimeout(notificationTimer)\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return { restartTimer, clearUpdateTimer }\n}","export const noop = () => undefined\n"],"mappings":"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","names":["useState","useState","value"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/user-input/ToggleableInput.tsx","../../../src/hooks/useSaveDelay.ts","../../../src/util/noop.ts"],"sourcesContent":["import type { HTMLInputTypeAttribute, InputHTMLAttributes } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { Pencil } from 'lucide-react'\nimport clsx from 'clsx'\nimport { useSaveDelay } from '../../hooks/useSaveDelay'\nimport { noop } from '../../util/noop'\n\ntype InputProps = {\n /**\n * The value\n */\n value: string,\n /**\n * @default 'text'\n */\n type?: HTMLInputTypeAttribute,\n /**\n * Callback for when the input's value changes\n * This is pretty much required but made optional for the rare cases where it actually isn't need such as when used with disabled\n * That could be enforced through a union type but that seems a bit overkill\n * @default noop\n */\n onChangeText?: (text: string) => void,\n onEditCompleted?: (text: string) => void,\n labelClassName?: string,\n initialState?: 'editing' | 'display',\n size?: number,\n disclaimer?: string,\n} & Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'label' | 'type' | 'crossOrigin'>\n\n/**\n * A Text input component for inputting text. It changes appearance upon entering the edit mode and switches\n * back to display mode on loss of focus or on enter\n *\n * The State is managed by the parent\n */\nexport const ToggleableInput = ({\n type = 'text',\n value,\n onChange = noop,\n onChangeText = noop,\n onEditCompleted = noop,\n labelClassName = '',\n initialState = 'display',\n size = 20,\n disclaimer,\n onBlur,\n ...restProps\n }: InputProps) => {\n const [isEditing, setIsEditing] = useState(initialState !== 'display')\n const { restartTimer, clearUpdateTimer } = useSaveDelay(() => undefined, 3000)\n const ref = useRef<HTMLInputElement>(null)\n\n const onEditCompletedWrapper = (text: string) => {\n onEditCompleted(text)\n clearUpdateTimer()\n }\n\n useEffect(() => {\n if (isEditing) {\n ref.current?.focus()\n }\n }, [isEditing])\n\n return (\n <div>\n <div\n className=\"row items-center w-full gap-x-2 overflow-hidden\"\n onClick={() => !isEditing ? setIsEditing(!isEditing) : undefined}\n >\n <div className={clsx('row overflow-hidden', { 'flex-1': isEditing })}>\n {isEditing ? (\n <input\n ref={ref}\n {...restProps}\n value={value}\n type={type}\n onChange={event => {\n const value = event.target.value\n restartTimer(() => {\n onEditCompletedWrapper(value)\n })\n onChangeText(value)\n onChange(event)\n }}\n onBlur={(event) => {\n if (onBlur) {\n onBlur(event)\n }\n onEditCompletedWrapper(value)\n setIsEditing(false)\n }}\n onKeyDown={event => {\n if (event.key === 'Enter') {\n setIsEditing(false)\n onEditCompletedWrapper(value)\n }\n }}\n className={clsx(labelClassName, `w-full border-none rounded-none ring-0 outline-0 shadow-transparent decoration-primary p-0 underline-offset-4`, {\n underline: isEditing\n })}\n onFocus={event => event.target.select()}\n />\n ) : (\n <span\n className={clsx(labelClassName, 'max-w-xs break-words overflow-hidden')}\n >\n {value}\n </span>\n )}\n </div>\n <Pencil\n className={clsx(`cursor-pointer`, { 'text-transparent': isEditing })}\n size={size}\n style={{ minWidth: `${size}px` }}\n />\n </div>\n {(isEditing && disclaimer) && (\n <label className=\"text-negative\">\n {disclaimer}\n </label>\n )}\n </div>\n )\n}\n\nexport const ToggleableInputUncontrolled = ({\n value: initialValue,\n onChangeText = noop,\n ...restProps\n }: InputProps) => {\n const [value, setValue] = useState(initialValue)\n\n useEffect(() => {\n setValue(initialValue)\n }, [initialValue])\n\n return (\n <ToggleableInput\n value={value}\n onChangeText={text => {\n setValue(text)\n onChangeText(text)\n }}\n {...restProps}\n />\n )\n}\n","import { useEffect, useState } from 'react'\n\nexport function useSaveDelay(setNotificationStatus: (isShowing: boolean) => void, delay: number) {\n const [updateTimer, setUpdateTimer] = useState<NodeJS.Timeout | undefined>(undefined)\n const [notificationTimer, setNotificationTimer] = useState<NodeJS.Timeout | undefined>(undefined)\n\n const restartTimer = (onSave: () => void) => {\n clearTimeout(updateTimer)\n setUpdateTimer(setTimeout(() => {\n onSave()\n setNotificationStatus(true)\n // Show Saved Notification for fade animation duration\n clearTimeout(notificationTimer)\n setNotificationTimer(setTimeout(() => {\n setNotificationStatus(false)\n clearTimeout(notificationTimer)\n }, delay))\n clearTimeout(updateTimer)\n }, delay))\n }\n\n const clearUpdateTimer = (hasSaved = true) => {\n clearTimeout(updateTimer)\n if (hasSaved) {\n setNotificationStatus(true)\n clearTimeout(notificationTimer)\n setNotificationTimer(setTimeout(() => {\n setNotificationStatus(false)\n clearTimeout(notificationTimer)\n }, delay))\n } else {\n setNotificationStatus(false)\n }\n }\n\n useEffect(() => {\n return () => {\n clearTimeout(updateTimer)\n clearTimeout(notificationTimer)\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n return { restartTimer, clearUpdateTimer }\n}","export const noop = () => undefined\n"],"mappings":"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","names":["useEffect","useState","useState","useEffect","value"]}
|
package/dist/css/globals.css
CHANGED
|
@@ -1538,6 +1538,10 @@
|
|
|
1538
1538
|
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
1539
1539
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
1540
1540
|
}
|
|
1541
|
+
.ring-0 {
|
|
1542
|
+
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
1543
|
+
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
1544
|
+
}
|
|
1541
1545
|
.ring-1 {
|
|
1542
1546
|
--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);
|
|
1543
1547
|
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
|
@@ -1562,6 +1566,10 @@
|
|
|
1562
1566
|
outline-style: var(--tw-outline-style);
|
|
1563
1567
|
outline-width: 1px;
|
|
1564
1568
|
}
|
|
1569
|
+
.outline-0 {
|
|
1570
|
+
outline-style: var(--tw-outline-style);
|
|
1571
|
+
outline-width: 0px;
|
|
1572
|
+
}
|
|
1565
1573
|
.outline-primary {
|
|
1566
1574
|
outline-color: var(--color-primary);
|
|
1567
1575
|
}
|
package/dist/index.d.mts
CHANGED
|
@@ -61,7 +61,7 @@ export { ScrollPicker, ScrollPickerProps } from './components/user-input/ScrollP
|
|
|
61
61
|
export { SearchableSelect, SearchableSelectProps } from './components/user-input/SearchableSelect.mjs';
|
|
62
62
|
export { Select, SelectOption, SelectProps } from './components/user-input/Select.mjs';
|
|
63
63
|
export { Textarea, TextareaProps } from './components/user-input/Textarea.mjs';
|
|
64
|
-
export { ToggleableInput } from './components/user-input/ToggleableInput.mjs';
|
|
64
|
+
export { ToggleableInput, ToggleableInputUncontrolled } from './components/user-input/ToggleableInput.mjs';
|
|
65
65
|
export { useHoverState } from './hooks/useHoverState.mjs';
|
|
66
66
|
export { DEFAULT_LANGUAGE, LanguageContext, LanguageContextValue, Languages, ProvideLanguage, languages, languagesLocalNames, useLanguage, useLocale } from './hooks/useLanguage.mjs';
|
|
67
67
|
export { useLocalStorage } from './hooks/useLocalStorage.mjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -61,7 +61,7 @@ export { ScrollPicker, ScrollPickerProps } from './components/user-input/ScrollP
|
|
|
61
61
|
export { SearchableSelect, SearchableSelectProps } from './components/user-input/SearchableSelect.js';
|
|
62
62
|
export { Select, SelectOption, SelectProps } from './components/user-input/Select.js';
|
|
63
63
|
export { Textarea, TextareaProps } from './components/user-input/Textarea.js';
|
|
64
|
-
export { ToggleableInput } from './components/user-input/ToggleableInput.js';
|
|
64
|
+
export { ToggleableInput, ToggleableInputUncontrolled } from './components/user-input/ToggleableInput.js';
|
|
65
65
|
export { useHoverState } from './hooks/useHoverState.js';
|
|
66
66
|
export { DEFAULT_LANGUAGE, LanguageContext, LanguageContextValue, Languages, ProvideLanguage, languages, languagesLocalNames, useLanguage, useLocale } from './hooks/useLanguage.js';
|
|
67
67
|
export { useLocalStorage } from './hooks/useLocalStorage.js';
|
package/dist/index.js
CHANGED
|
@@ -120,6 +120,7 @@ __export(index_exports, {
|
|
|
120
120
|
TimeDisplay: () => TimeDisplay,
|
|
121
121
|
TimePicker: () => TimePicker,
|
|
122
122
|
ToggleableInput: () => ToggleableInput,
|
|
123
|
+
ToggleableInputUncontrolled: () => ToggleableInputUncontrolled,
|
|
123
124
|
Tooltip: () => Tooltip,
|
|
124
125
|
UncontrolledCheckbox: () => UncontrolledCheckbox,
|
|
125
126
|
UncontrolledInput: () => UncontrolledInput,
|
|
@@ -4057,14 +4058,16 @@ var ModalHeader = ({
|
|
|
4057
4058
|
descriptionText = ""
|
|
4058
4059
|
}) => {
|
|
4059
4060
|
const translation = useTranslation(defaultModalHeaderTranslation, overwriteTranslation);
|
|
4061
|
+
const hasTitleRow = !!title || !!titleText || !!onCloseClick;
|
|
4062
|
+
const titleRow = /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "row justify-between items-start gap-x-8", children: [
|
|
4063
|
+
title ?? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: (0, import_clsx32.default)("textstyle-title-lg", {
|
|
4064
|
+
"mb-1": description || descriptionText
|
|
4065
|
+
}), children: titleText }),
|
|
4066
|
+
!!onCloseClick && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Tooltip, { tooltip: translation.close, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("button", { className: "row bg-gray-200 hover:bg-gray-300 rounded-md p-1", onClick: onCloseClick, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_lucide_react14.X, {}) }) })
|
|
4067
|
+
] });
|
|
4060
4068
|
return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "col", children: [
|
|
4061
|
-
|
|
4062
|
-
|
|
4063
|
-
"mb-1": description || descriptionText
|
|
4064
|
-
}), children: titleText }),
|
|
4065
|
-
!!onCloseClick && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(Tooltip, { tooltip: translation.close, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("button", { className: "row bg-gray-200 hover:bg-gray-300 rounded-md p-1", onClick: onCloseClick, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_lucide_react14.X, {}) }) })
|
|
4066
|
-
] }),
|
|
4067
|
-
description ?? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "textstyle-description", children: descriptionText })
|
|
4069
|
+
hasTitleRow && titleRow,
|
|
4070
|
+
description ?? (descriptionText && /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: "textstyle-description", children: descriptionText }))
|
|
4068
4071
|
] });
|
|
4069
4072
|
};
|
|
4070
4073
|
var modalRootName = "modal-root";
|
|
@@ -5422,24 +5425,30 @@ var import_lucide_react25 = require("lucide-react");
|
|
|
5422
5425
|
var import_clsx45 = __toESM(require("clsx"));
|
|
5423
5426
|
var import_jsx_runtime63 = require("react/jsx-runtime");
|
|
5424
5427
|
var ToggleableInput = ({
|
|
5425
|
-
id,
|
|
5426
5428
|
type = "text",
|
|
5427
5429
|
value,
|
|
5428
5430
|
onChange = noop,
|
|
5431
|
+
onChangeText = noop,
|
|
5432
|
+
onEditCompleted = noop,
|
|
5429
5433
|
labelClassName = "",
|
|
5430
5434
|
initialState = "display",
|
|
5431
5435
|
size = 20,
|
|
5432
5436
|
disclaimer,
|
|
5433
5437
|
onBlur,
|
|
5434
|
-
onEditCompleted = noop,
|
|
5435
5438
|
...restProps
|
|
5436
5439
|
}) => {
|
|
5437
5440
|
const [isEditing, setIsEditing] = (0, import_react29.useState)(initialState !== "display");
|
|
5438
5441
|
const { restartTimer, clearUpdateTimer } = useSaveDelay(() => void 0, 3e3);
|
|
5442
|
+
const ref = (0, import_react29.useRef)(null);
|
|
5439
5443
|
const onEditCompletedWrapper = (text) => {
|
|
5440
5444
|
onEditCompleted(text);
|
|
5441
5445
|
clearUpdateTimer();
|
|
5442
5446
|
};
|
|
5447
|
+
(0, import_react29.useEffect)(() => {
|
|
5448
|
+
if (isEditing) {
|
|
5449
|
+
ref.current?.focus();
|
|
5450
|
+
}
|
|
5451
|
+
}, [isEditing]);
|
|
5443
5452
|
return /* @__PURE__ */ (0, import_jsx_runtime63.jsxs)("div", { children: [
|
|
5444
5453
|
/* @__PURE__ */ (0, import_jsx_runtime63.jsxs)(
|
|
5445
5454
|
"div",
|
|
@@ -5450,17 +5459,17 @@ var ToggleableInput = ({
|
|
|
5450
5459
|
/* @__PURE__ */ (0, import_jsx_runtime63.jsx)("div", { className: (0, import_clsx45.default)("row overflow-hidden", { "flex-1": isEditing }), children: isEditing ? /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
|
|
5451
5460
|
"input",
|
|
5452
5461
|
{
|
|
5453
|
-
|
|
5462
|
+
ref,
|
|
5454
5463
|
...restProps,
|
|
5455
5464
|
value,
|
|
5456
5465
|
type,
|
|
5457
|
-
id,
|
|
5458
5466
|
onChange: (event) => {
|
|
5459
5467
|
const value2 = event.target.value;
|
|
5460
5468
|
restartTimer(() => {
|
|
5461
5469
|
onEditCompletedWrapper(value2);
|
|
5462
5470
|
});
|
|
5463
|
-
|
|
5471
|
+
onChangeText(value2);
|
|
5472
|
+
onChange(event);
|
|
5464
5473
|
},
|
|
5465
5474
|
onBlur: (event) => {
|
|
5466
5475
|
if (onBlur) {
|
|
@@ -5475,7 +5484,7 @@ var ToggleableInput = ({
|
|
|
5475
5484
|
onEditCompletedWrapper(value);
|
|
5476
5485
|
}
|
|
5477
5486
|
},
|
|
5478
|
-
className: (0, import_clsx45.default)(labelClassName, `w-full border-none rounded-none
|
|
5487
|
+
className: (0, import_clsx45.default)(labelClassName, `w-full border-none rounded-none ring-0 outline-0 shadow-transparent decoration-primary p-0 underline-offset-4`, {
|
|
5479
5488
|
underline: isEditing
|
|
5480
5489
|
}),
|
|
5481
5490
|
onFocus: (event) => event.target.select()
|
|
@@ -5487,13 +5496,41 @@ var ToggleableInput = ({
|
|
|
5487
5496
|
children: value
|
|
5488
5497
|
}
|
|
5489
5498
|
) }),
|
|
5490
|
-
/* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
|
|
5499
|
+
/* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
|
|
5500
|
+
import_lucide_react25.Pencil,
|
|
5501
|
+
{
|
|
5502
|
+
className: (0, import_clsx45.default)(`cursor-pointer`, { "text-transparent": isEditing }),
|
|
5503
|
+
size,
|
|
5504
|
+
style: { minWidth: `${size}px` }
|
|
5505
|
+
}
|
|
5506
|
+
)
|
|
5491
5507
|
]
|
|
5492
5508
|
}
|
|
5493
5509
|
),
|
|
5494
5510
|
isEditing && disclaimer && /* @__PURE__ */ (0, import_jsx_runtime63.jsx)("label", { className: "text-negative", children: disclaimer })
|
|
5495
5511
|
] });
|
|
5496
5512
|
};
|
|
5513
|
+
var ToggleableInputUncontrolled = ({
|
|
5514
|
+
value: initialValue,
|
|
5515
|
+
onChangeText = noop,
|
|
5516
|
+
...restProps
|
|
5517
|
+
}) => {
|
|
5518
|
+
const [value, setValue] = (0, import_react29.useState)(initialValue);
|
|
5519
|
+
(0, import_react29.useEffect)(() => {
|
|
5520
|
+
setValue(initialValue);
|
|
5521
|
+
}, [initialValue]);
|
|
5522
|
+
return /* @__PURE__ */ (0, import_jsx_runtime63.jsx)(
|
|
5523
|
+
ToggleableInput,
|
|
5524
|
+
{
|
|
5525
|
+
value,
|
|
5526
|
+
onChangeText: (text) => {
|
|
5527
|
+
setValue(text);
|
|
5528
|
+
onChangeText(text);
|
|
5529
|
+
},
|
|
5530
|
+
...restProps
|
|
5531
|
+
}
|
|
5532
|
+
);
|
|
5533
|
+
};
|
|
5497
5534
|
|
|
5498
5535
|
// src/hooks/useTheme.tsx
|
|
5499
5536
|
var import_react30 = require("react");
|
|
@@ -5659,6 +5696,7 @@ var filterNews = (localizedNews, requiredKeys) => {
|
|
|
5659
5696
|
TimeDisplay,
|
|
5660
5697
|
TimePicker,
|
|
5661
5698
|
ToggleableInput,
|
|
5699
|
+
ToggleableInputUncontrolled,
|
|
5662
5700
|
Tooltip,
|
|
5663
5701
|
UncontrolledCheckbox,
|
|
5664
5702
|
UncontrolledInput,
|