@pebble-software/bonsai 0.0.8 → 0.1.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 (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +367 -88
  3. package/dist/chunks/button-CSLrIvsS.js +166 -0
  4. package/dist/chunks/button-CSLrIvsS.js.map +1 -0
  5. package/dist/chunks/create-renderer-1cky1uN9.js +280 -0
  6. package/dist/chunks/create-renderer-1cky1uN9.js.map +1 -0
  7. package/dist/chunks/render-shared-CIUUkLDn.js +2319 -0
  8. package/dist/chunks/render-shared-CIUUkLDn.js.map +1 -0
  9. package/dist/components/core/bonsai.d.ts +5 -0
  10. package/dist/components/core/render-shared.d.ts +123 -0
  11. package/dist/components/core/render-tree-client.d.ts +4 -0
  12. package/dist/components/core/render-tree-server.d.ts +2 -0
  13. package/dist/components/ui/a.d.ts +3 -0
  14. package/dist/components/ui/accordion.d.ts +17 -0
  15. package/dist/components/ui/alert-dialog.d.ts +23 -0
  16. package/dist/components/ui/alert.d.ts +12 -0
  17. package/dist/components/ui/avatar.d.ts +21 -0
  18. package/dist/components/ui/badge.d.ts +10 -0
  19. package/dist/components/ui/breadcrumb.d.ts +10 -0
  20. package/dist/components/ui/button.d.ts +14 -0
  21. package/dist/components/ui/calendar.d.ts +9 -0
  22. package/dist/components/ui/card.d.ts +15 -0
  23. package/dist/components/ui/checkbox.d.ts +7 -0
  24. package/dist/components/ui/collapsible.d.ts +5 -0
  25. package/dist/components/ui/combobox.d.ts +31 -0
  26. package/dist/components/ui/command.d.ts +23 -0
  27. package/dist/components/ui/dialog.d.ts +23 -0
  28. package/dist/components/ui/drawer.d.ts +22 -0
  29. package/dist/components/ui/dropdown-menu.d.ts +29 -0
  30. package/dist/components/ui/form.d.ts +24 -0
  31. package/dist/components/ui/h.d.ts +10 -0
  32. package/dist/components/ui/input-group.d.ts +18 -0
  33. package/dist/components/ui/input-otp.d.ts +11 -0
  34. package/dist/components/ui/input.d.ts +3 -0
  35. package/dist/components/ui/label.d.ts +10 -0
  36. package/dist/components/ui/loader.d.ts +14 -0
  37. package/dist/components/ui/p.d.ts +11 -0
  38. package/dist/components/ui/popover.d.ts +9 -0
  39. package/dist/components/ui/progress.d.ts +31 -0
  40. package/dist/components/ui/scroll-area.d.ts +13 -0
  41. package/dist/components/ui/select.d.ts +17 -0
  42. package/dist/components/ui/separator.d.ts +8 -0
  43. package/dist/components/ui/sidebar.d.ts +70 -0
  44. package/dist/components/ui/signature-pad.d.ts +7 -0
  45. package/dist/components/ui/skeleton.d.ts +7 -0
  46. package/dist/components/ui/switch.d.ts +8 -0
  47. package/dist/components/ui/table.d.ts +14 -0
  48. package/dist/components/ui/tabs.d.ts +15 -0
  49. package/dist/components/ui/textarea.d.ts +5 -0
  50. package/dist/components/ui/toast.d.ts +46 -0
  51. package/dist/components/ui/tooltip.d.ts +15 -0
  52. package/dist/core.d.ts +12 -0
  53. package/dist/core.js +17 -0
  54. package/dist/core.js.map +1 -0
  55. package/dist/hooks/haptics.d.ts +8 -0
  56. package/dist/hooks/use-mobile.d.ts +1 -0
  57. package/dist/index.css +7 -0
  58. package/dist/index.d.ts +27 -339
  59. package/dist/index.js +1076 -4194
  60. package/dist/index.js.map +1 -0
  61. package/dist/lib/ast/cache.d.ts +8 -0
  62. package/dist/lib/ast/evaluator.d.ts +2 -0
  63. package/dist/lib/ast/helpers.d.ts +2 -0
  64. package/dist/lib/ast/index.d.ts +29 -0
  65. package/dist/lib/ast/setup.d.ts +2 -0
  66. package/dist/lib/ast/types.d.ts +1 -0
  67. package/dist/lib/ast/utils.d.ts +4 -0
  68. package/dist/lib/haptics.d.ts +8 -0
  69. package/dist/lib/registry/drift.d.ts +17 -0
  70. package/dist/lib/registry/identity.d.ts +24 -0
  71. package/dist/lib/registry/json-schema-to-zod.d.ts +32 -0
  72. package/dist/lib/registry/manifest-schema.d.ts +62 -0
  73. package/dist/lib/registry/manifest.d.ts +26 -0
  74. package/dist/lib/registry/merge-generated.d.ts +7 -0
  75. package/dist/lib/registry/pebble-registry.d.ts +1 -0
  76. package/dist/lib/registry/types.d.ts +29 -0
  77. package/dist/lib/registry/validate.d.ts +18 -0
  78. package/dist/lib/renderer/compile-template.d.ts +70 -0
  79. package/dist/lib/ui/registry.d.ts +19 -0
  80. package/dist/lib/utils.d.ts +3 -0
  81. package/dist/presets/calendar.js +373 -0
  82. package/dist/presets/calendar.js.map +1 -0
  83. package/dist/presets/signature.js +404 -0
  84. package/dist/presets/signature.js.map +1 -0
  85. package/dist/renderer/core-registry.d.ts +52 -0
  86. package/dist/renderer/create-renderer.d.ts +38 -0
  87. package/dist/renderer/presets/calendar.d.ts +5 -0
  88. package/dist/renderer/presets/signature.d.ts +6 -0
  89. package/dist/types.d.ts +1 -0
  90. package/package.json +47 -18
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calendar.js","sources":["../../src/components/ui/select.tsx","../../src/components/ui/calendar.tsx","../../src/renderer/presets/calendar.ts"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Select as SelectPrimitive } from \"@base-ui/react/select\";\nimport {\n IconSelector,\n IconCheck,\n IconChevronUp,\n IconChevronDown,\n} from \"@tabler/icons-react\";\nimport { cn } from \"@/lib/utils\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { buttonVariants } from \"./button\";\n\nconst Select = SelectPrimitive.Root;\n(Select as any).displayName = \"Select\";\n\nfunction SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) {\n return (\n <SelectPrimitive.Group\n data-slot=\"select-group\"\n className={cn(\"scroll-my-1 p-1\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectValue({ className, ...props }: SelectPrimitive.Value.Props) {\n return (\n <SelectPrimitive.Value\n data-slot=\"select-value\"\n className={cn(\n \"flex flex-1 text-left\",\n \"group/select-trigger:line-clamp-1 group/select-trigger:items-center data-placeholder:text-subtle font-base\",\n className,\n )}\n {...props}\n />\n );\n}\n\ninterface SelectTriggerProps\n extends\n SelectPrimitive.Trigger.Props,\n Omit<VariantProps<typeof buttonVariants>, \"icon\"> {}\n\nfunction SelectTrigger({\n className,\n size = \"lg\",\n variant = \"outline\",\n raised,\n extrude,\n children,\n ...props\n}: SelectTriggerProps) {\n return (\n <SelectPrimitive.Trigger\n data-slot=\"select-trigger\"\n data-size={size}\n aria-label={props[\"aria-label\"] ?? \"select-trigger\"}\n className={cn(\n buttonVariants({ size, variant, raised, extrude }),\n \"group/select-trigger neo-base neo-input-focus disabled:opacity-50 [&_svg]:shrink-0 w-full\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon\n className=\"flex items-center justify-center\"\n render={\n <IconSelector\n data-slot=\"select-selector\"\n className=\"text-muted size-4 pointer-events-none\"\n />\n }\n />\n </SelectPrimitive.Trigger>\n );\n}\n\nfunction SelectContent({\n className,\n children,\n side = \"bottom\",\n sideOffset = 4,\n align = \"center\",\n alignOffset = 0,\n alignItemWithTrigger = true,\n ...props\n}: SelectPrimitive.Popup.Props &\n Pick<\n SelectPrimitive.Positioner.Props,\n \"align\" | \"alignOffset\" | \"side\" | \"sideOffset\" | \"alignItemWithTrigger\"\n >) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignOffset={alignOffset}\n alignItemWithTrigger={alignItemWithTrigger}\n className=\"isolate z-50\"\n >\n <SelectPrimitive.Popup\n data-slot=\"select-content\"\n className={cn(\n \"neo-base neo-focus relative isolate bg-surface text-foreground rounded-base shadow-md border-2 z-50 duration-100\",\n \"max-h-(--available-height) w-(--anchor-width) min-w-36\",\n \"origin-(--transform-origin) overflow-x-hidden overflow-y-auto\",\n \"data-open:animate-in data-open:fade-in-0 data-closed:zoom-out-95 data-open:zoom-in-95\",\n \"data-closed:animate-out data-closed:fade-out-0\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=left]:slide-in-from-right-2\",\n \"data-[side=right]:slide-in-from-left-2\",\n className,\n )}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.List className=\"flex flex-col gap-0.5 p-0.5\">\n {children}\n </SelectPrimitive.List>\n <SelectScrollDownButton />\n </SelectPrimitive.Popup>\n </SelectPrimitive.Positioner>\n </SelectPrimitive.Portal>\n );\n}\n\nfunction SelectLabel({\n className,\n ...props\n}: SelectPrimitive.GroupLabel.Props) {\n return (\n <SelectPrimitive.GroupLabel\n data-slot=\"select-label\"\n className={cn(\"text-muted px-2 py-1.5 text-xs\", className)}\n {...props}\n />\n );\n}\n\nfunction SelectItem({\n className,\n children,\n ...props\n}: SelectPrimitive.Item.Props) {\n return (\n <SelectPrimitive.Item\n data-slot=\"select-item\"\n className={cn(\n \"neo-base flex items-center gap-2 py-1.5 pr-8 pl-2 relative w-full cursor-pointer select-none\",\n \"border-2 border-transparent hover:border-border focus-visible:border-border outline-hidden rounded-base text-sm\",\n \"*:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\",\n \"data-disabled:pointer-events-none data-disabled:opacity-50\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n {...props}\n >\n <SelectPrimitive.ItemText className=\"flex flex-1 gap-2 shrink-0 whitespace-nowrap\">\n {children}\n </SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator\n render={\n <span className=\"pointer-events-none absolute right-2 flex size-4 items-center justify-center\" />\n }\n >\n <IconCheck className=\"pointer-events-none\" />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n );\n}\n\nfunction SelectSeparator({\n className,\n ...props\n}: SelectPrimitive.Separator.Props) {\n return (\n <SelectPrimitive.Separator\n data-slot=\"select-separator\"\n className={cn(\n \"bg-foreground -mx-1 my-1 h-px pointer-events-none\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SelectScrollUpButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>) {\n return (\n <SelectPrimitive.ScrollUpArrow\n data-slot=\"select-scroll-up-button\"\n className={cn(\n \"bg-surface z-10 flex cursor-default items-center justify-center py-1 top-0 w-full\",\n className,\n )}\n {...props}\n >\n <IconChevronUp />\n </SelectPrimitive.ScrollUpArrow>\n );\n}\n\nfunction SelectScrollDownButton({\n className,\n ...props\n}: React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>) {\n return (\n <SelectPrimitive.ScrollDownArrow\n data-slot=\"select-scroll-down-button\"\n className={cn(\n \"bg-surface z-10 flex cursor-default items-center justify-center py-1 bottom-0 w-full\",\n className,\n )}\n {...props}\n >\n <IconChevronDown />\n </SelectPrimitive.ScrollDownArrow>\n );\n}\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n DayPicker,\n getDefaultClassNames,\n type DayButton,\n type DropdownOption,\n} from \"react-day-picker\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Button, buttonVariants } from \"@/components/ui/button\";\nimport {\n IconChevronLeft,\n IconChevronRight,\n IconChevronDown,\n} from \"@tabler/icons-react\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\";\n\ntype CalendarProps = React.ComponentProps<typeof DayPicker> & {\n buttonVariant?: React.ComponentProps<typeof Button>[\"variant\"];\n hideWeekends?: boolean;\n};\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n captionLayout = \"label\",\n hideWeekdays = false,\n buttonVariant = \"outline\",\n hideWeekends,\n formatters,\n components,\n ...props\n}: CalendarProps) {\n const defaultClassNames = getDefaultClassNames();\n\n return (\n <DayPicker\n showOutsideDays={showOutsideDays}\n className={cn(\n \"p-3 bg-surface group/calendar [--cell-size:--spacing(8)]\",\n \"in-data-[slot=card-content]:bg-transparent\",\n \"in-data-[slot=popover-content]:bg-transparent\",\n className,\n )}\n captionLayout={captionLayout}\n formatters={{\n formatCaption: (date) =>\n date.toLocaleString(\"default\", { month: \"short\", year: \"numeric\" }),\n formatMonthDropdown: (date) =>\n date.toLocaleString(\"default\", { month: \"short\" }),\n ...formatters,\n }}\n classNames={{\n root: cn(\"w-fit\", defaultClassNames.root),\n nav: cn(\n \"flex items-center gap-1 w-full absolute top-0 inset-x-0 justify-between\",\n defaultClassNames.nav,\n ),\n button_previous: cn(\n buttonVariants({ variant: buttonVariant, icon: \"sm\" }),\n \"aria-disabled:opacity-50 aria-disabled:translate-[0px] aria-disabled:shadow-none aria-disabled:pointer-events-none\",\n defaultClassNames.button_previous,\n ),\n button_next: cn(\n buttonVariants({ variant: buttonVariant, icon: \"sm\" }),\n \"aria-disabled:opacity-50 aria-disabled:translate-[0px] aria-disabled:shadow-none aria-disabled:pointer-events-none\",\n defaultClassNames.button_next,\n ),\n caption_label: cn(\"select-none\", defaultClassNames.caption_label),\n months: cn(\n \"flex gap-4 flex-col md:flex-row relative\",\n defaultClassNames.months,\n ),\n month: cn(\n \"flex flex-col w-full gap-4 *:first:*:h-(--cell-size) *:first:*:flex *:first:*:items-center *:first:*:justify-center *:first:**:font-medium *:first:**:font-heading *:first:**:text-base\",\n defaultClassNames.month,\n ),\n table: \"w-full border-collapse\",\n weekdays: cn(\"flex\", defaultClassNames.weekdays),\n weekday: cn(\n hideWeekdays\n ? \"hidden\"\n : \"text-sm font-normal font-heading text-muted text-center select-none flex-1\",\n defaultClassNames.weekday,\n ),\n week_number: cn(\n \"text-sm font-normal font-heading text-muted text-center select-none flex size-(--cell-size) items-center justify-center my-auto\",\n defaultClassNames.week_number,\n ),\n week_number_header: cn(\n \"select-none w-(--cell-size)\",\n defaultClassNames.week_number_header,\n ),\n week: cn(\"flex w-full\", defaultClassNames.week),\n day: cn(\n \"relative text-center group/day select-none transition-[width,padding,margin] duration-200\",\n defaultClassNames.day,\n ),\n day_button: cn(\"m-1\", defaultClassNames.day_button),\n today: cn(\n \"*:data-[slot=calendar-day-button]:font-semibold *:data-[slot=calendar-day-button]:text-lg\",\n defaultClassNames.today,\n ),\n outside: cn(\n \"text-muted aria-selected:text-foreground opacity-50 hover:opacity-100 aria-selected:opacity-100 aria-selected:*:data-[slot=calendar-day-button]:bg-main-secondary hover:*:data-[slot=calendar-day-button]:bg-surface *:data-[slot=calendar-day-button]:bg-foreground/20\",\n defaultClassNames.outside,\n ),\n ...classNames,\n }}\n components={{\n Root: ({ className, rootRef, ...props }) => {\n return (\n <div\n data-slot=\"calendar\"\n ref={rootRef}\n className={cn(className)}\n {...props}\n />\n );\n },\n Chevron: ({ className, orientation, ...props }) => {\n if (orientation === \"left\") {\n return (\n <IconChevronLeft className={cn(\"size-4\", className)} {...props} />\n );\n }\n\n if (orientation === \"right\") {\n return (\n <IconChevronRight\n className={cn(\"size-4\", className)}\n {...props}\n />\n );\n }\n\n return (\n <IconChevronDown className={cn(\"size-4\", className)} {...props} />\n );\n },\n Weekday: ({ children, ...props }) => {\n const isWeekend =\n props[\"aria-label\"] === \"Saturday\" ||\n props[\"aria-label\"] === \"Sunday\";\n if (hideWeekends && isWeekend) {\n return <td hidden />;\n }\n return <td {...props}>{children}</td>;\n },\n Day: ({ children, ...props }) => {\n const weekday = new Date(props.day.date).getDay();\n const isWeekend = weekday === 0 || weekday === 6;\n if (hideWeekends && isWeekend) {\n return <td hidden />;\n }\n if (props.modifiers.hidden) {\n return (\n <td className=\"all-unset size-(--cell-size) m-1 bg-foreground opacity-20 rounded-base\" />\n );\n }\n return <td {...props}>{children}</td>;\n },\n Dropdown: CalendarDropdown,\n DayButton: CalendarDayButton,\n ...components,\n }}\n {...props}\n />\n );\n}\n\nfunction CalendarDayButton({\n day,\n modifiers,\n ...props\n}: React.ComponentProps<typeof DayButton>) {\n const ref = React.useRef<HTMLButtonElement>(null);\n React.useEffect(() => {\n if (modifiers.focused) ref.current?.focus();\n }, [modifiers.focused]);\n\n return (\n <Button\n data-slot=\"calendar-day-button\"\n data-day={day.date.toLocaleDateString()}\n data-selected-single={\n modifiers.selected &&\n !modifiers.range_start &&\n !modifiers.range_end &&\n !modifiers.range_middle\n }\n data-range-start={modifiers.range_start}\n data-range-end={modifiers.range_end}\n data-range-middle={modifiers.range_middle}\n aria-label={day.date.toDateString()}\n raised={\n modifiers.range_start || modifiers.range_end\n ? \"md\"\n : modifiers.range_middle\n ? \"xs\"\n : \"sm\"\n }\n variant={modifiers.selected ? \"default\" : \"outline\"}\n extrude={modifiers.selected ? null : \"xs\"}\n disabled={modifiers.disabled}\n icon=\"sm\"\n {...props}\n />\n );\n}\n\nfunction CalendarDropdown(\n props: Omit<React.SelectHTMLAttributes<HTMLSelectElement>, \"children\"> & {\n options?: DropdownOption[] | undefined;\n },\n) {\n const { options, onChange, value } = props;\n const selected = options?.find((option) => option.value === value);\n const handleChange = (value: string) => {\n const changeEvent = {\n target: { value },\n } as React.ChangeEvent<HTMLSelectElement>;\n onChange?.(changeEvent);\n };\n\n return (\n <Select\n value={value?.toString()}\n onValueChange={(value) => handleChange(value as any)}\n >\n <SelectTrigger\n variant=\"ghost\"\n raised={null}\n extrude={null}\n className=\"w-fit mx-1\"\n size=\"sm\"\n >\n <SelectValue>{selected?.label}</SelectValue>\n </SelectTrigger>\n <SelectContent className=\"bg-transparent border-0 w-30 shadow-none\">\n <div className=\"p-2\">\n <div className=\"flex flex-col items-center bg-foreground shadow-xs rounded-base\">\n {options?.map((option) => (\n <SelectItem\n className={cn(\n buttonVariants({ extrude: \"md\" }),\n \"not-last:rounded-b-none not-first:rounded-t-none border-2 not-last:border-b-0 hover:border-2 hover:z-2 z-1 duration-200\",\n )}\n key={option.value}\n value={option.value.toString()}\n >\n {option.label}\n </SelectItem>\n ))}\n </div>\n </div>\n </SelectContent>\n </Select>\n );\n}\n\nexport { Calendar };\n","import { COMPONENT } from \"@bonsai/constants\";\n\nimport { Calendar } from \"../../components/ui/calendar\";\nimport type { BonsaiPreset } from \"../core-registry\";\n\n/** Opt-in `calendar` component. Pulls in react-day-picker. */\nexport const calendarPreset: BonsaiPreset = {\n components: {\n [COMPONENT.CALENDAR]: Calendar,\n },\n controlledInputs: {\n [COMPONENT.CALENDAR]: {\n valueProp: \"selected\",\n changeProp: \"onSelect\",\n extractor: (date) => date,\n },\n },\n};\n\nexport { Calendar };\n"],"names":["Select","SelectPrimitive","SelectValue","className","props","jsx","cn","SelectTrigger","size","variant","raised","extrude","children","jsxs","buttonVariants","IconSelector","SelectContent","side","sideOffset","align","alignOffset","alignItemWithTrigger","SelectScrollUpButton","SelectScrollDownButton","SelectItem","IconCheck","IconChevronUp","IconChevronDown","Calendar","classNames","showOutsideDays","captionLayout","hideWeekdays","buttonVariant","hideWeekends","formatters","components","defaultClassNames","getDefaultClassNames","DayPicker","date","rootRef","orientation","IconChevronLeft","IconChevronRight","isWeekend","weekday","CalendarDropdown","CalendarDayButton","day","modifiers","ref","React","Button","options","onChange","value","selected","option","handleChange","calendarPreset","COMPONENT"],"mappings":"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"}
@@ -0,0 +1,404 @@
1
+ import { c as n, H as D, B as G, C } from "../chunks/button-CSLrIvsS.js";
2
+ import { jsx as a, jsxs as u } from "react/jsx-runtime";
3
+ import { useState as S, useRef as x, useCallback as L, useEffect as v } from "react";
4
+ import { Tabs as _ } from "@base-ui/react/tabs";
5
+ import { cva as B } from "class-variance-authority";
6
+ import { useWebHaptics as U } from "web-haptics/react";
7
+ import F from "react-signature-canvas";
8
+ import { IconWriting as O, IconTextSize as $, IconEraser as H } from "@tabler/icons-react";
9
+ import { u as W, I as V, v as X, w as Z } from "../chunks/render-shared-CIUUkLDn.js";
10
+ function q({
11
+ className: r,
12
+ orientation: s = "horizontal",
13
+ ...i
14
+ }) {
15
+ return /* @__PURE__ */ a(
16
+ _.Root,
17
+ {
18
+ "data-slot": "tabs",
19
+ "data-orientation": s,
20
+ className: n(
21
+ "gap-2 group/tabs flex",
22
+ "data-[orientation=horizontal]:flex-col",
23
+ "data-[orientation=vertical]:w-full",
24
+ r
25
+ ),
26
+ ...i
27
+ }
28
+ );
29
+ }
30
+ const Y = B(
31
+ "overflow-auto inline-flex bg-transparent w-fit items-start justify-start group-data-horizontal/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col",
32
+ {
33
+ variants: {
34
+ variant: {
35
+ default: "gap-1.5 border-2 rounded-base p-[calc(var(--trigger-translate)+6px)]",
36
+ ghost: "gap-1 border-none rounded-none p-[calc(var(--trigger-translate)+6px)]",
37
+ icon: "gap-1.5 border-2 rounded-base p-[calc(var(--trigger-translate)+6px)]",
38
+ contained: "gap-0 border-0 rounded-md p-[calc(var(--trigger-translate)+2px)]"
39
+ },
40
+ size: {
41
+ sm: "",
42
+ md: "",
43
+ lg: "",
44
+ xl: ""
45
+ },
46
+ extrude: {
47
+ default: "[--trigger-shadow:var(--shadow-none)] [--trigger-translate:0px] [--focus-trigger-translate:0px]",
48
+ xs: "[--trigger-shadow:var(--shadow-min)] [--trigger-translate:1px] [--focus-trigger-shadow:var(--shadow-none)] [--focus-trigger-translate:0px]",
49
+ sm: "[--trigger-shadow:var(--shadow-xs)] [--trigger-translate:2px] [--focus-trigger-shadow:var(--shadow-min)] [--focus-trigger-translate:1px]",
50
+ md: "[--trigger-shadow:var(--shadow-sm)] [--trigger-translate:3px] [--focus-trigger-shadow:var(--shadow-xs)] [--focus-trigger-translate:2px]",
51
+ lg: "[--trigger-shadow:var(--shadow-md)] [--trigger-translate:4px] [--focus-trigger-shadow:var(--shadow-xs)] [--focus-trigger-translate:2px]",
52
+ xl: "[--trigger-shadow:var(--shadow-lg)] [--trigger-translate:5px] [--focus-trigger-shadow:var(--shadow-xs)] [--focus-trigger-translate:2px]"
53
+ }
54
+ },
55
+ defaultVariants: {
56
+ variant: "default",
57
+ size: "md",
58
+ extrude: "default"
59
+ }
60
+ }
61
+ );
62
+ function J({
63
+ className: r,
64
+ variant: s = "default",
65
+ size: i = "md",
66
+ extrude: d = "default",
67
+ ...c
68
+ }) {
69
+ return /* @__PURE__ */ a(
70
+ _.List,
71
+ {
72
+ "data-slot": "tabs-list",
73
+ "data-variant": s,
74
+ "data-size": i,
75
+ className: n(
76
+ Y({ variant: s, size: i, extrude: d }),
77
+ "group/tabs-list",
78
+ r
79
+ ),
80
+ ...c
81
+ }
82
+ );
83
+ }
84
+ function R({
85
+ label: r,
86
+ description: s,
87
+ children: i,
88
+ className: d,
89
+ onClick: c,
90
+ ...t
91
+ }) {
92
+ const { trigger: l } = U();
93
+ return /* @__PURE__ */ u(
94
+ _.Tab,
95
+ {
96
+ "data-slot": "tabs-trigger",
97
+ "aria-label": t.value ?? "tabs-trigger",
98
+ className: n(
99
+ "group/tabs-trigger neo-base relative inline-flex flex-1 items-center justify-center overflow-hidden cursor-pointer rounded-base border-2 py-1",
100
+ "bg-surface data-active:bg-main",
101
+ "font-medium h-[calc(100%-1px)] whitespace-nowrap [&_svg]:shrink-0",
102
+ "transition-[translate,box-shadow,border,color] duration-200",
103
+ "aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-disabled:shadow-none aria-disabled:translate-0",
104
+ "group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start",
105
+ "active:shadow-none active:translate-0",
106
+ "data-active:shadow-(--trigger-shadow) data-active:-translate-(--trigger-translate)",
107
+ "hover:shadow-(--trigger-shadow) hover:-translate-(--trigger-translate)",
108
+ "focus-visible:shadow-(--focus-trigger-shadow) focus-visible:-translate-(--focus-trigger-translate)",
109
+ "focus-visible:hover:-translate-(--focus-trigger-translate) focus-visible:**:font-semibold",
110
+ "group-data-[size=xl]/tabs-list:min-h-12",
111
+ "group-data-[size=sm]/tabs-list:[&_svg:not([class*='size-'])]:size-4",
112
+ "group-data-[size=md]/tabs-list:[&_svg:not([class*='size-'])]:size-5",
113
+ "group-data-[size=lg]/tabs-list:[&_svg:not([class*='size-'])]:size-6",
114
+ "group-data-[size=xl]/tabs-list:[&_svg:not([class*='size-'])]:size-7",
115
+ "group-data-[variant=default]/tabs-list:group-data-[size=sm]/tabs-list:px-3",
116
+ "group-data-[variant=default]/tabs-list:group-data-[size=md]/tabs-list:px-4",
117
+ "group-data-[variant=default]/tabs-list:group-data-[size=lg]/tabs-list:px-5",
118
+ "group-data-[variant=default]/tabs-list:group-data-[size=xl]/tabs-list:px-6",
119
+ "group-data-[variant=ghost]/tabs-list:group-data-[size=sm]/tabs-list:px-3",
120
+ "group-data-[variant=ghost]/tabs-list:group-data-[size=md]/tabs-list:px-4",
121
+ "group-data-[variant=ghost]/tabs-list:group-data-[size=lg]/tabs-list:px-5",
122
+ "group-data-[variant=ghost]/tabs-list:group-data-[size=xl]/tabs-list:px-6",
123
+ "group-data-[variant=ghost]/tabs-list:border-none",
124
+ "group-data-[variant=ghost]/tabs-list:data-active:bg-transparent group-data-[variant=ghost]/tabs-list:shadow-none",
125
+ "group-data-[variant=icon]/tabs-list:group-data-[size=sm]/tabs-list:px-1.5",
126
+ "group-data-[variant=icon]/tabs-list:group-data-[size=md]/tabs-list:px-2",
127
+ "group-data-[variant=icon]/tabs-list:group-data-[size=lg]/tabs-list:px-2.5",
128
+ "group-data-[variant=icon]/tabs-list:group-data-[size=xl]/tabs-list:px-3",
129
+ "group-data-[variant=icon]/tabs-list:m-auto group-data-[variant=icon]/tabs-list:max-w-fit group-data-[variant=icon]/tabs-list:aspect-square group-data-[variant=icon]/tabs-list:items-center group-data-[variant=icon]/tabs-list:justify-center group-data-[variant=icon]/tabs-list:hover:border-foreground group-data-[variant=icon]/tabs-list:border-transparent group-data-[variant=icon]/tabs-list:data-active:border-border",
130
+ "group-data-[variant=contained]/tabs-list:group-data-[size=sm]/tabs-list:px-3",
131
+ "group-data-[variant=contained]/tabs-list:group-data-[size=md]/tabs-list:px-4",
132
+ "group-data-[variant=contained]/tabs-list:group-data-[size=lg]/tabs-list:px-5",
133
+ "group-data-[variant=contained]/tabs-list:group-data-[size=xl]/tabs-list:px-6",
134
+ "group-data-[orientation=horizontal]/tabs:group-data-[variant=contained]/tabs-list:not-last:rounded-r-none group-data-[orientation=horizontal]/tabs:group-data-[variant=contained]/tabs-list:not-first:rounded-l-none group-data-[orientation=vertical]/tabs:group-data-[variant=contained]/tabs-list:not-last:rounded-b-none group-data-[orientation=vertical]/tabs:group-data-[variant=contained]/tabs-list:not-first:rounded-t-none group-data-[variant=contained]/tabs-list:-m-px",
135
+ i ? "gap-1.5" : "flex-col gap-0.5",
136
+ d
137
+ ),
138
+ onClick: (o) => {
139
+ l(D), c?.(o);
140
+ },
141
+ ...t,
142
+ children: [
143
+ r && /* @__PURE__ */ a(
144
+ "span",
145
+ {
146
+ "data-slot": "tabs-trigger-label",
147
+ className: n(
148
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 font-medium font-heading",
149
+ "group-data-[size=sm]/tabs-list:text-sm",
150
+ "group-data-[size=md]/tabs-list:text-base",
151
+ "group-data-[size=lg]/tabs-list:text-lg",
152
+ "group-data-[size=xl]/tabs-list:text-2xl"
153
+ ),
154
+ children: r
155
+ }
156
+ ),
157
+ s && /* @__PURE__ */ a(
158
+ "span",
159
+ {
160
+ "data-slot": "tabs-trigger-description",
161
+ className: n(
162
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0 whitespace-normal",
163
+ "group-data-[size=sm]/tabs-list:text-xs",
164
+ "group-data-[size=md]/tabs-list:text-sm",
165
+ "group-data-[size=lg]/tabs-list:text-base",
166
+ "group-data-[size=xl]/tabs-list:text-lg"
167
+ ),
168
+ children: s
169
+ }
170
+ ),
171
+ i,
172
+ /* @__PURE__ */ a(
173
+ "div",
174
+ {
175
+ "data-slot": "tabs-trigger-indicator",
176
+ className: n(
177
+ "pointer-events-none h-[3px] rounded-full bg-foreground absolute hidden bottom-0 left-1 right-1",
178
+ "group-data-[variant=ghost]/tabs-list:group-data-active/tabs-trigger:block"
179
+ )
180
+ }
181
+ )
182
+ ]
183
+ }
184
+ );
185
+ }
186
+ const E = '"Great Vibes", cursive', K = 64, Q = 24, tt = 20;
187
+ function k({
188
+ canvas: r,
189
+ text: s,
190
+ width: i,
191
+ height: d,
192
+ ratio: c
193
+ }) {
194
+ const t = r.getContext("2d");
195
+ if (!t) return !1;
196
+ const l = Math.max(1, Math.floor(i)), o = Math.max(1, Math.floor(d)), p = Math.max(c || 1, 1);
197
+ r.width = Math.max(1, Math.floor(l * p)), r.height = Math.max(1, Math.floor(o * p)), t.setTransform(p, 0, 0, p, 0, 0), t.clearRect(0, 0, l, o);
198
+ const g = s.trim();
199
+ if (!g) return !1;
200
+ const f = Math.max(1, l - tt * 2);
201
+ t.fillStyle = "#000", t.textAlign = "center", t.textBaseline = "middle";
202
+ let b = K;
203
+ for (; b > Q && (t.font = `${b}px ${E}`, !(t.measureText(g).width <= f)); )
204
+ b -= 1;
205
+ return t.font = `${b}px ${E}`, t.fillText(g, l / 2, o / 2, f), !0;
206
+ }
207
+ function at({
208
+ value: r,
209
+ onChange: s,
210
+ canvasClassname: i,
211
+ imageType: d = "image/png"
212
+ }) {
213
+ const c = W(), [t, l] = S("sign"), [o, p] = S(""), g = x(null), f = x(null), b = x(s), w = x(r ?? null), N = x(!1), z = x({ width: 0, height: 0 }), m = L((e) => {
214
+ w.current !== e && (w.current = e, b.current?.(e));
215
+ }, []);
216
+ v(() => {
217
+ b.current = s;
218
+ }, [s]), v(() => {
219
+ w.current = r ?? null;
220
+ }, [r]), v(() => {
221
+ if (N.current || (N.current = !0, !r || t !== "sign")) return;
222
+ const e = g.current;
223
+ if (e)
224
+ try {
225
+ e.fromDataURL(r);
226
+ } catch {
227
+ e.clear();
228
+ }
229
+ }, []), v(() => {
230
+ if (t !== "type") return;
231
+ const e = f.current;
232
+ if (!e) return;
233
+ if (z.current.width === 0) {
234
+ const I = e.getBoundingClientRect();
235
+ z.current = {
236
+ width: Math.max(1, Math.floor(I.width)),
237
+ height: Math.max(1, Math.floor(I.height))
238
+ };
239
+ }
240
+ const h = z.current;
241
+ if (!h.width || !h.height) return;
242
+ const M = window.devicePixelRatio || 1;
243
+ if (!k({
244
+ canvas: e,
245
+ text: o,
246
+ width: h.width,
247
+ height: h.height,
248
+ ratio: M
249
+ })) {
250
+ m(null);
251
+ return;
252
+ }
253
+ const y = document.createElement("canvas");
254
+ k({
255
+ canvas: y,
256
+ text: o,
257
+ width: h.width,
258
+ height: h.height,
259
+ ratio: M
260
+ }), m(y.toDataURL(d));
261
+ }, [t, o, d, m]);
262
+ const T = () => {
263
+ g.current?.clear(), p(""), m(null);
264
+ }, A = () => {
265
+ if (t !== "sign") return;
266
+ const e = g.current?.toDataURL(d) ?? null;
267
+ m(e);
268
+ }, j = (e) => {
269
+ e !== t && (T(), l(e));
270
+ }, P = (e) => {
271
+ p(e.target.value);
272
+ };
273
+ return c === "pdf" ? /* @__PURE__ */ a("div", { id: "signature", className: "w-full", children: r ? /* @__PURE__ */ a(
274
+ "img",
275
+ {
276
+ src: r,
277
+ alt: "Signature",
278
+ className: n(
279
+ "w-full h-[256px] object-contain",
280
+ "bg-size-[32px_32px] bg-surface",
281
+ "bg-[linear-gradient(to_right,#80808022_1px,transparent_1px),linear-gradient(to_bottom,#80808022_1px,transparent_1px)]",
282
+ "border-border border-2 rounded-base",
283
+ i
284
+ )
285
+ }
286
+ ) : /* @__PURE__ */ a(
287
+ "div",
288
+ {
289
+ "aria-label": "Unsigned",
290
+ className: n(
291
+ "w-full h-[256px] flex items-end",
292
+ "bg-size-[32px_32px] bg-surface",
293
+ "bg-[linear-gradient(to_right,#80808022_1px,transparent_1px),linear-gradient(to_bottom,#80808022_1px,transparent_1px)]",
294
+ "border-border border-2 rounded-base",
295
+ i
296
+ ),
297
+ children: /* @__PURE__ */ a("div", { className: "w-full border-t-2 border-dashed border-border mx-6 mb-8 pb-1 text-center text-sm text-muted-foreground", children: "Signature" })
298
+ }
299
+ ) }) : /* @__PURE__ */ a("div", { id: "signature", children: /* @__PURE__ */ u(
300
+ V,
301
+ {
302
+ className: n(
303
+ t === "type" ? "max-h-84" : "max-h-69",
304
+ "overflow-hidden transition-[max-height] duration-300 has-[>[data-align=block-start]]:p-2 gap-2"
305
+ ),
306
+ children: [
307
+ /* @__PURE__ */ a(X, { align: "block-start", className: "p-0!", children: /* @__PURE__ */ u("div", { className: "relative w-full rounded-base", children: [
308
+ /* @__PURE__ */ u("div", { className: "absolute top-4 left-4 right-3 bg-transparent flex flex-row items-start justify-between gap-3", children: [
309
+ /* @__PURE__ */ a(
310
+ q,
311
+ {
312
+ value: t,
313
+ onValueChange: (e) => j(e),
314
+ className: "-mt-1",
315
+ children: /* @__PURE__ */ u(J, { variant: "contained", extrude: "sm", size: "md", children: [
316
+ /* @__PURE__ */ u(R, { value: "sign", children: [
317
+ /* @__PURE__ */ a(O, {}),
318
+ /* @__PURE__ */ a("span", { className: "hidden sm:flex", children: "Draw" })
319
+ ] }),
320
+ /* @__PURE__ */ u(R, { value: "type", children: [
321
+ /* @__PURE__ */ a($, {}),
322
+ /* @__PURE__ */ a("span", { className: "hidden sm:flex", children: "Type" })
323
+ ] })
324
+ ] })
325
+ }
326
+ ),
327
+ /* @__PURE__ */ u(
328
+ G,
329
+ {
330
+ size: "sm",
331
+ raised: "xs",
332
+ variant: "outline",
333
+ onClick: T,
334
+ children: [
335
+ /* @__PURE__ */ a(H, {}),
336
+ /* @__PURE__ */ a("span", { className: "hidden sm:flex", children: "Clear" })
337
+ ]
338
+ }
339
+ )
340
+ ] }),
341
+ t === "sign" ? /* @__PURE__ */ a(
342
+ F,
343
+ {
344
+ ref: g,
345
+ onEnd: A,
346
+ canvasProps: {
347
+ className: i ?? n(
348
+ "w-full h-[256px]",
349
+ "bg-size-[32px_32px] bg-surface",
350
+ "bg-[linear-gradient(to_right,#80808022_1px,transparent_1px),linear-gradient(to_bottom,#80808022_1px,transparent_1px)]",
351
+ "inset-shadow-sm",
352
+ "border-border border-2 rounded-base",
353
+ "cursor-crosshair"
354
+ )
355
+ }
356
+ }
357
+ ) : /* @__PURE__ */ a(
358
+ "canvas",
359
+ {
360
+ ref: f,
361
+ className: n(
362
+ "w-full h-64",
363
+ "bg-size-[32px_32px] bg-surface",
364
+ "bg-[linear-gradient(to_right,#80808022_1px,transparent_1px),linear-gradient(to_bottom,#80808022_1px,transparent_1px)]",
365
+ "inset-shadow-sm",
366
+ "border-border border-2 rounded-base"
367
+ )
368
+ }
369
+ )
370
+ ] }) }),
371
+ /* @__PURE__ */ a(
372
+ Z,
373
+ {
374
+ disabled: t !== "type",
375
+ className: n(
376
+ t === "type" ? "animate-in zoom-in-0 spin-in-20 scale-100" : "animate-out zoom-out-0 spin-out-20 scale-0",
377
+ "py-2 text-lg font-medium transition-[scale,translate,box-shadow] duration-300 origin-bottom-left"
378
+ ),
379
+ placeholder: "Enter Full Name",
380
+ value: o,
381
+ onChange: P
382
+ }
383
+ )
384
+ ]
385
+ }
386
+ ) });
387
+ }
388
+ const ct = {
389
+ components: {
390
+ [C.SIGNATURE]: at
391
+ },
392
+ controlledInputs: {
393
+ [C.SIGNATURE]: {
394
+ valueProp: "value",
395
+ changeProp: "onChange",
396
+ extractor: (r) => r
397
+ }
398
+ }
399
+ };
400
+ export {
401
+ at as Signature,
402
+ ct as signaturePreset
403
+ };
404
+ //# sourceMappingURL=signature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature.js","sources":["../../src/components/ui/tabs.tsx","../../src/components/ui/signature-pad.tsx","../../src/renderer/presets/signature.ts"],"sourcesContent":["\"use client\";\n\nimport { Tabs as TabsPrimitive } from \"@base-ui/react/tabs\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils\";\nimport { useHaptics, HAPTIC_TAB } from \"@/lib/haptics\";\n\nfunction Tabs({\n className,\n orientation = \"horizontal\",\n ...props\n}: TabsPrimitive.Root.Props) {\n return (\n <TabsPrimitive.Root\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(\n \"gap-2 group/tabs flex\",\n \"data-[orientation=horizontal]:flex-col\",\n \"data-[orientation=vertical]:w-full\",\n className,\n )}\n {...props}\n />\n );\n}\n\nconst tabsListVariants = cva(\n \"overflow-auto inline-flex bg-transparent w-fit items-start justify-start group-data-horizontal/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col\",\n {\n variants: {\n variant: {\n default:\n \"gap-1.5 border-2 rounded-base p-[calc(var(--trigger-translate)+6px)]\",\n ghost:\n \"gap-1 border-none rounded-none p-[calc(var(--trigger-translate)+6px)]\",\n icon: \"gap-1.5 border-2 rounded-base p-[calc(var(--trigger-translate)+6px)]\",\n contained:\n \"gap-0 border-0 rounded-md p-[calc(var(--trigger-translate)+2px)]\",\n },\n size: {\n sm: \"\",\n md: \"\",\n lg: \"\",\n xl: \"\",\n },\n extrude: {\n default:\n \"[--trigger-shadow:var(--shadow-none)] [--trigger-translate:0px] [--focus-trigger-translate:0px]\",\n xs: \"[--trigger-shadow:var(--shadow-min)] [--trigger-translate:1px] [--focus-trigger-shadow:var(--shadow-none)] [--focus-trigger-translate:0px]\",\n sm: \"[--trigger-shadow:var(--shadow-xs)] [--trigger-translate:2px] [--focus-trigger-shadow:var(--shadow-min)] [--focus-trigger-translate:1px]\",\n md: \"[--trigger-shadow:var(--shadow-sm)] [--trigger-translate:3px] [--focus-trigger-shadow:var(--shadow-xs)] [--focus-trigger-translate:2px]\",\n lg: \"[--trigger-shadow:var(--shadow-md)] [--trigger-translate:4px] [--focus-trigger-shadow:var(--shadow-xs)] [--focus-trigger-translate:2px]\",\n xl: \"[--trigger-shadow:var(--shadow-lg)] [--trigger-translate:5px] [--focus-trigger-shadow:var(--shadow-xs)] [--focus-trigger-translate:2px]\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"md\",\n extrude: \"default\",\n },\n },\n);\n\nfunction TabsList({\n className,\n variant = \"default\",\n size = \"md\",\n extrude = \"default\",\n ...props\n}: TabsPrimitive.List.Props & VariantProps<typeof tabsListVariants>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n data-variant={variant}\n data-size={size}\n className={cn(\n tabsListVariants({ variant, size, extrude }),\n \"group/tabs-list\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction TabsTrigger({\n label,\n description,\n children,\n className,\n onClick,\n ...props\n}: TabsPrimitive.Tab.Props & {\n label?: React.ReactNode;\n description?: React.ReactNode;\n}) {\n const { trigger } = useHaptics();\n return (\n <TabsPrimitive.Tab\n data-slot=\"tabs-trigger\"\n aria-label={props.value ?? \"tabs-trigger\"}\n className={cn(\n \"group/tabs-trigger neo-base relative inline-flex flex-1 items-center justify-center overflow-hidden cursor-pointer rounded-base border-2 py-1\",\n \"bg-surface data-active:bg-main\",\n \"font-medium h-[calc(100%-1px)] whitespace-nowrap [&_svg]:shrink-0\",\n \"transition-[translate,box-shadow,border,color] duration-200\",\n \"aria-disabled:pointer-events-none aria-disabled:opacity-50 aria-disabled:shadow-none aria-disabled:translate-0\",\n \"group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start\",\n\n \"active:shadow-none active:translate-0\",\n \"data-active:shadow-(--trigger-shadow) data-active:-translate-(--trigger-translate)\",\n \"hover:shadow-(--trigger-shadow) hover:-translate-(--trigger-translate)\",\n \"focus-visible:shadow-(--focus-trigger-shadow) focus-visible:-translate-(--focus-trigger-translate)\",\n \"focus-visible:hover:-translate-(--focus-trigger-translate) focus-visible:**:font-semibold\",\n\n \"group-data-[size=xl]/tabs-list:min-h-12\",\n\n \"group-data-[size=sm]/tabs-list:[&_svg:not([class*='size-'])]:size-4\",\n \"group-data-[size=md]/tabs-list:[&_svg:not([class*='size-'])]:size-5\",\n \"group-data-[size=lg]/tabs-list:[&_svg:not([class*='size-'])]:size-6\",\n \"group-data-[size=xl]/tabs-list:[&_svg:not([class*='size-'])]:size-7\",\n\n \"group-data-[variant=default]/tabs-list:group-data-[size=sm]/tabs-list:px-3\",\n \"group-data-[variant=default]/tabs-list:group-data-[size=md]/tabs-list:px-4\",\n \"group-data-[variant=default]/tabs-list:group-data-[size=lg]/tabs-list:px-5\",\n \"group-data-[variant=default]/tabs-list:group-data-[size=xl]/tabs-list:px-6\",\n\n \"group-data-[variant=ghost]/tabs-list:group-data-[size=sm]/tabs-list:px-3\",\n \"group-data-[variant=ghost]/tabs-list:group-data-[size=md]/tabs-list:px-4\",\n \"group-data-[variant=ghost]/tabs-list:group-data-[size=lg]/tabs-list:px-5\",\n \"group-data-[variant=ghost]/tabs-list:group-data-[size=xl]/tabs-list:px-6\",\n \"group-data-[variant=ghost]/tabs-list:border-none\",\n \"group-data-[variant=ghost]/tabs-list:data-active:bg-transparent group-data-[variant=ghost]/tabs-list:shadow-none\",\n\n \"group-data-[variant=icon]/tabs-list:group-data-[size=sm]/tabs-list:px-1.5\",\n \"group-data-[variant=icon]/tabs-list:group-data-[size=md]/tabs-list:px-2\",\n \"group-data-[variant=icon]/tabs-list:group-data-[size=lg]/tabs-list:px-2.5\",\n \"group-data-[variant=icon]/tabs-list:group-data-[size=xl]/tabs-list:px-3\",\n \"group-data-[variant=icon]/tabs-list:m-auto group-data-[variant=icon]/tabs-list:max-w-fit group-data-[variant=icon]/tabs-list:aspect-square group-data-[variant=icon]/tabs-list:items-center group-data-[variant=icon]/tabs-list:justify-center group-data-[variant=icon]/tabs-list:hover:border-foreground group-data-[variant=icon]/tabs-list:border-transparent group-data-[variant=icon]/tabs-list:data-active:border-border\",\n\n \"group-data-[variant=contained]/tabs-list:group-data-[size=sm]/tabs-list:px-3\",\n \"group-data-[variant=contained]/tabs-list:group-data-[size=md]/tabs-list:px-4\",\n \"group-data-[variant=contained]/tabs-list:group-data-[size=lg]/tabs-list:px-5\",\n \"group-data-[variant=contained]/tabs-list:group-data-[size=xl]/tabs-list:px-6\",\n \"group-data-[orientation=horizontal]/tabs:group-data-[variant=contained]/tabs-list:not-last:rounded-r-none group-data-[orientation=horizontal]/tabs:group-data-[variant=contained]/tabs-list:not-first:rounded-l-none group-data-[orientation=vertical]/tabs:group-data-[variant=contained]/tabs-list:not-last:rounded-b-none group-data-[orientation=vertical]/tabs:group-data-[variant=contained]/tabs-list:not-first:rounded-t-none group-data-[variant=contained]/tabs-list:-m-px\",\n\n children ? \"gap-1.5\" : \"flex-col gap-0.5\",\n className,\n )}\n onClick={(event) => {\n trigger(HAPTIC_TAB);\n onClick?.(event);\n }}\n {...props}\n >\n {label && (\n <span\n data-slot=\"tabs-trigger-label\"\n className={cn(\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 font-medium font-heading\",\n \"group-data-[size=sm]/tabs-list:text-sm\",\n \"group-data-[size=md]/tabs-list:text-base\",\n \"group-data-[size=lg]/tabs-list:text-lg\",\n \"group-data-[size=xl]/tabs-list:text-2xl\",\n )}\n >\n {label}\n </span>\n )}\n {description && (\n <span\n data-slot=\"tabs-trigger-description\"\n className={cn(\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 whitespace-normal\",\n \"group-data-[size=sm]/tabs-list:text-xs\",\n \"group-data-[size=md]/tabs-list:text-sm\",\n \"group-data-[size=lg]/tabs-list:text-base\",\n \"group-data-[size=xl]/tabs-list:text-lg\",\n )}\n >\n {description}\n </span>\n )}\n {children}\n <div\n data-slot=\"tabs-trigger-indicator\"\n className={cn(\n \"pointer-events-none h-[3px] rounded-full bg-foreground absolute hidden bottom-0 left-1 right-1\",\n \"group-data-[variant=ghost]/tabs-list:group-data-active/tabs-trigger:block\",\n )}\n />\n </TabsPrimitive.Tab>\n );\n}\n\nfunction TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) {\n return (\n <TabsPrimitive.Panel\n data-slot=\"tabs-content\"\n className={cn(\n \"text-sm flex-1 neo-base border-l-2 border-l-transparent focus-visible:border-l-border -ml-0.5 pl-0.5\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants };\n","\"use client\";\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { Button } from \"./button\";\nimport { Tabs, TabsList, TabsTrigger } from \"./tabs\";\nimport SignatureCanvas from \"react-signature-canvas\";\nimport type { ChangeEvent } from \"react\";\nimport { IconEraser, IconWriting, IconTextSize } from \"@tabler/icons-react\";\nimport { InputGroup, InputGroupAddon, InputGroupInput } from \"./input-group\";\nimport { cn } from \"@/lib/utils\";\nimport { useBonsaiRenderMode } from \"../core/bonsai\";\n\nexport type SignatureProps = {\n value?: string | null;\n onChange?: (value: string | null) => void;\n canvasClassname?: string;\n imageType?: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n};\n\nconst FONT_FAMILY = '\"Great Vibes\", cursive';\nconst FONT_SIZE_MAX = 64;\nconst FONT_SIZE_MIN = 24;\nconst TEXT_PADDING_X = 20;\n\nfunction renderTypedSignature({\n canvas,\n text,\n width,\n height,\n ratio,\n}: {\n canvas: HTMLCanvasElement;\n text: string;\n width: number;\n height: number;\n ratio: number;\n}) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return false;\n\n const displayWidth = Math.max(1, Math.floor(width));\n const displayHeight = Math.max(1, Math.floor(height));\n const pixelRatio = Math.max(ratio || 1, 1);\n\n canvas.width = Math.max(1, Math.floor(displayWidth * pixelRatio));\n canvas.height = Math.max(1, Math.floor(displayHeight * pixelRatio));\n ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n ctx.clearRect(0, 0, displayWidth, displayHeight);\n\n const value = text.trim();\n if (!value) return false;\n\n const maxTextWidth = Math.max(1, displayWidth - TEXT_PADDING_X * 2);\n\n ctx.fillStyle = \"#000\";\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n\n let fontSize = FONT_SIZE_MAX;\n while (fontSize > FONT_SIZE_MIN) {\n ctx.font = `${fontSize}px ${FONT_FAMILY}`;\n if (ctx.measureText(value).width <= maxTextWidth) break;\n fontSize -= 1;\n }\n\n ctx.font = `${fontSize}px ${FONT_FAMILY}`;\n ctx.fillText(value, displayWidth / 2, displayHeight / 2, maxTextWidth);\n\n return true;\n}\n\nexport function Signature({\n value,\n onChange,\n canvasClassname,\n imageType = \"image/png\",\n}: SignatureProps) {\n const renderMode = useBonsaiRenderMode();\n const [mode, setMode] = useState<\"sign\" | \"type\">(\"sign\");\n const [text, setText] = useState(\"\");\n\n const signature = useRef<SignatureCanvas | null>(null);\n const textCanvas = useRef<HTMLCanvasElement | null>(null);\n const onChangeRef = useRef(onChange);\n const lastEmittedValue = useRef<string | null>(value ?? null);\n const initialized = useRef(false);\n const textCanvasSizeRef = useRef({ width: 0, height: 0 });\n\n const emitChange = useCallback((nextValue: string | null) => {\n if (lastEmittedValue.current === nextValue) return;\n lastEmittedValue.current = nextValue;\n onChangeRef.current?.(nextValue);\n }, []);\n\n useEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n useEffect(() => {\n lastEmittedValue.current = value ?? null;\n }, [value]);\n\n useEffect(() => {\n if (initialized.current) return;\n initialized.current = true;\n\n if (!value || mode !== \"sign\") return;\n const instance = signature.current;\n if (!instance) return;\n\n try {\n instance.fromDataURL(value);\n } catch {\n instance.clear();\n }\n }, []);\n\n useEffect(() => {\n if (mode !== \"type\") return;\n\n const canvas = textCanvas.current;\n if (!canvas) return;\n\n if (textCanvasSizeRef.current.width === 0) {\n const rect = canvas.getBoundingClientRect();\n textCanvasSizeRef.current = {\n width: Math.max(1, Math.floor(rect.width)),\n height: Math.max(1, Math.floor(rect.height)),\n };\n }\n\n const size = textCanvasSizeRef.current;\n if (!size.width || !size.height) return;\n\n const ratio = window.devicePixelRatio || 1;\n const hasText = renderTypedSignature({\n canvas,\n text,\n width: size.width,\n height: size.height,\n ratio,\n });\n\n if (!hasText) {\n emitChange(null);\n return;\n }\n\n const exportCanvas = document.createElement(\"canvas\");\n renderTypedSignature({\n canvas: exportCanvas,\n text,\n width: size.width,\n height: size.height,\n ratio,\n });\n\n emitChange(exportCanvas.toDataURL(imageType));\n }, [mode, text, imageType, emitChange]);\n\n const clearSignature = () => {\n signature.current?.clear();\n setText(\"\");\n emitChange(null);\n };\n\n const handleDrawEnd = () => {\n if (mode !== \"sign\") return;\n const data = signature.current?.toDataURL(imageType) ?? null;\n emitChange(data);\n };\n\n const handleModeChange = (next: \"sign\" | \"type\") => {\n if (next === mode) return;\n clearSignature();\n setMode(next);\n };\n\n const handleTextChange = (event: ChangeEvent<HTMLInputElement>) => {\n setText(event.target.value);\n };\n\n // In a non-interactive document there is no client JS to draw a canvas, so\n // the captured value (a base64 data URI baked in at capture time) is shown as\n // a plain image, and an unsigned pad as an empty signature line — never the\n // interactive control, which would render as a blank grid with a toolbar.\n if (renderMode === \"pdf\") {\n return (\n <div id=\"signature\" className=\"w-full\">\n {value ? (\n <img\n src={value}\n alt=\"Signature\"\n className={cn(\n \"w-full h-[256px] object-contain\",\n \"bg-size-[32px_32px] bg-surface\",\n \"bg-[linear-gradient(to_right,#80808022_1px,transparent_1px),linear-gradient(to_bottom,#80808022_1px,transparent_1px)]\",\n \"border-border border-2 rounded-base\",\n canvasClassname,\n )}\n />\n ) : (\n <div\n aria-label=\"Unsigned\"\n className={cn(\n \"w-full h-[256px] flex items-end\",\n \"bg-size-[32px_32px] bg-surface\",\n \"bg-[linear-gradient(to_right,#80808022_1px,transparent_1px),linear-gradient(to_bottom,#80808022_1px,transparent_1px)]\",\n \"border-border border-2 rounded-base\",\n canvasClassname,\n )}\n >\n <div className=\"w-full border-t-2 border-dashed border-border mx-6 mb-8 pb-1 text-center text-sm text-muted-foreground\">\n Signature\n </div>\n </div>\n )}\n </div>\n );\n }\n\n return (\n <div id=\"signature\">\n <InputGroup\n className={cn(\n mode === \"type\" ? \"max-h-84\" : \"max-h-69\",\n \"overflow-hidden transition-[max-height] duration-300 has-[>[data-align=block-start]]:p-2 gap-2\",\n )}\n >\n <InputGroupAddon align=\"block-start\" className=\"p-0!\">\n <div className=\"relative w-full rounded-base\">\n <div className=\"absolute top-4 left-4 right-3 bg-transparent flex flex-row items-start justify-between gap-3\">\n <Tabs\n value={mode}\n onValueChange={(next) =>\n handleModeChange(next as \"sign\" | \"type\")\n }\n className=\"-mt-1\"\n >\n <TabsList variant=\"contained\" extrude=\"sm\" size=\"md\">\n <TabsTrigger value=\"sign\">\n <IconWriting />\n <span className=\"hidden sm:flex\">Draw</span>\n </TabsTrigger>\n <TabsTrigger value=\"type\">\n <IconTextSize />\n <span className=\"hidden sm:flex\">Type</span>\n </TabsTrigger>\n </TabsList>\n </Tabs>\n <Button\n size=\"sm\"\n raised=\"xs\"\n variant=\"outline\"\n onClick={clearSignature}\n >\n <IconEraser />\n <span className=\"hidden sm:flex\">Clear</span>\n </Button>\n </div>\n {mode === \"sign\" ? (\n <SignatureCanvas\n ref={signature}\n onEnd={handleDrawEnd}\n canvasProps={{\n className:\n canvasClassname ??\n cn(\n \"w-full h-[256px]\",\n \"bg-size-[32px_32px] bg-surface\",\n \"bg-[linear-gradient(to_right,#80808022_1px,transparent_1px),linear-gradient(to_bottom,#80808022_1px,transparent_1px)]\",\n \"inset-shadow-sm\",\n \"border-border border-2 rounded-base\",\n \"cursor-crosshair\",\n ),\n }}\n />\n ) : (\n <canvas\n ref={textCanvas}\n className={cn(\n \"w-full h-64\",\n \"bg-size-[32px_32px] bg-surface\",\n \"bg-[linear-gradient(to_right,#80808022_1px,transparent_1px),linear-gradient(to_bottom,#80808022_1px,transparent_1px)]\",\n \"inset-shadow-sm\",\n \"border-border border-2 rounded-base\",\n )}\n />\n )}\n </div>\n </InputGroupAddon>\n <InputGroupInput\n disabled={mode !== \"type\"}\n className={cn(\n mode === \"type\"\n ? \"animate-in zoom-in-0 spin-in-20 scale-100\"\n : \"animate-out zoom-out-0 spin-out-20 scale-0\",\n \"py-2 text-lg font-medium transition-[scale,translate,box-shadow] duration-300 origin-bottom-left\",\n )}\n placeholder=\"Enter Full Name\"\n value={text}\n onChange={handleTextChange}\n />\n </InputGroup>\n </div>\n );\n}\n","import { COMPONENT } from \"@bonsai/constants\";\n\nimport { Signature } from \"../../components/ui/signature-pad\";\nimport type { BonsaiPreset } from \"../core-registry\";\n\n/** Opt-in `signature` component. Pulls in react-signature-canvas. */\nexport const signaturePreset: BonsaiPreset = {\n components: {\n [COMPONENT.SIGNATURE]: Signature,\n },\n controlledInputs: {\n [COMPONENT.SIGNATURE]: {\n valueProp: \"value\",\n changeProp: \"onChange\",\n extractor: (val: string | null) => val,\n },\n },\n};\n\nexport { Signature };\nexport type { SignatureProps } from \"../../components/ui/signature-pad\";\n"],"names":["Tabs","className","orientation","props","jsx","TabsPrimitive","cn","tabsListVariants","cva","TabsList","variant","size","extrude","TabsTrigger","label","description","children","onClick","trigger","useHaptics","jsxs","event","HAPTIC_TAB","FONT_FAMILY","FONT_SIZE_MAX","FONT_SIZE_MIN","TEXT_PADDING_X","renderTypedSignature","canvas","text","width","height","ratio","ctx","displayWidth","displayHeight","pixelRatio","value","maxTextWidth","fontSize","Signature","onChange","canvasClassname","imageType","renderMode","useBonsaiRenderMode","mode","setMode","useState","setText","signature","useRef","textCanvas","onChangeRef","lastEmittedValue","initialized","textCanvasSizeRef","emitChange","useCallback","nextValue","useEffect","instance","rect","exportCanvas","clearSignature","handleDrawEnd","data","handleModeChange","next","handleTextChange","InputGroup","InputGroupAddon","IconWriting","IconTextSize","Button","IconEraser","SignatureCanvas","InputGroupInput","signaturePreset","COMPONENT","val"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { ElementType } from 'react';
2
+ import { BonsaiRegistry } from '../lib/registry/types.js';
3
+ /**
4
+ * Describes how the renderer two-way-binds a component to the store: which prop
5
+ * carries the value, which prop reports a change, and how to pull the new value
6
+ * out of whatever that prop is called with.
7
+ */
8
+ export interface ControlledInput {
9
+ valueProp: string;
10
+ changeProp: string;
11
+ extractor: (eventOrValue: any) => any;
12
+ }
13
+ /**
14
+ * A controlled-input entry is either a single binding or, for components whose
15
+ * binding depends on `args.type` (e.g. `input`), a map of subtype -> binding
16
+ * with a `default` fallback.
17
+ */
18
+ export type ControlledInputEntry = ControlledInput | Record<string, ControlledInput>;
19
+ export type ComponentRegistry = Record<string, ElementType>;
20
+ export type ControlledInputRegistry = Record<string, ControlledInputEntry>;
21
+ /**
22
+ * A bundle of components plus their controlled-input bindings. Both the
23
+ * built-in heavy presets (`renderer/presets/*`) and consumer-supplied
24
+ * extensions to `createBonsaiRenderer` use this shape; `extendRegistry`
25
+ * layers it onto the `BonsaiRegistry` the renderer consumes.
26
+ */
27
+ export interface BonsaiPreset {
28
+ components?: ComponentRegistry;
29
+ controlledInputs?: ControlledInputRegistry;
30
+ }
31
+ /**
32
+ * Layers a preset over `base`, type by type: a supplied component replaces the
33
+ * base's component but keeps its binding, and a supplied binding re-binds the
34
+ * base's component — the same "caller wins per key" semantics as spreading the
35
+ * two maps separately.
36
+ */
37
+ export declare function extendRegistry(base: BonsaiRegistry, { components, controlledInputs }: BonsaiPreset): BonsaiRegistry;
38
+ /**
39
+ * Every built-in component that carries no heavy third-party dependency.
40
+ * Deliberately excludes `map`, `calendar` and `signature` — those live in
41
+ * `renderer/presets/*` so a core consumer never bundles MapLibre,
42
+ * react-day-picker or react-signature-canvas.
43
+ */
44
+ export declare const coreComponents: ComponentRegistry;
45
+ /** Controlled-input bindings for the components in `coreComponents`. */
46
+ export declare const coreControlledInputs: ControlledInputRegistry;
47
+ /**
48
+ * The registry used when no renderer-scoped registry is provided. Same library
49
+ * identity as `pebbleRegistry` (it is a subset of it), but without per-component
50
+ * `propsSchema`s so the core entry never bundles `@bonsai/schemas`.
51
+ */
52
+ export declare const coreRegistry: BonsaiRegistry;
@@ -0,0 +1,38 @@
1
+ import { BonsaiProps } from '../components/core/bonsai.js';
2
+ import { ComponentRegistry, ControlledInputRegistry } from './core-registry.js';
3
+ import { BonsaiRegistry } from '../lib/registry/types.js';
4
+ export interface BonsaiRendererOptions {
5
+ /** Base registry. Defaults to the lightweight core registry. */
6
+ registry?: BonsaiRegistry;
7
+ /** Extra components layered over `registry` (they win on key collision). */
8
+ components?: Partial<ComponentRegistry>;
9
+ controlledInputs?: Partial<ControlledInputRegistry>;
10
+ }
11
+ export interface BonsaiRendererInstance {
12
+ Bonsai: React.ComponentType<BonsaiProps>;
13
+ }
14
+ /**
15
+ * Builds a renderer bound to its own component registry.
16
+ *
17
+ * The registry is `options.registry` (the lightweight core set by default)
18
+ * plus whatever components the caller supplies (caller entries win on key
19
+ * collision); a `registry` prop on an individual `<Bonsai>` still overrides it. It is captured in a React context at
20
+ * this call, so registries never leak between renderer instances and consumers
21
+ * never have to mutate the exported `componentMap`.
22
+ *
23
+ * Heavy built-ins are opt-in via the presets in `renderer/presets/*`:
24
+ *
25
+ * ```ts
26
+ * import { createBonsaiRenderer } from "@pebble-software/bonsai/core";
27
+ * import { calendarPreset } from "@pebble-software/bonsai/presets/calendar";
28
+ *
29
+ * const { Bonsai } = createBonsaiRenderer({
30
+ * components: { ...calendarPreset.components, rating: Rating },
31
+ * controlledInputs: { ...calendarPreset.controlledInputs },
32
+ * });
33
+ * ```
34
+ *
35
+ * Call this at module scope: each call returns a fresh component type, so
36
+ * calling it during render would remount the whole tree every time.
37
+ */
38
+ export declare function createBonsaiRenderer(options?: BonsaiRendererOptions): BonsaiRendererInstance;
@@ -0,0 +1,5 @@
1
+ import { Calendar } from '../../components/ui/calendar.js';
2
+ import { BonsaiPreset } from '../core-registry.js';
3
+ /** Opt-in `calendar` component. Pulls in react-day-picker. */
4
+ export declare const calendarPreset: BonsaiPreset;
5
+ export { Calendar };
@@ -0,0 +1,6 @@
1
+ import { Signature } from '../../components/ui/signature-pad.js';
2
+ import { BonsaiPreset } from '../core-registry.js';
3
+ /** Opt-in `signature` component. Pulls in react-signature-canvas. */
4
+ export declare const signaturePreset: BonsaiPreset;
5
+ export { Signature };
6
+ export type { SignatureProps } from '../../components/ui/signature-pad.js';
@@ -0,0 +1 @@
1
+ export type Config = any;