@cloudflare/kumo 1.1.0 → 1.3.0

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 (152) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +21 -0
  3. package/ai/component-registry.json +111 -3
  4. package/ai/component-registry.md +9 -2
  5. package/ai/schemas.ts +3 -1
  6. package/dist/.build-complete +1 -1
  7. package/dist/{breadcrumbs-B5SY2CWj.js → breadcrumbs-DyKi7BcP.js} +2 -2
  8. package/dist/{breadcrumbs-B5SY2CWj.js.map → breadcrumbs-DyKi7BcP.js.map} +1 -1
  9. package/dist/{button-E2-hZMZE.js → button-Bh96oxRL.js} +3 -3
  10. package/dist/{button-E2-hZMZE.js.map → button-Bh96oxRL.js.map} +1 -1
  11. package/dist/catalog.js +1 -1
  12. package/dist/{checkbox-BexIU_lZ.js → checkbox-C1LPq8eL.js} +3 -3
  13. package/dist/{checkbox-BexIU_lZ.js.map → checkbox-C1LPq8eL.js.map} +1 -1
  14. package/dist/{clipboard-text-BFHWMjmr.js → clipboard-text-CJSI9X2m.js} +3 -3
  15. package/dist/{clipboard-text-BFHWMjmr.js.map → clipboard-text-CJSI9X2m.js.map} +1 -1
  16. package/dist/{combobox-Dld0kS0U.js → combobox-CWxn5aHA.js} +4 -4
  17. package/dist/{combobox-Dld0kS0U.js.map → combobox-CWxn5aHA.js.map} +1 -1
  18. package/dist/command-line/cli.js +0 -0
  19. package/dist/command-line/commands/add.js +0 -0
  20. package/dist/command-line/commands/blocks.js +0 -0
  21. package/dist/command-line/commands/doc.js +0 -0
  22. package/dist/command-line/commands/init.js +0 -0
  23. package/dist/command-line/commands/ls.js +0 -0
  24. package/dist/{command-palette-BgQ680BG.js → command-palette-BxmGYxBv.js} +2 -2
  25. package/dist/{command-palette-BgQ680BG.js.map → command-palette-BxmGYxBv.js.map} +1 -1
  26. package/dist/components/breadcrumbs.js +1 -1
  27. package/dist/components/button.js +1 -1
  28. package/dist/components/checkbox.js +1 -1
  29. package/dist/components/clipboard-text.js +1 -1
  30. package/dist/components/combobox.js +1 -1
  31. package/dist/components/command-palette.js +1 -1
  32. package/dist/components/dialog.js +1 -1
  33. package/dist/components/dropdown.js +1 -1
  34. package/dist/components/empty.js +1 -1
  35. package/dist/components/field.js +1 -1
  36. package/dist/components/input.js +3 -3
  37. package/dist/components/label.js +1 -1
  38. package/dist/components/link.js +1 -1
  39. package/dist/components/menubar.js +1 -1
  40. package/dist/components/meter.js +1 -1
  41. package/dist/components/pagination.js +1 -1
  42. package/dist/components/popover.js +1 -1
  43. package/dist/components/radio.js +1 -1
  44. package/dist/components/select.js +1 -1
  45. package/dist/components/sensitive-input.js +1 -1
  46. package/dist/components/switch.js +1 -1
  47. package/dist/components/table.js +1 -1
  48. package/dist/components/tabs.js +1 -1
  49. package/dist/components/toast.js +6 -4
  50. package/dist/components/tooltip.js +1 -1
  51. package/dist/{dialog-B1TaN0oR.js → dialog-x9n9wI13.js} +18 -18
  52. package/dist/dialog-x9n9wI13.js.map +1 -0
  53. package/dist/{dropdown-D0rhYKeG.js → dropdown-BAyk1knz.js} +7 -7
  54. package/dist/{dropdown-D0rhYKeG.js.map → dropdown-BAyk1knz.js.map} +1 -1
  55. package/dist/{empty-DzCqjea-.js → empty-D03cbzRS.js} +2 -2
  56. package/dist/{empty-DzCqjea-.js.map → empty-D03cbzRS.js.map} +1 -1
  57. package/dist/{field-V3J0Ql_V.js → field-B7ORz5ej.js} +3 -3
  58. package/dist/{field-V3J0Ql_V.js.map → field-B7ORz5ej.js.map} +1 -1
  59. package/dist/index.js +268 -121
  60. package/dist/index.js.map +1 -1
  61. package/dist/{input-Dqvc2AB_.js → input-D6YgDfDG.js} +3 -3
  62. package/dist/{input-Dqvc2AB_.js.map → input-D6YgDfDG.js.map} +1 -1
  63. package/dist/{input-area-B9qajxvZ.js → input-area-DN_Ncliw.js} +10 -10
  64. package/dist/{input-area-B9qajxvZ.js.map → input-area-DN_Ncliw.js.map} +1 -1
  65. package/dist/{input-group-Bl6tgD5-.js → input-group-BXzBwH4p.js} +29 -29
  66. package/dist/{input-group-Bl6tgD5-.js.map → input-group-BXzBwH4p.js.map} +1 -1
  67. package/dist/{label-87HQArUG.js → label-B4FY8MX_.js} +2 -2
  68. package/dist/{label-87HQArUG.js.map → label-B4FY8MX_.js.map} +1 -1
  69. package/dist/{link-6TIZ4JIw.js → link-CcuZKqob.js} +8 -8
  70. package/dist/{link-6TIZ4JIw.js.map → link-CcuZKqob.js.map} +1 -1
  71. package/dist/{menubar-DLwLRFB1.js → menubar-CzimiryS.js} +2 -2
  72. package/dist/{menubar-DLwLRFB1.js.map → menubar-CzimiryS.js.map} +1 -1
  73. package/dist/{meter-DKUuvXxS.js → meter-BrJnHJ3Q.js} +2 -2
  74. package/dist/{meter-DKUuvXxS.js.map → meter-BrJnHJ3Q.js.map} +1 -1
  75. package/dist/{pagination-C4HQqodz.js → pagination-D0x9KQSk.js} +2 -2
  76. package/dist/{pagination-C4HQqodz.js.map → pagination-D0x9KQSk.js.map} +1 -1
  77. package/dist/{popover-DhdIqrP7.js → popover-CtKDH8Yc.js} +11 -11
  78. package/dist/{popover-DhdIqrP7.js.map → popover-CtKDH8Yc.js.map} +1 -1
  79. package/dist/primitives/accordion.js +1 -1
  80. package/dist/primitives/alert-dialog.js +1 -1
  81. package/dist/primitives/autocomplete.js +1 -1
  82. package/dist/primitives/avatar.js +1 -1
  83. package/dist/primitives/button.js +1 -1
  84. package/dist/primitives/checkbox-group.js +1 -1
  85. package/dist/primitives/checkbox.js +1 -1
  86. package/dist/primitives/collapsible.js +1 -1
  87. package/dist/primitives/combobox.js +1 -1
  88. package/dist/primitives/context-menu.js +1 -1
  89. package/dist/primitives/dialog.js +1 -1
  90. package/dist/primitives/direction-provider.js +1 -1
  91. package/dist/primitives/field.js +1 -1
  92. package/dist/primitives/fieldset.js +1 -1
  93. package/dist/primitives/form.js +1 -1
  94. package/dist/primitives/input.js +1 -1
  95. package/dist/primitives/menu.js +1 -1
  96. package/dist/primitives/menubar.js +1 -1
  97. package/dist/primitives/meter.js +1 -1
  98. package/dist/primitives/navigation-menu.js +1 -1
  99. package/dist/primitives/number-field.js +1 -1
  100. package/dist/primitives/popover.js +1 -1
  101. package/dist/primitives/preview-card.js +1 -1
  102. package/dist/primitives/progress.js +1 -1
  103. package/dist/primitives/radio-group.js +1 -1
  104. package/dist/primitives/radio.js +1 -1
  105. package/dist/primitives/scroll-area.js +1 -1
  106. package/dist/primitives/select.js +1 -1
  107. package/dist/primitives/separator.js +1 -1
  108. package/dist/primitives/slider.js +1 -1
  109. package/dist/primitives/switch.js +1 -1
  110. package/dist/primitives/tabs.js +1 -1
  111. package/dist/primitives/toast.js +1 -1
  112. package/dist/primitives/toggle-group.js +1 -1
  113. package/dist/primitives/toggle.js +1 -1
  114. package/dist/primitives/toolbar.js +1 -1
  115. package/dist/primitives/tooltip.js +1 -1
  116. package/dist/primitives.js +1 -1
  117. package/dist/{radio-BVAG7hNp.js → radio-CYejLANA.js} +6 -6
  118. package/dist/{radio-BVAG7hNp.js.map → radio-CYejLANA.js.map} +1 -1
  119. package/dist/{schemas-Cbid4MwW.js → schemas-C2YJKpDC.js} +5 -1
  120. package/dist/{schemas-Cbid4MwW.js.map → schemas-C2YJKpDC.js.map} +1 -1
  121. package/dist/{select-B5Vb3zou.js → select-D4rKQAax.js} +4 -4
  122. package/dist/{select-B5Vb3zou.js.map → select-D4rKQAax.js.map} +1 -1
  123. package/dist/{sensitive-input-D5HCV04N.js → sensitive-input-DYvAmxkN.js} +19 -19
  124. package/dist/{sensitive-input-D5HCV04N.js.map → sensitive-input-DYvAmxkN.js.map} +1 -1
  125. package/dist/src/blocks/delete-resource/delete-resource.d.ts +46 -0
  126. package/dist/src/blocks/delete-resource/delete-resource.d.ts.map +1 -0
  127. package/dist/src/blocks/delete-resource/index.d.ts +2 -0
  128. package/dist/src/blocks/delete-resource/index.d.ts.map +1 -0
  129. package/dist/src/components/dialog/dialog.d.ts +1 -1
  130. package/dist/src/components/toast/index.d.ts +2 -0
  131. package/dist/src/components/toast/index.d.ts.map +1 -1
  132. package/dist/src/components/toast/toast.d.ts +53 -3
  133. package/dist/src/components/toast/toast.d.ts.map +1 -1
  134. package/dist/src/index.d.ts +2 -1
  135. package/dist/src/index.d.ts.map +1 -1
  136. package/dist/styles/kumo-standalone.css +1 -1
  137. package/dist/{switch-D4duMhJ0.js → switch-z7FE1nQE.js} +3 -3
  138. package/dist/{switch-D4duMhJ0.js.map → switch-z7FE1nQE.js.map} +1 -1
  139. package/dist/{table-KuvHGpL8.js → table-Sd2Etb1N.js} +2 -2
  140. package/dist/{table-KuvHGpL8.js.map → table-Sd2Etb1N.js.map} +1 -1
  141. package/dist/{tabs-lQup-IbT.js → tabs-DAEeuQLd.js} +2 -2
  142. package/dist/{tabs-lQup-IbT.js.map → tabs-DAEeuQLd.js.map} +1 -1
  143. package/dist/toast-B8ebpHaU.js +248 -0
  144. package/dist/toast-B8ebpHaU.js.map +1 -0
  145. package/dist/{tooltip-DJWsDTWJ.js → tooltip-C4DRhJi1.js} +6 -6
  146. package/dist/{tooltip-DJWsDTWJ.js.map → tooltip-C4DRhJi1.js.map} +1 -1
  147. package/dist/{vendor-base-ui-DWIDNgE1.js → vendor-base-ui-kX0wjdav.js} +32 -31
  148. package/dist/{vendor-base-ui-DWIDNgE1.js.map → vendor-base-ui-kX0wjdav.js.map} +1 -1
  149. package/package.json +46 -46
  150. package/dist/dialog-B1TaN0oR.js.map +0 -1
  151. package/dist/toast-8YyyQuqZ.js +0 -69
  152. package/dist/toast-8YyyQuqZ.js.map +0 -1
@@ -3,10 +3,10 @@ import { jsxs as n, jsx as e, Fragment as j } from "react/jsx-runtime";
3
3
  import { CaretUpDownIcon as F, CheckIcon as C } from "@phosphor-icons/react";
4
4
  import { useId as A } from "react";
5
5
  import { c as g } from "./cn-Bhsu1vx2.js";
6
- import { b as O } from "./button-E2-hZMZE.js";
6
+ import { b as O } from "./button-Bh96oxRL.js";
7
7
  import { S as P } from "./skeleton-line-CtpS1u1J.js";
8
- import { F as z } from "./field-V3J0Ql_V.js";
9
- import { aC as D, aD as T, aE as V, aF as B, aG as E, aH as G, aI as H, aJ as J, aK as K, aL as R } from "./vendor-base-ui-DWIDNgE1.js";
8
+ import { F as z } from "./field-B7ORz5ej.js";
9
+ import { aC as D, aD as T, aE as V, aF as B, aG as E, aH as G, aI as H, aJ as J, aK as K, aL as R } from "./vendor-base-ui-kX0wjdav.js";
10
10
  function U({
11
11
  children: r,
12
12
  className: s,
@@ -119,4 +119,4 @@ U.Option = W;
119
119
  export {
120
120
  U as S
121
121
  };
122
- //# sourceMappingURL=select-B5Vb3zou.js.map
122
+ //# sourceMappingURL=select-D4rKQAax.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"select-B5Vb3zou.js","sources":["../src/components/select/select.tsx"],"sourcesContent":["import { Select as SelectBase } from \"@base-ui/react/select\";\nimport { CaretUpDownIcon, CheckIcon } from \"@phosphor-icons/react\";\nimport { useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { buttonVariants } from \"../button\";\nimport { SkeletonLine } from \"../loader\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\n\nexport const KUMO_SELECT_VARIANTS = {\n // Select currently has no variant options but structure is ready for future additions\n} as const;\n\nexport const KUMO_SELECT_DEFAULT_VARIANTS = {} as const;\n\n/**\n * Select component styling metadata for Figma plugin code generation\n * Extracted from select.tsx implementation (source of truth)\n */\nexport const KUMO_SELECT_STYLING = {\n trigger: {\n height: 36, // h-9\n paddingX: 12, // px-3\n borderRadius: 8, // rounded-lg\n background: \"color-secondary\",\n text: \"text-color-surface\",\n ring: \"color-border\",\n fontSize: 16, // text-base\n fontWeight: 400, // font-normal\n },\n stateTokens: {\n focus: { ring: \"color-active\" },\n disabled: { opacity: 0.5 },\n },\n icons: {\n caret: { name: \"ph-caret-up-down\", size: 20 },\n check: { name: \"ph-check\", size: 20 },\n },\n popup: {\n background: \"color-secondary\",\n ring: \"color-border\",\n borderRadius: 8, // rounded-lg\n padding: 6, // p-1.5\n },\n option: {\n paddingX: 8, // px-2\n paddingY: 6, // py-1.5\n borderRadius: 4, // rounded\n fontSize: 16, // text-base\n highlightBackground: \"color-surface-secondary\",\n },\n} as const;\n\n// Derived types from KUMO_SELECT_VARIANTS\nexport interface KumoSelectVariantsProps {}\n\nexport function selectVariants(_props: KumoSelectVariantsProps = {}) {\n return cn(\n buttonVariants(),\n \"justify-between font-normal\",\n \"outline-none focus:opacity-100 focus-visible:ring-1 focus-visible:ring-kumo-ring *:in-focus:opacity-100\",\n );\n}\n\ntype SelectPropsGeneric<\n T,\n Multiple extends boolean | undefined = false,\n> = SelectBase.Root.Props<T, Multiple> &\n KumoSelectVariantsProps & {\n multiple?: Multiple;\n renderValue?: (value: Multiple extends true ? T[] : T) => ReactNode;\n className?: string;\n /** Label content for the select (enables Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n hideLabel?: boolean;\n placeholder?: string;\n loading?: boolean;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the select */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n };\n\n/**\n * Props for the Select component.\n * @description A dropdown select component for choosing from a list of options.\n * @property {ReactNode} [label] - Label content for the select (enables Field wrapper)\n * @property {ReactNode} [description] - Helper text displayed below the select\n * @property {string | { message: ReactNode, match: FieldErrorMatch }} [error] - Error message or validation error object\n */\nexport interface SelectProps {\n /** Additional CSS classes */\n className?: string;\n /** Label content for the select (enables Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n /** Whether to visually hide the label (still accessible to screen readers) */\n hideLabel?: boolean;\n /** Placeholder text when no value is selected */\n placeholder?: string;\n /** Whether the select is in a loading state */\n loading?: boolean;\n /** Whether the select is disabled */\n disabled?: boolean;\n /** Whether the select is required */\n required?: boolean;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** The currently selected value */\n value?: unknown;\n /** Default value for uncontrolled usage */\n defaultValue?: unknown;\n /** Callback when the value changes */\n onValueChange?: (value: unknown) => void;\n /** Whether multiple selection is enabled */\n multiple?: boolean;\n /** Child elements (Select.Option components) */\n children?: ReactNode;\n /** Helper text displayed below the select */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\nexport function Select<T, Multiple extends boolean | undefined = false>({\n children,\n className,\n renderValue,\n label,\n hideLabel = true,\n placeholder,\n loading,\n labelTooltip,\n description,\n error,\n required,\n ...props\n}: SelectPropsGeneric<T, Multiple> & { required?: boolean }) {\n const labelId = useId();\n const propLookup = props as Record<string, unknown>;\n const ariaLabel = propLookup[\"aria-label\"] as string | undefined;\n const ariaLabelledby = propLookup[\"aria-labelledby\"] as string | undefined;\n // For aria-label, use string label or placeholder (ReactNode labels can't be used for aria-label)\n const fallbackLabel = typeof label === \"string\" ? label : placeholder;\n\n // Use Field wrapper when label is provided and not hidden\n const useFieldWrapper = label && !hideLabel;\n const triggerLabelledBy = useFieldWrapper\n ? undefined\n : (ariaLabelledby ?? (label ? labelId : undefined));\n const triggerAriaLabel =\n ariaLabel ?? (!triggerLabelledBy ? fallbackLabel : undefined);\n\n // Placeholder must be provide via the items props\n // We need to fake the items or do some transformation\n let items = props.items;\n if (placeholder) {\n if (!items) {\n items = [\n {\n value: null as T,\n label: placeholder,\n },\n ];\n } else if (typeof items === \"object\") {\n items = [\n {\n value: null as T,\n label: placeholder,\n },\n ...Object.entries(items).map(([key, value]) => ({\n value: key as T,\n label: value,\n })),\n ];\n } else if (Array.isArray(items)) {\n items = [\n {\n value: null as T,\n label: placeholder,\n },\n ...items,\n ];\n }\n }\n\n const selectControl = (\n <SelectBase.Root\n {...props}\n items={items}\n disabled={loading || props.disabled}\n >\n <SelectBase.Trigger\n className={cn(\n buttonVariants(),\n \"justify-between font-normal\",\n \"outline-none focus:opacity-100 focus-visible:ring-1 focus-visible:ring-kumo-ring *:in-focus:opacity-100\",\n props.disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n aria-label={triggerAriaLabel}\n aria-labelledby={triggerLabelledBy}\n >\n {loading ? (\n <SkeletonLine className=\"w-32\" />\n ) : (\n <SelectBase.Value>{renderValue}</SelectBase.Value>\n )}\n <SelectBase.Icon className=\"flex items-center\">\n <CaretUpDownIcon />\n </SelectBase.Icon>\n </SelectBase.Trigger>\n <SelectBase.Portal>\n <SelectBase.Positioner className=\"z-50\">\n <SelectBase.Popup\n className={cn(\n \"z-50 overflow-hidden bg-kumo-control text-kumo-default\", // background\n \"rounded-lg shadow-lg ring ring-kumo-line\", // border part\n // 3px adjustment to account for padding + border differences\n \"min-w-[calc(var(--anchor-width)+3px)] p-1.5\", // spacing\n )}\n >\n {children}\n </SelectBase.Popup>\n </SelectBase.Positioner>\n </SelectBase.Portal>\n </SelectBase.Root>\n );\n\n // Use Field wrapper when label is provided and not hidden\n if (useFieldWrapper) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {selectControl}\n </Field>\n );\n }\n\n // Render with standalone label when label is hidden (sr-only)\n return (\n <>\n {label && (\n <span id={labelId} className=\"sr-only\">\n {label}\n </span>\n )}\n {selectControl}\n </>\n );\n}\n\ntype OptionProps<T> = {\n children: ReactNode;\n value: T;\n};\n\nfunction Option<T>({ children, value }: OptionProps<T>) {\n return (\n <SelectBase.Item\n value={value}\n className=\"group flex cursor-pointer items-center justify-between gap-2 rounded px-2 py-1.5 text-base data-highlighted:bg-kumo-overlay\"\n >\n <SelectBase.ItemText>{children}</SelectBase.ItemText>\n <SelectBase.ItemIndicator>\n <CheckIcon />\n </SelectBase.ItemIndicator>\n </SelectBase.Item>\n );\n}\n\nSelect.Option = Option;\n"],"names":["Select","children","className","renderValue","label","hideLabel","placeholder","loading","labelTooltip","description","error","required","props","labelId","useId","propLookup","ariaLabel","ariaLabelledby","fallbackLabel","useFieldWrapper","triggerLabelledBy","triggerAriaLabel","items","key","value","selectControl","jsxs","SelectBase.Root","SelectBase.Trigger","cn","buttonVariants","jsx","SkeletonLine","SelectBase.Value","SelectBase.Icon","CaretUpDownIcon","SelectBase.Portal","SelectBase.Positioner","SelectBase.Popup","Field","Fragment","Option","SelectBase.Item","SelectBase.ItemText","SelectBase.ItemIndicator","CheckIcon"],"mappings":"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"}
1
+ {"version":3,"file":"select-D4rKQAax.js","sources":["../src/components/select/select.tsx"],"sourcesContent":["import { Select as SelectBase } from \"@base-ui/react/select\";\nimport { CaretUpDownIcon, CheckIcon } from \"@phosphor-icons/react\";\nimport { useId } from \"react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { buttonVariants } from \"../button\";\nimport { SkeletonLine } from \"../loader\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\n\nexport const KUMO_SELECT_VARIANTS = {\n // Select currently has no variant options but structure is ready for future additions\n} as const;\n\nexport const KUMO_SELECT_DEFAULT_VARIANTS = {} as const;\n\n/**\n * Select component styling metadata for Figma plugin code generation\n * Extracted from select.tsx implementation (source of truth)\n */\nexport const KUMO_SELECT_STYLING = {\n trigger: {\n height: 36, // h-9\n paddingX: 12, // px-3\n borderRadius: 8, // rounded-lg\n background: \"color-secondary\",\n text: \"text-color-surface\",\n ring: \"color-border\",\n fontSize: 16, // text-base\n fontWeight: 400, // font-normal\n },\n stateTokens: {\n focus: { ring: \"color-active\" },\n disabled: { opacity: 0.5 },\n },\n icons: {\n caret: { name: \"ph-caret-up-down\", size: 20 },\n check: { name: \"ph-check\", size: 20 },\n },\n popup: {\n background: \"color-secondary\",\n ring: \"color-border\",\n borderRadius: 8, // rounded-lg\n padding: 6, // p-1.5\n },\n option: {\n paddingX: 8, // px-2\n paddingY: 6, // py-1.5\n borderRadius: 4, // rounded\n fontSize: 16, // text-base\n highlightBackground: \"color-surface-secondary\",\n },\n} as const;\n\n// Derived types from KUMO_SELECT_VARIANTS\nexport interface KumoSelectVariantsProps {}\n\nexport function selectVariants(_props: KumoSelectVariantsProps = {}) {\n return cn(\n buttonVariants(),\n \"justify-between font-normal\",\n \"outline-none focus:opacity-100 focus-visible:ring-1 focus-visible:ring-kumo-ring *:in-focus:opacity-100\",\n );\n}\n\ntype SelectPropsGeneric<\n T,\n Multiple extends boolean | undefined = false,\n> = SelectBase.Root.Props<T, Multiple> &\n KumoSelectVariantsProps & {\n multiple?: Multiple;\n renderValue?: (value: Multiple extends true ? T[] : T) => ReactNode;\n className?: string;\n /** Label content for the select (enables Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n hideLabel?: boolean;\n placeholder?: string;\n loading?: boolean;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the select */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n };\n\n/**\n * Props for the Select component.\n * @description A dropdown select component for choosing from a list of options.\n * @property {ReactNode} [label] - Label content for the select (enables Field wrapper)\n * @property {ReactNode} [description] - Helper text displayed below the select\n * @property {string | { message: ReactNode, match: FieldErrorMatch }} [error] - Error message or validation error object\n */\nexport interface SelectProps {\n /** Additional CSS classes */\n className?: string;\n /** Label content for the select (enables Field wrapper) - can be a string or any React node */\n label?: ReactNode;\n /** Whether to visually hide the label (still accessible to screen readers) */\n hideLabel?: boolean;\n /** Placeholder text when no value is selected */\n placeholder?: string;\n /** Whether the select is in a loading state */\n loading?: boolean;\n /** Whether the select is disabled */\n disabled?: boolean;\n /** Whether the select is required */\n required?: boolean;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** The currently selected value */\n value?: unknown;\n /** Default value for uncontrolled usage */\n defaultValue?: unknown;\n /** Callback when the value changes */\n onValueChange?: (value: unknown) => void;\n /** Whether multiple selection is enabled */\n multiple?: boolean;\n /** Child elements (Select.Option components) */\n children?: ReactNode;\n /** Helper text displayed below the select */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\nexport function Select<T, Multiple extends boolean | undefined = false>({\n children,\n className,\n renderValue,\n label,\n hideLabel = true,\n placeholder,\n loading,\n labelTooltip,\n description,\n error,\n required,\n ...props\n}: SelectPropsGeneric<T, Multiple> & { required?: boolean }) {\n const labelId = useId();\n const propLookup = props as Record<string, unknown>;\n const ariaLabel = propLookup[\"aria-label\"] as string | undefined;\n const ariaLabelledby = propLookup[\"aria-labelledby\"] as string | undefined;\n // For aria-label, use string label or placeholder (ReactNode labels can't be used for aria-label)\n const fallbackLabel = typeof label === \"string\" ? label : placeholder;\n\n // Use Field wrapper when label is provided and not hidden\n const useFieldWrapper = label && !hideLabel;\n const triggerLabelledBy = useFieldWrapper\n ? undefined\n : (ariaLabelledby ?? (label ? labelId : undefined));\n const triggerAriaLabel =\n ariaLabel ?? (!triggerLabelledBy ? fallbackLabel : undefined);\n\n // Placeholder must be provide via the items props\n // We need to fake the items or do some transformation\n let items = props.items;\n if (placeholder) {\n if (!items) {\n items = [\n {\n value: null as T,\n label: placeholder,\n },\n ];\n } else if (typeof items === \"object\") {\n items = [\n {\n value: null as T,\n label: placeholder,\n },\n ...Object.entries(items).map(([key, value]) => ({\n value: key as T,\n label: value,\n })),\n ];\n } else if (Array.isArray(items)) {\n items = [\n {\n value: null as T,\n label: placeholder,\n },\n ...items,\n ];\n }\n }\n\n const selectControl = (\n <SelectBase.Root\n {...props}\n items={items}\n disabled={loading || props.disabled}\n >\n <SelectBase.Trigger\n className={cn(\n buttonVariants(),\n \"justify-between font-normal\",\n \"outline-none focus:opacity-100 focus-visible:ring-1 focus-visible:ring-kumo-ring *:in-focus:opacity-100\",\n props.disabled && \"cursor-not-allowed opacity-50\",\n className,\n )}\n aria-label={triggerAriaLabel}\n aria-labelledby={triggerLabelledBy}\n >\n {loading ? (\n <SkeletonLine className=\"w-32\" />\n ) : (\n <SelectBase.Value>{renderValue}</SelectBase.Value>\n )}\n <SelectBase.Icon className=\"flex items-center\">\n <CaretUpDownIcon />\n </SelectBase.Icon>\n </SelectBase.Trigger>\n <SelectBase.Portal>\n <SelectBase.Positioner className=\"z-50\">\n <SelectBase.Popup\n className={cn(\n \"z-50 overflow-hidden bg-kumo-control text-kumo-default\", // background\n \"rounded-lg shadow-lg ring ring-kumo-line\", // border part\n // 3px adjustment to account for padding + border differences\n \"min-w-[calc(var(--anchor-width)+3px)] p-1.5\", // spacing\n )}\n >\n {children}\n </SelectBase.Popup>\n </SelectBase.Positioner>\n </SelectBase.Portal>\n </SelectBase.Root>\n );\n\n // Use Field wrapper when label is provided and not hidden\n if (useFieldWrapper) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {selectControl}\n </Field>\n );\n }\n\n // Render with standalone label when label is hidden (sr-only)\n return (\n <>\n {label && (\n <span id={labelId} className=\"sr-only\">\n {label}\n </span>\n )}\n {selectControl}\n </>\n );\n}\n\ntype OptionProps<T> = {\n children: ReactNode;\n value: T;\n};\n\nfunction Option<T>({ children, value }: OptionProps<T>) {\n return (\n <SelectBase.Item\n value={value}\n className=\"group flex cursor-pointer items-center justify-between gap-2 rounded px-2 py-1.5 text-base data-highlighted:bg-kumo-overlay\"\n >\n <SelectBase.ItemText>{children}</SelectBase.ItemText>\n <SelectBase.ItemIndicator>\n <CheckIcon />\n </SelectBase.ItemIndicator>\n </SelectBase.Item>\n );\n}\n\nSelect.Option = Option;\n"],"names":["Select","children","className","renderValue","label","hideLabel","placeholder","loading","labelTooltip","description","error","required","props","labelId","useId","propLookup","ariaLabel","ariaLabelledby","fallbackLabel","useFieldWrapper","triggerLabelledBy","triggerAriaLabel","items","key","value","selectControl","jsxs","SelectBase.Root","SelectBase.Trigger","cn","buttonVariants","jsx","SkeletonLine","SelectBase.Value","SelectBase.Icon","CaretUpDownIcon","SelectBase.Portal","SelectBase.Positioner","SelectBase.Popup","Field","Fragment","Option","SelectBase.Item","SelectBase.ItemText","SelectBase.ItemIndicator","CheckIcon"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import { jsxs as b, Fragment as ce, jsx as i } from "react/jsx-runtime";
3
3
  import { EyeSlash as ue, Eye as pe } from "@phosphor-icons/react";
4
- import { forwardRef as de, useState as N, useRef as w, useId as T, useCallback as l, useEffect as me } from "react";
4
+ import { forwardRef as de, useState as w, useRef as N, useId as T, useCallback as l, useEffect as fe } from "react";
5
5
  import { c as p } from "./cn-Bhsu1vx2.js";
6
- import { K as fe, i as ve } from "./input-Dqvc2AB_.js";
7
- import { F as ge } from "./field-V3J0Ql_V.js";
8
- import { I as he } from "./vendor-base-ui-DWIDNgE1.js";
9
- const Te = fe, M = {
6
+ import { K as me, i as ve } from "./input-D6YgDfDG.js";
7
+ import { F as ge } from "./field-B7ORz5ej.js";
8
+ import { I as he } from "./vendor-base-ui-kX0wjdav.js";
9
+ const Te = me, M = {
10
10
  size: "base",
11
11
  variant: "default"
12
12
  }, ye = de(
@@ -29,16 +29,16 @@ const Te = fe, M = {
29
29
  error: y,
30
30
  required: W,
31
31
  ...q
32
- }, m) => {
33
- const G = typeof h == "string" ? h : "Sensitive value", x = R !== void 0, [J, O] = N(B), f = x ? R : J, n = f.length > 0, [o, c] = N(
32
+ }, f) => {
33
+ const G = typeof h == "string" ? h : "Sensitive value", x = R !== void 0, [J, O] = w(B), m = x ? R : J, n = m.length > 0, [o, c] = w(
34
34
  () => n ? "masked" : "empty"
35
- ), [v, I] = N(!1), C = w(null), u = w(null), V = T(), Q = T(), Z = j ?? Q, K = T(), z = l(
35
+ ), [v, I] = w(!1), C = N(null), u = N(null), V = T(), Q = T(), Z = j ?? Q, K = T(), z = l(
36
36
  (e) => {
37
- C.current = e, typeof m == "function" ? m(e) : m && (m.current = e);
37
+ C.current = e, typeof f == "function" ? f(e) : f && (f.current = e);
38
38
  },
39
- [m]
39
+ [f]
40
40
  );
41
- me(() => {
41
+ fe(() => {
42
42
  if (v) {
43
43
  const e = setTimeout(() => I(!1), 2e3);
44
44
  return () => clearTimeout(e);
@@ -49,14 +49,14 @@ const Te = fe, M = {
49
49
  e.stopPropagation();
50
50
  try {
51
51
  if (typeof navigator < "u" && navigator.clipboard && typeof navigator.clipboard.writeText == "function") {
52
- await navigator.clipboard.writeText(f), I(!0), k?.();
52
+ await navigator.clipboard.writeText(m), I(!0), k?.();
53
53
  return;
54
54
  }
55
55
  } catch {
56
56
  }
57
57
  if (typeof document < "u") {
58
58
  const a = document.createElement("textarea");
59
- a.value = f, a.setAttribute("readonly", ""), a.style.position = "absolute", a.style.left = "-9999px", document.body.appendChild(a);
59
+ a.value = m, a.setAttribute("readonly", ""), a.style.position = "absolute", a.style.left = "-9999px", document.body.appendChild(a);
60
60
  const g = document.getSelection(), F = g?.rangeCount ? g.getRangeAt(0) : null;
61
61
  a.select();
62
62
  try {
@@ -68,8 +68,8 @@ const Te = fe, M = {
68
68
  }
69
69
  }
70
70
  },
71
- [f, k]
72
- ), A = w(n);
71
+ [m, k]
72
+ ), A = N(n);
73
73
  A.current !== n && (A.current = n, !n && o === "masked" && c("empty"));
74
74
  const te = l(
75
75
  (e) => {
@@ -121,7 +121,7 @@ const Te = fe, M = {
121
121
  ref: z,
122
122
  id: Z,
123
123
  type: o === "revealed" ? "text" : "password",
124
- value: f,
124
+ value: m,
125
125
  onChange: oe,
126
126
  onBlur: ae,
127
127
  onKeyDown: ie,
@@ -173,10 +173,10 @@ const Te = fe, M = {
173
173
  className: p(
174
174
  s && !r && "group-focus-within/container:invisible group-hover/mask:invisible"
175
175
  ),
176
- children: "●●●●●●●●"
176
+ children: "••••••••"
177
177
  }
178
178
  ),
179
- s && !r && /* @__PURE__ */ i("span", { className: "invisible absolute inset-0 text-kumo-subtle group-focus-within/container:visible group-hover/mask:visible", children: "Click to reveal" })
179
+ s && !r && /* @__PURE__ */ i("span", { className: "invisible absolute left-0 top-0 whitespace-nowrap text-kumo-subtle group-focus-within/container:visible group-hover/mask:visible", children: "Click to reveal" })
180
180
  ] })
181
181
  }
182
182
  ),
@@ -255,4 +255,4 @@ export {
255
255
  ye as S,
256
256
  M as a
257
257
  };
258
- //# sourceMappingURL=sensitive-input-D5HCV04N.js.map
258
+ //# sourceMappingURL=sensitive-input-DYvAmxkN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sensitive-input-D5HCV04N.js","sources":["../src/components/sensitive-input/sensitive-input.tsx"],"sourcesContent":["import { Eye, EyeSlash } from \"@phosphor-icons/react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Input as BaseInput } from \"@base-ui/react/input\";\nimport {\n inputVariants,\n KUMO_INPUT_VARIANTS,\n type KumoInputSize,\n type KumoInputVariant,\n} from \"../input/input\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\n\nexport const KUMO_SENSITIVE_INPUT_VARIANTS = KUMO_INPUT_VARIANTS;\n\nexport const KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS = {\n size: \"base\",\n variant: \"default\",\n} as const;\n\ntype Mode = \"masked\" | \"revealed\" | \"empty\";\n\n/**\n * SensitiveInput component props\n * @property {ReactNode} [label] - Label content for the input (enables Field wrapper)\n * @property {ReactNode} [description] - Helper text displayed below the input\n * @property {string | { message: ReactNode, match: FieldErrorMatch }} [error] - Error message or validation error object\n */\nexport interface SensitiveInputProps\n extends Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"size\" | \"type\" | \"value\" | \"defaultValue\"\n > {\n /** Controlled value */\n value?: string;\n /** Uncontrolled default value */\n defaultValue?: string;\n /** Simplified change handler receiving just the value */\n onValueChange?: (value: string) => void;\n /** Callback fired after value is copied to clipboard */\n onCopy?: () => void;\n /** Size variant */\n size?: KumoInputSize;\n /** Style variant */\n variant?: KumoInputVariant;\n /** Label content for the input (enables Field wrapper and sets masked state label) - can be a string or any React node */\n label?: ReactNode;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the input */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\nexport const SensitiveInput = forwardRef<HTMLInputElement, SensitiveInputProps>(\n (\n {\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n onValueChange,\n onCopy,\n size = KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS.size,\n variant = KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS.variant,\n disabled = false,\n readOnly = false,\n id,\n autoComplete = \"off\",\n className,\n label,\n labelTooltip,\n description,\n error,\n required,\n ...inputProps\n },\n ref,\n ) => {\n // For aria-label, only use string labels (ReactNode labels can't be used for aria-label)\n const ariaLabelFallback =\n typeof label === \"string\" ? label : \"Sensitive value\";\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue);\n const value = isControlled ? controlledValue : internalValue;\n const hasValue = value.length > 0;\n\n const [mode, setMode] = useState<Mode>(() =>\n hasValue ? \"masked\" : \"empty\",\n );\n\n const [copied, setCopied] = useState(false);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const liveRegionId = useId();\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const maskedInstructionId = useId();\n\n const mergedRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n // Reset copied state after 2 seconds\n useEffect(() => {\n if (copied) {\n const timeoutId = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timeoutId);\n }\n }, [copied]);\n\n const copyToClipboard = useCallback(\n async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard &&\n typeof navigator.clipboard.writeText === \"function\"\n ) {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopy?.();\n return;\n }\n } catch {\n // Fall through to manual fallback\n }\n\n if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = value;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"absolute\";\n textarea.style.left = \"-9999px\";\n document.body.appendChild(textarea);\n const selection = document.getSelection();\n const previousRange = selection?.rangeCount\n ? selection.getRangeAt(0)\n : null;\n textarea.select();\n try {\n document.execCommand(\"copy\");\n setCopied(true);\n onCopy?.();\n } catch (error) {\n console.warn(\"Clipboard copy failed\", error);\n } finally {\n document.body.removeChild(textarea);\n if (previousRange) {\n selection?.removeAllRanges();\n selection?.addRange(previousRange);\n }\n }\n }\n },\n [value, onCopy],\n );\n\n // Sync mode when value changes externally\n const prevHasValueRef = useRef(hasValue);\n if (prevHasValueRef.current !== hasValue) {\n prevHasValueRef.current = hasValue;\n if (!hasValue && mode === \"masked\") {\n setMode(\"empty\");\n }\n }\n\n const handleContainerClick = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return;\n // Ignore clicks that originated from outside (e.g., label click focusing input)\n // Label clicks trigger a click on the input, but the click coordinates are outside the container\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const isClickInsideContainer =\n e.clientX >= rect.left &&\n e.clientX <= rect.right &&\n e.clientY >= rect.top &&\n e.clientY <= rect.bottom;\n if (!isClickInsideContainer) return;\n }\n if (mode === \"masked\" && hasValue) {\n setMode(\"revealed\");\n if (!readOnly) {\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }\n },\n [mode, hasValue, disabled, readOnly],\n );\n\n const handleToggleVisibility = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (mode === \"revealed\") {\n setMode(\"masked\");\n } else if (mode === \"empty\" && hasValue) {\n setMode(\"revealed\");\n }\n },\n [mode, hasValue],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(e);\n onValueChange?.(newValue);\n },\n [isControlled, onChange, onValueChange],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n // Don't mask if focus is moving to a button inside the container (copy/eye buttons)\n if (\n containerRef.current &&\n e.relatedTarget instanceof Node &&\n containerRef.current.contains(e.relatedTarget)\n ) {\n return;\n }\n if (hasValue) {\n setMode(\"masked\");\n }\n },\n [hasValue],\n );\n\n const handleContainerKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (mode === \"masked\" && hasValue) {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setMode(\"revealed\");\n if (!readOnly) {\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }\n }\n },\n [mode, hasValue, disabled, readOnly],\n );\n\n const handleInputKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (mode === \"revealed\" && e.key === \"Escape\") {\n setMode(\"masked\");\n // Move focus to container to avoid focus trap (input becomes tabIndex={-1})\n setTimeout(() => containerRef.current?.focus(), 0);\n }\n },\n [mode],\n );\n\n const isMaskedWithValue = mode === \"masked\" && hasValue;\n const showEyeButton =\n !disabled && (mode === \"revealed\" || (mode === \"empty\" && hasValue));\n\n // Icon sizes matching input sizes\n const iconSize = size === \"xs\" || size === \"sm\" ? \"size-3\" : \"size-4\";\n\n const containerClassName = cn(\n inputVariants({ size, variant, parentFocusIndicator: true }),\n \"group/container relative flex w-full items-center\",\n isMaskedWithValue && !disabled && \"cursor-pointer\",\n disabled && \"cursor-not-allowed\",\n className,\n );\n\n const containerContent = (\n <>\n {/* Input - defines the width, always rendered */}\n <BaseInput\n ref={mergedRef}\n id={inputId}\n type={mode === \"revealed\" ? \"text\" : \"password\"}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleInputKeyDown}\n disabled={disabled}\n readOnly={readOnly || isMaskedWithValue}\n autoComplete={autoComplete}\n tabIndex={isMaskedWithValue ? -1 : 0}\n className={cn(\n \"w-full border-0 bg-transparent p-0 text-kumo-default ring-0 outline-none placeholder:text-kumo-subtle disabled:cursor-not-allowed disabled:text-kumo-subtle\",\n size === \"xs\" && \"pr-5\",\n size === \"sm\" && \"pr-6\",\n size === \"base\" && \"pr-8\",\n size === \"lg\" && \"pr-10\",\n isMaskedWithValue && \"pointer-events-none text-transparent\",\n )}\n aria-hidden={isMaskedWithValue}\n {...inputProps}\n />\n\n {/* Mask overlay - absolutely positioned, doesn't affect layout */}\n <span\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-0 flex items-center overflow-hidden select-none\",\n // Match input pr padding (space for icon)\n size === \"xs\" && \"right-5\",\n size === \"sm\" && \"right-6\",\n size === \"base\" && \"right-8\",\n size === \"lg\" && \"right-10\",\n // Match the padding from inputVariants\n size === \"xs\" && \"px-1.5\",\n size === \"sm\" && \"px-2\",\n size === \"base\" && \"px-3\",\n size === \"lg\" && \"px-4\",\n // Hidden when not masked\n !isMaskedWithValue && \"invisible\",\n // When masked: enable pointer events\n isMaskedWithValue && \"pointer-events-auto\",\n // Text color - use text-kumo-default to contrast with bg-kumo-control input background\n \"text-kumo-default\",\n // Hover state - pure CSS, no React state (group for children)\n \"group/mask\",\n )}\n aria-hidden=\"true\"\n >\n {/* Both texts rendered, stacked. Visibility toggled on hover to prevent layout shift */}\n <span className=\"relative\">\n <span\n className={cn(\n isMaskedWithValue &&\n !disabled &&\n \"group-focus-within/container:invisible group-hover/mask:invisible\",\n )}\n >\n ●●●●●●●●\n </span>\n {isMaskedWithValue && !disabled && (\n <span className=\"invisible absolute inset-0 text-kumo-subtle group-focus-within/container:visible group-hover/mask:visible\">\n Click to reveal\n </span>\n )}\n </span>\n </span>\n\n {/* Eye button - absolutely positioned to the right */}\n <button\n type=\"button\"\n onClick={handleToggleVisibility}\n onKeyDown={(e) => e.stopPropagation()}\n aria-label={mode === \"revealed\" ? \"Hide value\" : \"Reveal value\"}\n tabIndex={showEyeButton ? 0 : -1}\n className={cn(\n \"absolute top-1/2 right-0 -translate-y-1/2 cursor-pointer text-kumo-subtle outline-none hover:text-kumo-default focus:text-kumo-default\",\n // Match right padding from inputVariants\n size === \"xs\" && \"right-1.5\",\n size === \"sm\" && \"right-2\",\n size === \"base\" && \"right-3\",\n size === \"lg\" && \"right-4\",\n iconSize,\n !showEyeButton && \"pointer-events-none opacity-0\",\n )}\n >\n {mode === \"revealed\" ? (\n <EyeSlash className=\"size-full\" />\n ) : (\n <Eye className=\"size-full\" />\n )}\n </button>\n\n {/* Copy tab - appears on hover/focus at top right (hidden when disabled) */}\n {hasValue && !disabled && (\n <button\n type=\"button\"\n onClick={copyToClipboard}\n onKeyDown={(e) => e.stopPropagation()}\n aria-label={copied ? \"Copied\" : \"Copy to clipboard\"}\n className={cn(\n \"absolute -top-px right-2 -translate-y-full cursor-pointer rounded-t-md bg-kumo-brand px-2 py-0.5 text-xs text-white opacity-0 transition-opacity group-focus-within/container:opacity-100 group-hover/container:opacity-100 hover:brightness-120 focus-visible:outline focus-visible:outline-offset-1 focus-visible:outline-kumo-ring\",\n )}\n >\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n )}\n </>\n );\n\n const input = (\n <div>\n {isMaskedWithValue ? (\n <div\n ref={containerRef}\n // Cannot use <button> here because containerContent contains interactive button elements (Copy, Reveal).\n // Using role=\"button\" with proper keyboard handling instead.\n // oxlint-disable-next-line prefer-tag-over-role\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n className={containerClassName}\n onClick={handleContainerClick}\n onKeyDown={handleContainerKeyDown}\n aria-label={`${ariaLabelFallback}, masked.`}\n aria-describedby={`${maskedInstructionId} ${liveRegionId}`}\n aria-disabled={disabled}\n >\n {containerContent}\n </div>\n ) : (\n <div ref={containerRef} className={containerClassName}>\n {containerContent}\n </div>\n )}\n {isMaskedWithValue && (\n <span id={maskedInstructionId} className=\"sr-only\">\n Click or press Enter to reveal.\n </span>\n )}\n <span id={liveRegionId} className=\"sr-only\" aria-live=\"polite\">\n {mode === \"masked\" && hasValue && \"Value hidden\"}\n {copied && \"Copied to clipboard\"}\n </span>\n </div>\n );\n\n // Render with Field wrapper if label is provided\n if (label) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {input}\n </Field>\n );\n }\n\n // Render bare input without Field wrapper\n return input;\n },\n);\n\nSensitiveInput.displayName = \"SensitiveInput\";\n"],"names":["KUMO_SENSITIVE_INPUT_VARIANTS","KUMO_INPUT_VARIANTS","KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS","SensitiveInput","forwardRef","controlledValue","defaultValue","onChange","onValueChange","onCopy","size","variant","disabled","readOnly","id","autoComplete","className","label","labelTooltip","description","error","required","inputProps","ref","ariaLabelFallback","isControlled","internalValue","setInternalValue","useState","value","hasValue","mode","setMode","copied","setCopied","inputRef","useRef","containerRef","liveRegionId","useId","generatedId","inputId","maskedInstructionId","mergedRef","useCallback","node","useEffect","timeoutId","copyToClipboard","textarea","selection","previousRange","prevHasValueRef","handleContainerClick","rect","handleToggleVisibility","handleChange","newValue","handleBlur","handleContainerKeyDown","handleInputKeyDown","isMaskedWithValue","showEyeButton","iconSize","containerClassName","cn","inputVariants","containerContent","jsxs","Fragment","jsx","BaseInput","EyeSlash","Eye","input","Field"],"mappings":"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"}
1
+ {"version":3,"file":"sensitive-input-DYvAmxkN.js","sources":["../src/components/sensitive-input/sensitive-input.tsx"],"sourcesContent":["import { Eye, EyeSlash } from \"@phosphor-icons/react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Input as BaseInput } from \"@base-ui/react/input\";\nimport {\n inputVariants,\n KUMO_INPUT_VARIANTS,\n type KumoInputSize,\n type KumoInputVariant,\n} from \"../input/input\";\nimport { Field, type FieldErrorMatch } from \"../field/field\";\n\nexport const KUMO_SENSITIVE_INPUT_VARIANTS = KUMO_INPUT_VARIANTS;\n\nexport const KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS = {\n size: \"base\",\n variant: \"default\",\n} as const;\n\ntype Mode = \"masked\" | \"revealed\" | \"empty\";\n\n/**\n * SensitiveInput component props\n * @property {ReactNode} [label] - Label content for the input (enables Field wrapper)\n * @property {ReactNode} [description] - Helper text displayed below the input\n * @property {string | { message: ReactNode, match: FieldErrorMatch }} [error] - Error message or validation error object\n */\nexport interface SensitiveInputProps\n extends Omit<\n ComponentPropsWithoutRef<\"input\">,\n \"size\" | \"type\" | \"value\" | \"defaultValue\"\n > {\n /** Controlled value */\n value?: string;\n /** Uncontrolled default value */\n defaultValue?: string;\n /** Simplified change handler receiving just the value */\n onValueChange?: (value: string) => void;\n /** Callback fired after value is copied to clipboard */\n onCopy?: () => void;\n /** Size variant */\n size?: KumoInputSize;\n /** Style variant */\n variant?: KumoInputVariant;\n /** Label content for the input (enables Field wrapper and sets masked state label) - can be a string or any React node */\n label?: ReactNode;\n /** Tooltip content to display next to the label via an info icon */\n labelTooltip?: ReactNode;\n /** Helper text displayed below the input */\n description?: ReactNode;\n /** Error message or validation error object */\n error?: string | { message: ReactNode; match: FieldErrorMatch };\n}\n\nexport const SensitiveInput = forwardRef<HTMLInputElement, SensitiveInputProps>(\n (\n {\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n onValueChange,\n onCopy,\n size = KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS.size,\n variant = KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS.variant,\n disabled = false,\n readOnly = false,\n id,\n autoComplete = \"off\",\n className,\n label,\n labelTooltip,\n description,\n error,\n required,\n ...inputProps\n },\n ref,\n ) => {\n // For aria-label, only use string labels (ReactNode labels can't be used for aria-label)\n const ariaLabelFallback =\n typeof label === \"string\" ? label : \"Sensitive value\";\n const isControlled = controlledValue !== undefined;\n const [internalValue, setInternalValue] = useState(defaultValue);\n const value = isControlled ? controlledValue : internalValue;\n const hasValue = value.length > 0;\n\n const [mode, setMode] = useState<Mode>(() =>\n hasValue ? \"masked\" : \"empty\",\n );\n\n const [copied, setCopied] = useState(false);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const liveRegionId = useId();\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const maskedInstructionId = useId();\n\n const mergedRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n // Reset copied state after 2 seconds\n useEffect(() => {\n if (copied) {\n const timeoutId = setTimeout(() => setCopied(false), 2000);\n return () => clearTimeout(timeoutId);\n }\n }, [copied]);\n\n const copyToClipboard = useCallback(\n async (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n try {\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard &&\n typeof navigator.clipboard.writeText === \"function\"\n ) {\n await navigator.clipboard.writeText(value);\n setCopied(true);\n onCopy?.();\n return;\n }\n } catch {\n // Fall through to manual fallback\n }\n\n if (typeof document !== \"undefined\") {\n const textarea = document.createElement(\"textarea\");\n textarea.value = value;\n textarea.setAttribute(\"readonly\", \"\");\n textarea.style.position = \"absolute\";\n textarea.style.left = \"-9999px\";\n document.body.appendChild(textarea);\n const selection = document.getSelection();\n const previousRange = selection?.rangeCount\n ? selection.getRangeAt(0)\n : null;\n textarea.select();\n try {\n document.execCommand(\"copy\");\n setCopied(true);\n onCopy?.();\n } catch (error) {\n console.warn(\"Clipboard copy failed\", error);\n } finally {\n document.body.removeChild(textarea);\n if (previousRange) {\n selection?.removeAllRanges();\n selection?.addRange(previousRange);\n }\n }\n }\n },\n [value, onCopy],\n );\n\n // Sync mode when value changes externally\n const prevHasValueRef = useRef(hasValue);\n if (prevHasValueRef.current !== hasValue) {\n prevHasValueRef.current = hasValue;\n if (!hasValue && mode === \"masked\") {\n setMode(\"empty\");\n }\n }\n\n const handleContainerClick = useCallback(\n (e: React.MouseEvent) => {\n if (disabled) return;\n // Ignore clicks that originated from outside (e.g., label click focusing input)\n // Label clicks trigger a click on the input, but the click coordinates are outside the container\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const isClickInsideContainer =\n e.clientX >= rect.left &&\n e.clientX <= rect.right &&\n e.clientY >= rect.top &&\n e.clientY <= rect.bottom;\n if (!isClickInsideContainer) return;\n }\n if (mode === \"masked\" && hasValue) {\n setMode(\"revealed\");\n if (!readOnly) {\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }\n },\n [mode, hasValue, disabled, readOnly],\n );\n\n const handleToggleVisibility = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n if (mode === \"revealed\") {\n setMode(\"masked\");\n } else if (mode === \"empty\" && hasValue) {\n setMode(\"revealed\");\n }\n },\n [mode, hasValue],\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (!isControlled) {\n setInternalValue(newValue);\n }\n onChange?.(e);\n onValueChange?.(newValue);\n },\n [isControlled, onChange, onValueChange],\n );\n\n const handleBlur = useCallback(\n (e: React.FocusEvent<HTMLInputElement>) => {\n // Don't mask if focus is moving to a button inside the container (copy/eye buttons)\n if (\n containerRef.current &&\n e.relatedTarget instanceof Node &&\n containerRef.current.contains(e.relatedTarget)\n ) {\n return;\n }\n if (hasValue) {\n setMode(\"masked\");\n }\n },\n [hasValue],\n );\n\n const handleContainerKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (mode === \"masked\" && hasValue) {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n setMode(\"revealed\");\n if (!readOnly) {\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }\n }\n },\n [mode, hasValue, disabled, readOnly],\n );\n\n const handleInputKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (mode === \"revealed\" && e.key === \"Escape\") {\n setMode(\"masked\");\n // Move focus to container to avoid focus trap (input becomes tabIndex={-1})\n setTimeout(() => containerRef.current?.focus(), 0);\n }\n },\n [mode],\n );\n\n const isMaskedWithValue = mode === \"masked\" && hasValue;\n const showEyeButton =\n !disabled && (mode === \"revealed\" || (mode === \"empty\" && hasValue));\n\n // Icon sizes matching input sizes\n const iconSize = size === \"xs\" || size === \"sm\" ? \"size-3\" : \"size-4\";\n\n const containerClassName = cn(\n inputVariants({ size, variant, parentFocusIndicator: true }),\n \"group/container relative flex w-full items-center\",\n isMaskedWithValue && !disabled && \"cursor-pointer\",\n disabled && \"cursor-not-allowed\",\n className,\n );\n\n const containerContent = (\n <>\n {/* Input - defines the width, always rendered */}\n <BaseInput\n ref={mergedRef}\n id={inputId}\n type={mode === \"revealed\" ? \"text\" : \"password\"}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleInputKeyDown}\n disabled={disabled}\n readOnly={readOnly || isMaskedWithValue}\n autoComplete={autoComplete}\n tabIndex={isMaskedWithValue ? -1 : 0}\n className={cn(\n \"w-full border-0 bg-transparent p-0 text-kumo-default ring-0 outline-none placeholder:text-kumo-subtle disabled:cursor-not-allowed disabled:text-kumo-subtle\",\n size === \"xs\" && \"pr-5\",\n size === \"sm\" && \"pr-6\",\n size === \"base\" && \"pr-8\",\n size === \"lg\" && \"pr-10\",\n isMaskedWithValue && \"pointer-events-none text-transparent\",\n )}\n aria-hidden={isMaskedWithValue}\n {...inputProps}\n />\n\n {/* Mask overlay - absolutely positioned, doesn't affect layout */}\n <span\n className={cn(\n \"pointer-events-none absolute inset-y-0 left-0 flex items-center overflow-hidden select-none\",\n // Match input pr padding (space for icon)\n size === \"xs\" && \"right-5\",\n size === \"sm\" && \"right-6\",\n size === \"base\" && \"right-8\",\n size === \"lg\" && \"right-10\",\n // Match the padding from inputVariants\n size === \"xs\" && \"px-1.5\",\n size === \"sm\" && \"px-2\",\n size === \"base\" && \"px-3\",\n size === \"lg\" && \"px-4\",\n // Hidden when not masked\n !isMaskedWithValue && \"invisible\",\n // When masked: enable pointer events\n isMaskedWithValue && \"pointer-events-auto\",\n // Text color - use text-kumo-default to contrast with bg-kumo-control input background\n \"text-kumo-default\",\n // Hover state - pure CSS, no React state (group for children)\n \"group/mask\",\n )}\n aria-hidden=\"true\"\n >\n {/* Both texts rendered, stacked. Visibility toggled on hover to prevent layout shift */}\n <span className=\"relative\">\n <span\n className={cn(\n isMaskedWithValue &&\n !disabled &&\n \"group-focus-within/container:invisible group-hover/mask:invisible\",\n )}\n >\n ••••••••\n </span>\n {isMaskedWithValue && !disabled && (\n <span className=\"invisible absolute left-0 top-0 whitespace-nowrap text-kumo-subtle group-focus-within/container:visible group-hover/mask:visible\">\n Click to reveal\n </span>\n )}\n </span>\n </span>\n\n {/* Eye button - absolutely positioned to the right */}\n <button\n type=\"button\"\n onClick={handleToggleVisibility}\n onKeyDown={(e) => e.stopPropagation()}\n aria-label={mode === \"revealed\" ? \"Hide value\" : \"Reveal value\"}\n tabIndex={showEyeButton ? 0 : -1}\n className={cn(\n \"absolute top-1/2 right-0 -translate-y-1/2 cursor-pointer text-kumo-subtle outline-none hover:text-kumo-default focus:text-kumo-default\",\n // Match right padding from inputVariants\n size === \"xs\" && \"right-1.5\",\n size === \"sm\" && \"right-2\",\n size === \"base\" && \"right-3\",\n size === \"lg\" && \"right-4\",\n iconSize,\n !showEyeButton && \"pointer-events-none opacity-0\",\n )}\n >\n {mode === \"revealed\" ? (\n <EyeSlash className=\"size-full\" />\n ) : (\n <Eye className=\"size-full\" />\n )}\n </button>\n\n {/* Copy tab - appears on hover/focus at top right (hidden when disabled) */}\n {hasValue && !disabled && (\n <button\n type=\"button\"\n onClick={copyToClipboard}\n onKeyDown={(e) => e.stopPropagation()}\n aria-label={copied ? \"Copied\" : \"Copy to clipboard\"}\n className={cn(\n \"absolute -top-px right-2 -translate-y-full cursor-pointer rounded-t-md bg-kumo-brand px-2 py-0.5 text-xs text-white opacity-0 transition-opacity group-focus-within/container:opacity-100 group-hover/container:opacity-100 hover:brightness-120 focus-visible:outline focus-visible:outline-offset-1 focus-visible:outline-kumo-ring\",\n )}\n >\n {copied ? \"Copied\" : \"Copy\"}\n </button>\n )}\n </>\n );\n\n const input = (\n <div>\n {isMaskedWithValue ? (\n <div\n ref={containerRef}\n // Cannot use <button> here because containerContent contains interactive button elements (Copy, Reveal).\n // Using role=\"button\" with proper keyboard handling instead.\n // oxlint-disable-next-line prefer-tag-over-role\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n className={containerClassName}\n onClick={handleContainerClick}\n onKeyDown={handleContainerKeyDown}\n aria-label={`${ariaLabelFallback}, masked.`}\n aria-describedby={`${maskedInstructionId} ${liveRegionId}`}\n aria-disabled={disabled}\n >\n {containerContent}\n </div>\n ) : (\n <div ref={containerRef} className={containerClassName}>\n {containerContent}\n </div>\n )}\n {isMaskedWithValue && (\n <span id={maskedInstructionId} className=\"sr-only\">\n Click or press Enter to reveal.\n </span>\n )}\n <span id={liveRegionId} className=\"sr-only\" aria-live=\"polite\">\n {mode === \"masked\" && hasValue && \"Value hidden\"}\n {copied && \"Copied to clipboard\"}\n </span>\n </div>\n );\n\n // Render with Field wrapper if label is provided\n if (label) {\n return (\n <Field\n label={label}\n required={required}\n labelTooltip={labelTooltip}\n description={description}\n error={\n error\n ? typeof error === \"string\"\n ? { message: error, match: true }\n : error\n : undefined\n }\n >\n {input}\n </Field>\n );\n }\n\n // Render bare input without Field wrapper\n return input;\n },\n);\n\nSensitiveInput.displayName = \"SensitiveInput\";\n"],"names":["KUMO_SENSITIVE_INPUT_VARIANTS","KUMO_INPUT_VARIANTS","KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS","SensitiveInput","forwardRef","controlledValue","defaultValue","onChange","onValueChange","onCopy","size","variant","disabled","readOnly","id","autoComplete","className","label","labelTooltip","description","error","required","inputProps","ref","ariaLabelFallback","isControlled","internalValue","setInternalValue","useState","value","hasValue","mode","setMode","copied","setCopied","inputRef","useRef","containerRef","liveRegionId","useId","generatedId","inputId","maskedInstructionId","mergedRef","useCallback","node","useEffect","timeoutId","copyToClipboard","textarea","selection","previousRange","prevHasValueRef","handleContainerClick","rect","handleToggleVisibility","handleChange","newValue","handleBlur","handleContainerKeyDown","handleInputKeyDown","isMaskedWithValue","showEyeButton","iconSize","containerClassName","cn","inputVariants","containerContent","jsxs","Fragment","jsx","BaseInput","EyeSlash","Eye","input","Field"],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export declare const KUMO_DELETE_RESOURCE_VARIANTS: {
2
+ readonly size: {
3
+ readonly sm: {
4
+ readonly classes: "";
5
+ readonly description: "Small dialog for simple delete confirmations";
6
+ };
7
+ readonly base: {
8
+ readonly classes: "";
9
+ readonly description: "Default delete confirmation dialog size";
10
+ };
11
+ };
12
+ };
13
+ export declare const KUMO_DELETE_RESOURCE_DEFAULT_VARIANTS: {
14
+ readonly size: "base";
15
+ };
16
+ export type KumoDeleteResourceSize = keyof typeof KUMO_DELETE_RESOURCE_VARIANTS.size;
17
+ export interface KumoDeleteResourceVariantsProps {
18
+ size?: KumoDeleteResourceSize;
19
+ }
20
+ export interface DeleteResourceProps extends KumoDeleteResourceVariantsProps {
21
+ /** Whether the dialog is open */
22
+ open: boolean;
23
+ /** Callback when open state changes */
24
+ onOpenChange: (open: boolean) => void;
25
+ /** The type of resource being deleted (e.g., "Zone", "Worker", "KV Namespace") */
26
+ resourceType: string;
27
+ /** The name of the specific resource being deleted */
28
+ resourceName: string;
29
+ /** Callback when delete is confirmed */
30
+ onDelete: () => void | Promise<void>;
31
+ /** Whether the delete action is in progress */
32
+ isDeleting?: boolean;
33
+ /** Whether the confirmation input should be case-sensitive (default: true) */
34
+ caseSensitive?: boolean;
35
+ /** Custom delete button text (defaults to "Delete {resourceType}") */
36
+ deleteButtonText?: string;
37
+ /** Additional className for the dialog */
38
+ className?: string;
39
+ /** Error message to display if the delete action fails */
40
+ errorMessage?: string;
41
+ }
42
+ export declare function DeleteResource({ open, onOpenChange, resourceType, resourceName, onDelete, isDeleting, caseSensitive, deleteButtonText, size, errorMessage, className, }: DeleteResourceProps): import("react/jsx-runtime").JSX.Element;
43
+ export declare namespace DeleteResource {
44
+ var displayName: string;
45
+ }
46
+ //# sourceMappingURL=delete-resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-resource.d.ts","sourceRoot":"","sources":["../../../../src/blocks/delete-resource/delete-resource.tsx"],"names":[],"mappings":"AAkBA,eAAO,MAAM,6BAA6B;;;;;;;;;;;CAWhC,CAAC;AAEX,eAAO,MAAM,qCAAqC;;CAExC,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAChC,MAAM,OAAO,6BAA6B,CAAC,IAAI,CAAC;AAElD,MAAM,WAAW,+BAA+B;IAC9C,IAAI,CAAC,EAAE,sBAAsB,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAoB,SAAQ,+BAA+B;IAC1E,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,uCAAuC;IACvC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,kFAAkF;IAClF,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,YAAY,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,+CAA+C;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,UAAkB,EAClB,aAAoB,EACpB,gBAAgB,EAChB,IAAiD,EACjD,YAAY,EACZ,SAAS,GACV,EAAE,mBAAmB,2CAgIrB;yBA5Ie,cAAc"}
@@ -0,0 +1,2 @@
1
+ export { DeleteResource, KUMO_DELETE_RESOURCE_VARIANTS, KUMO_DELETE_RESOURCE_DEFAULT_VARIANTS, type DeleteResourceProps, type KumoDeleteResourceSize, type KumoDeleteResourceVariantsProps, } from './delete-resource';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/blocks/delete-resource/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,6BAA6B,EAC7B,qCAAqC,EACrC,KAAK,mBAAmB,EACxB,KAAK,sBAAsB,EAC3B,KAAK,+BAA+B,GACrC,MAAM,mBAAmB,CAAC"}
@@ -3,7 +3,7 @@ import { Dialog as DialogBase } from '@base-ui/react/dialog';
3
3
  export declare const KUMO_DIALOG_VARIANTS: {
4
4
  readonly size: {
5
5
  readonly base: {
6
- readonly classes: "min-w-96";
6
+ readonly classes: "sm:min-w-96";
7
7
  readonly description: "Default dialog width";
8
8
  };
9
9
  readonly sm: {
@@ -1,3 +1,5 @@
1
1
  export { Toasty } from './toast';
2
2
  export { Toast } from '@base-ui/react/toast';
3
+ export { useKumoToastManager, createKumoToastManager } from './toast';
4
+ export type { KumoToastOptions, KumoToastManagerAddOptions } from './toast';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/toast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/toast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACtE,YAAY,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC"}
@@ -1,11 +1,13 @@
1
+ import { ToastManagerAddOptions, ToastObject } from '@base-ui/react/toast';
1
2
  import { default as React } from 'react';
3
+ import { ButtonProps } from '../../components/button';
2
4
  /**
3
5
  * Toast styling configuration for Figma plugin consumption.
4
6
  * Toast has no user-facing variants but documents the styling structure.
5
7
  */
6
8
  export declare const KUMO_TOAST_VARIANTS: {
7
9
  readonly root: {
8
- readonly classes: "rounded-lg border border-kumo-fill bg-kumo-control p-4 shadow-lg";
10
+ readonly classes: "rounded-lg border border-kumo-fill bg-kumo-control p-4 shadow-lg text-kumo-default";
9
11
  readonly description: "Toast container with background, border, and shadow";
10
12
  };
11
13
  readonly title: {
@@ -20,8 +22,26 @@ export declare const KUMO_TOAST_VARIANTS: {
20
22
  readonly classes: "absolute top-2 right-2 flex h-5 w-5 items-center justify-center rounded border-none bg-transparent text-kumo-subtle hover:bg-kumo-fill-hover hover:text-kumo-strong";
21
23
  readonly description: "Close button with X icon";
22
24
  };
25
+ readonly variant: {
26
+ readonly default: {
27
+ readonly classes: "border-kumo-fill bg-kumo-control";
28
+ readonly description: "Default toast style";
29
+ };
30
+ readonly error: {
31
+ readonly classes: "border-kumo-fill bg-kumo-control [&_[data-toast-icon]]:text-[light-dark(var(--color-red-600),var(--color-red-400))] [&_[data-toast-title]]:text-[light-dark(var(--color-red-600),var(--color-red-400))]";
32
+ readonly description: "Error toast for critical issues";
33
+ readonly icon: import('@phosphor-icons/react').Icon;
34
+ };
35
+ readonly warning: {
36
+ readonly classes: "border-kumo-fill bg-kumo-control [&_[data-toast-icon]]:text-[light-dark(var(--color-amber-700),var(--color-amber-500))] [&_[data-toast-title]]:text-[light-dark(var(--color-amber-700),var(--color-amber-500))]";
37
+ readonly description: "Warning toast for cautionary messages";
38
+ readonly icon: import('@phosphor-icons/react').Icon;
39
+ };
40
+ };
41
+ };
42
+ export declare const KUMO_TOAST_DEFAULT_VARIANTS: {
43
+ readonly variant: "default";
23
44
  };
24
- export declare const KUMO_TOAST_DEFAULT_VARIANTS: {};
25
45
  /**
26
46
  * Toast styling configuration for Figma plugin consumption.
27
47
  * Provides structured metadata for generating Toast components in Figma.
@@ -56,11 +76,41 @@ export declare const KUMO_TOAST_STYLING: {
56
76
  readonly borderRadius: 4;
57
77
  };
58
78
  };
79
+ export type KumoToastVariant = keyof typeof KUMO_TOAST_VARIANTS.variant;
59
80
  export interface KumoToastVariantsProps {
81
+ variant?: KumoToastVariant;
60
82
  }
61
- export declare function toastVariants(_props?: KumoToastVariantsProps): string;
83
+ export declare function toastVariants({ variant, }?: KumoToastVariantsProps): string;
62
84
  export interface ToastyProps extends KumoToastVariantsProps {
63
85
  children: React.ReactNode;
64
86
  }
87
+ type KumoToastOptionsBase = {
88
+ variant?: KumoToastVariant;
89
+ content?: React.ReactNode;
90
+ actions?: Array<ButtonProps>;
91
+ };
92
+ export type KumoToastOptions<Data extends object> = ToastObject<Data> & KumoToastOptionsBase;
93
+ export type KumoToastManagerAddOptions<Data extends object> = ToastManagerAddOptions<Data> & KumoToastOptionsBase;
94
+ export declare const useKumoToastManager: () => {
95
+ toasts: Array<KumoToastOptions<any>>;
96
+ add: (<Data extends object>(options: ToastManagerAddOptions<Data>) => string) & ((options: KumoToastManagerAddOptions<any>) => any);
97
+ close: (toastId: string) => void;
98
+ update: (<Data extends object>(toastId: string, options: import('@base-ui/react/toast').ToastManagerUpdateOptions<Data>) => void) & ((id: string, options: Partial<KumoToastManagerAddOptions<any>>) => any);
99
+ promise: (<Value, Data extends object>(promise: Promise<Value>, options: import('@base-ui/react/toast').ToastManagerPromiseOptions<Value, Data>) => Promise<Value>) & (<T>(promise: Promise<T>, options: {
100
+ loading: KumoToastManagerAddOptions<any>;
101
+ success: KumoToastManagerAddOptions<any> | ((data: T) => KumoToastManagerAddOptions<any>);
102
+ error: KumoToastManagerAddOptions<any> | ((error: Error) => KumoToastManagerAddOptions<any>);
103
+ }) => any);
104
+ };
105
+ export declare const createKumoToastManager: () => import('@base-ui/react/toast').ToastManager & {
106
+ add: (options: KumoToastManagerAddOptions<any>) => any;
107
+ update: (id: string, options: Partial<KumoToastManagerAddOptions<any>>) => any;
108
+ promise: <T>(promise: Promise<T>, options: {
109
+ loading: KumoToastManagerAddOptions<any>;
110
+ success: KumoToastManagerAddOptions<any> | ((data: T) => KumoToastManagerAddOptions<any>);
111
+ error: KumoToastManagerAddOptions<any> | ((error: Error) => KumoToastManagerAddOptions<any>);
112
+ }) => any;
113
+ };
65
114
  export declare function Toasty({ children }: ToastyProps): import("react/jsx-runtime").JSX.Element;
115
+ export {};
66
116
  //# sourceMappingURL=toast.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../../../src/components/toast/toast.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;CAkBtB,CAAC;AAEX,eAAO,MAAM,2BAA2B,IAAc,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BrB,CAAC;AAGX,MAAM,WAAW,sBAAsB;CAAG;AAE1C,wBAAgB,aAAa,CAAC,MAAM,GAAE,sBAA2B,UAKhE;AAED,MAAM,WAAW,WAAY,SAAQ,sBAAsB;IACzD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,2CAW/C"}
1
+ {"version":3,"file":"toast.d.ts","sourceRoot":"","sources":["../../../../src/components/toast/toast.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EACtB,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAU,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAM9D;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCtB,CAAC;AAEX,eAAO,MAAM,2BAA2B;;CAE9B,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BrB,CAAC;AAGX,MAAM,MAAM,gBAAgB,GAAG,MAAM,OAAO,mBAAmB,CAAC,OAAO,CAAC;AAExE,MAAM,WAAW,sBAAsB;IACrC,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC5B;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAA6C,GAC9C,GAAE,sBAA2B,UAO7B;AAED,MAAM,WAAW,WAAY,SAAQ,sBAAsB;IACzD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,KAAK,oBAAoB,GAAG;IAC1B,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,IAAI,SAAS,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,GACnE,oBAAoB,CAAC;AAEvB,MAAM,MAAM,0BAA0B,CAAC,IAAI,SAAS,MAAM,IACxD,sBAAsB,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC;AA2DtD,eAAO,MAAM,mBAAmB;YAIF,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;+FAvDvC,0BAA0B,CAAC,GAAG,CAAC;;8IAMjC,MAAM,WAAW,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;4KAM5D,CAAC;iBAGE,0BAA0B,CAAC,GAAG,CAAC;iEAGtB,0BAA0B,CAAC,GAAG,CAAC;0DAGpC,KAAK,KAAK,0BAA0B,CAAC,GAAG,CAAC;;CAoC7D,CAAC;AAEF,eAAO,MAAM,sBAAsB;mBA3DhB,0BAA0B,CAAC,GAAG,CAAC;iBAMjC,MAAM,WAAW,OAAO,CAAC,0BAA0B,CAAC,GAAG,CAAC,CAAC;cAM5D,CAAC;iBAGE,0BAA0B,CAAC,GAAG,CAAC;iEAGtB,0BAA0B,CAAC,GAAG,CAAC;0DAGpC,KAAK,KAAK,0BAA0B,CAAC,GAAG,CAAC;;CAwC7D,CAAC;AAEF,wBAAgB,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,WAAW,2CAW/C"}
@@ -13,6 +13,7 @@ export { Field, type FieldProps, type FieldErrorMatch, fieldVariants, KUMO_FIELD
13
13
  export { Label, type LabelProps, labelVariants, labelContentVariants, KUMO_LABEL_VARIANTS, KUMO_LABEL_DEFAULT_VARIANTS, } from './components/label';
14
14
  export { Input, inputVariants, type InputProps, InputArea, type InputAreaProps, InputGroup, } from './components/input';
15
15
  export { LayerCard } from './components/layer-card';
16
+ export { DeleteResource, KUMO_DELETE_RESOURCE_VARIANTS, KUMO_DELETE_RESOURCE_DEFAULT_VARIANTS, type DeleteResourceProps, } from './blocks/delete-resource';
16
17
  export { Loader, SkeletonLine } from './components/loader';
17
18
  export { MenuBar, useMenuNavigation } from './components/menubar';
18
19
  export { Meter } from './components/meter';
@@ -23,7 +24,7 @@ export { Switch } from './components/switch';
23
24
  export { Tabs, type TabsProps, type TabsItem } from './components/tabs';
24
25
  export { Table } from './components/table';
25
26
  export { Text } from './components/text';
26
- export { Toasty, Toast } from './components/toast';
27
+ export { Toasty, Toast, useKumoToastManager } from './components/toast';
27
28
  export { Tooltip, TooltipProvider } from './components/tooltip';
28
29
  export { Popover, KUMO_POPOVER_VARIANTS, KUMO_POPOVER_DEFAULT_VARIANTS, type PopoverRootProps, type PopoverTriggerProps, type PopoverContentProps, type PopoverTitleProps, type PopoverDescriptionProps, type PopoverCloseProps, } from './components/popover';
29
30
  export { SensitiveInput, type SensitiveInputProps, KUMO_SENSITIVE_INPUT_VARIANTS, KUMO_SENSITIVE_INPUT_DEFAULT_VARIANTS, } from './components/sensitive-input';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}