@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.
Files changed (34) hide show
  1. package/dist/components/modals/ConfirmDialog.js +9 -7
  2. package/dist/components/modals/ConfirmDialog.js.map +1 -1
  3. package/dist/components/modals/ConfirmDialog.mjs +9 -7
  4. package/dist/components/modals/ConfirmDialog.mjs.map +1 -1
  5. package/dist/components/modals/DiscardChangesDialog.js +9 -7
  6. package/dist/components/modals/DiscardChangesDialog.js.map +1 -1
  7. package/dist/components/modals/DiscardChangesDialog.mjs +9 -7
  8. package/dist/components/modals/DiscardChangesDialog.mjs.map +1 -1
  9. package/dist/components/modals/InputModal.js +9 -7
  10. package/dist/components/modals/InputModal.js.map +1 -1
  11. package/dist/components/modals/InputModal.mjs +9 -7
  12. package/dist/components/modals/InputModal.mjs.map +1 -1
  13. package/dist/components/modals/LanguageModal.js +9 -7
  14. package/dist/components/modals/LanguageModal.js.map +1 -1
  15. package/dist/components/modals/LanguageModal.mjs +9 -7
  16. package/dist/components/modals/LanguageModal.mjs.map +1 -1
  17. package/dist/components/modals/Modal.js +9 -7
  18. package/dist/components/modals/Modal.js.map +1 -1
  19. package/dist/components/modals/Modal.mjs +9 -7
  20. package/dist/components/modals/Modal.mjs.map +1 -1
  21. package/dist/components/user-input/ToggleableInput.d.mts +7 -7
  22. package/dist/components/user-input/ToggleableInput.d.ts +7 -7
  23. package/dist/components/user-input/ToggleableInput.js +45 -9
  24. package/dist/components/user-input/ToggleableInput.js.map +1 -1
  25. package/dist/components/user-input/ToggleableInput.mjs +44 -9
  26. package/dist/components/user-input/ToggleableInput.mjs.map +1 -1
  27. package/dist/css/globals.css +8 -0
  28. package/dist/index.d.mts +1 -1
  29. package/dist/index.d.ts +1 -1
  30. package/dist/index.js +52 -14
  31. package/dist/index.js.map +1 -1
  32. package/dist/index.mjs +55 -18
  33. package/dist/index.mjs.map +1 -1
  34. 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"]}
@@ -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
- /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("div", { className: "row justify-between items-start gap-x-8", children: [
4062
- title ?? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)("span", { className: (0, import_clsx32.default)("textstyle-title-lg", {
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
- autoFocus: true,
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
- onChange(value2);
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 focus:ring-0 shadow-transparent decoration-primary p-0 underline-offset-4`, {
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)(import_lucide_react25.Pencil, { className: (0, import_clsx45.default)(`min-w-[${size}px] cursor-pointer`, { "text-transparent": isEditing }), size })
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,