tembro 3.1.5 → 3.1.7

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 (120) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/README.md +241 -91
  3. package/dist/components/ui/dialog/index.d.ts +3 -1
  4. package/dist/components/ui/select/index.d.ts +6 -3
  5. package/dist/showcase/package-meta.d.ts +3 -3
  6. package/dist/showcase/premium/wizard/index.cjs +1 -0
  7. package/dist/showcase/premium/wizard/index.d.ts +2 -0
  8. package/dist/showcase/premium/wizard/index.js +1 -0
  9. package/dist/showcase/premium/wizard/mock.cjs +1 -0
  10. package/dist/showcase/premium/wizard/mock.d.ts +2 -0
  11. package/dist/showcase/premium/wizard/mock.js +1 -0
  12. package/dist/showcase/premium/wizard/showcase.cjs +1 -0
  13. package/dist/showcase/premium/wizard/showcase.d.ts +2 -0
  14. package/dist/showcase/premium/wizard/showcase.js +1 -0
  15. package/dist/showcase/search-utils.d.ts +1 -1
  16. package/dist/showcase/site-data.d.ts +6 -6
  17. package/dist/src/components/layout/app-sidebar.cjs +1 -1
  18. package/dist/src/components/layout/app-sidebar.js +49 -36
  19. package/dist/src/components/theme-provider.cjs +1 -1
  20. package/dist/src/components/theme-provider.js +1 -1
  21. package/dist/src/components/ui/dialog/index.cjs +1 -1
  22. package/dist/src/components/ui/dialog/index.js +14 -7
  23. package/dist/src/components/ui/select/index.cjs +1 -1
  24. package/dist/src/components/ui/select/index.js +44 -43
  25. package/dist/src/index.cjs +1 -1
  26. package/dist/src/index.js +101 -101
  27. package/dist/src/showcase/component-api-schema.cjs +1 -1
  28. package/dist/src/showcase/component-api-schema.js +868 -9
  29. package/dist/src/showcase/demo-snippets/forms/index.cjs +1 -1
  30. package/dist/src/showcase/demo-snippets/forms/index.js +1 -1
  31. package/dist/src/showcase/fallback.cjs +4 -4
  32. package/dist/src/showcase/fallback.js +354 -181
  33. package/dist/src/showcase/index.cjs +1 -1
  34. package/dist/src/showcase/index.js +2 -2
  35. package/dist/src/showcase/package-meta.cjs +1 -1
  36. package/dist/src/showcase/package-meta.js +1 -1
  37. package/dist/src/showcase/premium/app-sidebar/mock.cjs +3 -2
  38. package/dist/src/showcase/premium/app-sidebar/mock.js +1 -1
  39. package/dist/src/showcase/premium/app-sidebar/showcase.cjs +1 -1
  40. package/dist/src/showcase/premium/app-sidebar/showcase.js +1 -1
  41. package/dist/src/showcase/premium/async-select/showcase.cjs +1 -1
  42. package/dist/src/showcase/premium/async-select/showcase.js +118 -74
  43. package/dist/src/showcase/premium/avatar/showcase.cjs +1 -1
  44. package/dist/src/showcase/premium/avatar/showcase.js +5 -5
  45. package/dist/src/showcase/premium/dialog/mock.cjs +6 -1
  46. package/dist/src/showcase/premium/dialog/mock.js +1 -1
  47. package/dist/src/showcase/premium/dialog/showcase.cjs +1 -1
  48. package/dist/src/showcase/premium/dialog/showcase.js +101 -39
  49. package/dist/src/showcase/premium/form-wrapper/mock.cjs +2 -2
  50. package/dist/src/showcase/premium/form-wrapper/mock.js +2 -2
  51. package/dist/src/showcase/premium/form-wrapper/showcase.cjs +1 -1
  52. package/dist/src/showcase/premium/form-wrapper/showcase.js +1 -1
  53. package/dist/src/showcase/premium/index.cjs +1 -1
  54. package/dist/src/showcase/premium/index.js +9 -3
  55. package/dist/src/showcase/premium/input/showcase.cjs +1 -1
  56. package/dist/src/showcase/premium/input/showcase.js +1 -1
  57. package/dist/src/showcase/premium/json-input/showcase.cjs +1 -1
  58. package/dist/src/showcase/premium/json-input/showcase.js +1 -1
  59. package/dist/src/showcase/premium/select/showcase.cjs +1 -1
  60. package/dist/src/showcase/premium/select/showcase.js +53 -0
  61. package/dist/src/showcase/premium/table/mock.cjs +1 -1
  62. package/dist/src/showcase/premium/table/mock.js +1 -1
  63. package/dist/src/showcase/premium/types.cjs +1 -1
  64. package/dist/src/showcase/premium/types.js +1 -1
  65. package/dist/src/showcase/premium/wizard/index.cjs +1 -0
  66. package/dist/src/showcase/premium/wizard/index.js +3 -0
  67. package/dist/src/showcase/premium/wizard/mock.cjs +25 -0
  68. package/dist/src/showcase/premium/wizard/mock.js +32 -0
  69. package/dist/src/showcase/premium/wizard/showcase.cjs +1 -0
  70. package/dist/src/showcase/premium/wizard/showcase.js +130 -0
  71. package/dist/src/showcase/preview-registry.cjs +1 -1
  72. package/dist/src/showcase/preview-registry.js +6 -6
  73. package/dist/src/showcase/registry-quality.cjs +1 -1
  74. package/dist/src/showcase/registry-quality.js +5 -0
  75. package/dist/src/showcase/registry-specific.cjs +1 -1
  76. package/dist/src/showcase/registry-specific.js +2 -2
  77. package/dist/src/showcase/render-registry-preview.cjs +1 -1
  78. package/dist/src/showcase/render-registry-preview.js +2 -2
  79. package/dist/src/showcase/site-data.cjs +1 -1
  80. package/dist/src/showcase/site-data.js +198 -44
  81. package/dist/src/showcase/tembro-registry.json.cjs +1 -1
  82. package/dist/src/showcase/tembro-registry.json.js +1 -1
  83. package/dist/src/showcase/types.cjs +1 -1
  84. package/dist/src/showcase/types.js +1 -1
  85. package/package.json +13 -9
  86. package/packages/cli/dist/index.cjs +127 -127
  87. package/packages/cli/vendor/src/components/layout/app-sidebar.tsx +31 -6
  88. package/packages/cli/vendor/src/components/theme-provider.tsx +1 -1
  89. package/packages/cli/vendor/src/components/ui/dialog/index.tsx +15 -3
  90. package/packages/cli/vendor/src/components/ui/select/index.tsx +17 -10
  91. package/packages/cli/vendor/src/showcase/component-api-schema.ts +269 -39
  92. package/packages/cli/vendor/src/showcase/demo-snippets/forms/index.ts +1 -1
  93. package/packages/cli/vendor/src/showcase/fallback.tsx +202 -39
  94. package/packages/cli/vendor/src/showcase/index.ts +6 -6
  95. package/packages/cli/vendor/src/showcase/package-meta.ts +3 -3
  96. package/packages/cli/vendor/src/showcase/premium/app-sidebar/mock.ts +3 -2
  97. package/packages/cli/vendor/src/showcase/premium/app-sidebar/showcase.tsx +1 -1
  98. package/packages/cli/vendor/src/showcase/premium/async-select/showcase.tsx +50 -4
  99. package/packages/cli/vendor/src/showcase/premium/avatar/showcase.tsx +5 -5
  100. package/packages/cli/vendor/src/showcase/premium/dialog/mock.ts +6 -1
  101. package/packages/cli/vendor/src/showcase/premium/dialog/showcase.tsx +53 -1
  102. package/packages/cli/vendor/src/showcase/premium/form-wrapper/mock.ts +2 -2
  103. package/packages/cli/vendor/src/showcase/premium/form-wrapper/showcase.tsx +1 -1
  104. package/packages/cli/vendor/src/showcase/premium/index.ts +5 -3
  105. package/packages/cli/vendor/src/showcase/premium/input/showcase.tsx +1 -1
  106. package/packages/cli/vendor/src/showcase/premium/json-input/showcase.tsx +1 -1
  107. package/packages/cli/vendor/src/showcase/premium/select/showcase.tsx +38 -0
  108. package/packages/cli/vendor/src/showcase/premium/table/mock.ts +1 -1
  109. package/packages/cli/vendor/src/showcase/premium/types.ts +1 -1
  110. package/packages/cli/vendor/src/showcase/premium/wizard/index.ts +2 -0
  111. package/packages/cli/vendor/src/showcase/premium/wizard/mock.ts +41 -0
  112. package/packages/cli/vendor/src/showcase/premium/wizard/showcase.tsx +88 -0
  113. package/packages/cli/vendor/src/showcase/preview-registry.tsx +6 -6
  114. package/packages/cli/vendor/src/showcase/registry-quality.ts +5 -0
  115. package/packages/cli/vendor/src/showcase/registry-specific.tsx +2 -2
  116. package/packages/cli/vendor/src/showcase/render-registry-preview.tsx +2 -2
  117. package/packages/cli/vendor/src/showcase/site-data.tsx +89 -32
  118. package/packages/cli/vendor/src/showcase/tembro-registry.json +1 -1
  119. package/packages/cli/vendor/src/showcase/types.ts +1 -1
  120. package/registry.json +1 -1
@@ -95,6 +95,31 @@ function getSidebarInteractiveClassName({
95
95
  disabled && "hover:border-transparent hover:bg-transparent hover:text-[color:color-mix(in_oklch,var(--sidebar-foreground),transparent_6%)]"
96
96
  )
97
97
  }
98
+
99
+ function getSidebarItemLayoutClassName({
100
+ collapsed,
101
+ depth,
102
+ itemSize,
103
+ activeIndicator,
104
+ }: {
105
+ collapsed: boolean
106
+ depth: number
107
+ itemSize: NonNullable<AppSidebarProps["itemSize"]>
108
+ activeIndicator: NonNullable<AppSidebarProps["activeIndicator"]>
109
+ }) {
110
+ return cn(
111
+ "relative w-full rounded-[min(var(--radius-xl),14px)] py-2",
112
+ itemSize === "sm" && "min-h-8 text-xs",
113
+ itemSize === "md" && "min-h-9 text-sm",
114
+ itemSize === "lg" && "min-h-11 text-sm",
115
+ collapsed ? "justify-center px-2" : "px-2.5",
116
+ !collapsed && depth > 0 && "pl-3",
117
+ activeIndicator === "bar" &&
118
+ "data-[active=true]:pl-4 before:pointer-events-none before:absolute before:left-1.5 before:top-1/2 before:hidden before:h-5 before:w-1 before:-translate-y-1/2 before:rounded-full before:bg-[color:var(--sidebar-primary)] data-[active=true]:before:block",
119
+ activeIndicator === "pill" && "rounded-full",
120
+ activeIndicator === "none" && "data-[active=true]:shadow-none"
121
+ )
122
+ }
98
123
 
99
124
  function hasVisibleSidebarChildren(item: AppSidebarNavItem) {
100
125
  return item.items?.some((child) => !child.hidden) ?? false
@@ -138,11 +163,11 @@ function SidebarLeafItem({
138
163
  "data-size": itemSize,
139
164
  "data-active-indicator": activeIndicator,
140
165
  className: cn(
141
- "flex items-center gap-2 border border-transparent text-sm font-medium outline-none transition-[background-color,border-color,color,box-shadow] data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
166
+ "flex items-center gap-2 border border-transparent font-medium outline-none transition-[background-color,border-color,color,box-shadow] data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50",
142
167
  getSidebarInteractiveClassName({ active: item.active, disabled: item.disabled }),
143
- collapsed && "justify-center px-2"
168
+ getSidebarItemLayoutClassName({ collapsed, depth, itemSize, activeIndicator })
144
169
  ),
145
- }
170
+ }
146
171
 
147
172
  const content = (
148
173
  <>
@@ -312,11 +337,11 @@ function SidebarTree({
312
337
  data-active={active || undefined}
313
338
  data-active-indicator={activeIndicator}
314
339
  className={cn(
315
- "flex list-none items-center gap-2 border border-transparent text-sm font-medium outline-none transition-[background-color,border-color,color,box-shadow]",
340
+ "flex list-none items-center gap-2 border border-transparent font-medium outline-none transition-[background-color,border-color,color,box-shadow]",
316
341
  getSidebarInteractiveClassName({ active }),
317
- collapsed ? "justify-center px-2" : "px-2.5"
342
+ getSidebarItemLayoutClassName({ collapsed, depth, itemSize, activeIndicator })
318
343
  )}
319
- >
344
+ >
320
345
  {item.icon ? (
321
346
  collapsed ? (
322
347
  <Tooltip content={item.tooltip ?? item.label} side="right">
@@ -13,7 +13,7 @@ type ThemeContextValue = {
13
13
  toggleTheme: () => void
14
14
  }
15
15
 
16
- const THEME_STORAGE_KEY = "azamat-ui-theme"
16
+ const THEME_STORAGE_KEY = "tembro-theme"
17
17
 
18
18
  const ThemeContext = React.createContext<ThemeContextValue | null>(null)
19
19
 
@@ -16,6 +16,7 @@ export type DialogPopupProps = DialogPrimitive.Popup.Props & {
16
16
  surface?: "default" | "plain"
17
17
  }
18
18
  export type DialogHeaderProps = React.ComponentProps<"div">
19
+ export type DialogBodyProps = React.ComponentProps<"div">
19
20
  export type DialogFooterProps = React.ComponentProps<"div"> & {
20
21
  showCloseButton?: boolean
21
22
  }
@@ -72,7 +73,7 @@ function DialogContent({
72
73
  role="dialog"
73
74
  aria-modal="true"
74
75
  className={cn(
75
- "fixed top-1/2 left-1/2 z-50 grid max-h-[min(92vh,calc(100dvh-2rem))] w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-5 overflow-y-auto overscroll-contain duration-100 outline-none data-[surface=plain]:overflow-visible data-[size=xs]:sm:max-w-sm data-[size=sm]:sm:max-w-md data-[size=md]:sm:max-w-lg data-[size=lg]:sm:max-w-2xl data-[size=xl]:sm:max-w-4xl data-[size=full]:h-[min(92vh,56rem)] data-[size=full]:max-w-[min(96vw,84rem)] data-[size=full]:grid-rows-[auto_minmax(0,1fr)] data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
76
+ "fixed top-1/2 left-1/2 z-50 grid max-h-[min(92vh,calc(100dvh-2rem))] w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 grid-rows-[auto_minmax(0,1fr)_auto] gap-5 overflow-hidden overscroll-contain duration-100 outline-none data-[surface=plain]:overflow-visible data-[size=xs]:sm:max-w-sm data-[size=sm]:sm:max-w-md data-[size=md]:sm:max-w-lg data-[size=lg]:sm:max-w-2xl data-[size=xl]:sm:max-w-4xl data-[size=full]:h-[min(92vh,56rem)] data-[size=full]:max-w-[min(96vw,84rem)] data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
76
77
  className
77
78
  )}
78
79
  {...props}
@@ -102,7 +103,17 @@ function DialogHeader({ className, ...props }: DialogHeaderProps) {
102
103
  return (
103
104
  <div
104
105
  data-slot="dialog-header"
105
- className={cn("flex flex-col", className)}
106
+ className={cn("min-w-0 shrink-0 pr-10", className)}
107
+ {...props}
108
+ />
109
+ )
110
+ }
111
+
112
+ function DialogBody({ className, ...props }: DialogBodyProps) {
113
+ return (
114
+ <div
115
+ data-slot="dialog-body"
116
+ className={cn("min-h-0 overflow-y-auto overscroll-contain", className)}
106
117
  {...props}
107
118
  />
108
119
  )
@@ -118,7 +129,7 @@ function DialogFooter({
118
129
  <div
119
130
  data-slot="dialog-footer"
120
131
  className={cn(
121
- "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
132
+ "flex shrink-0 flex-wrap items-center justify-end gap-2 [&_[data-slot=button]]:inline-flex [&_[data-slot=button]]:flex-row [&_[data-slot=button]]:items-center [&_[data-slot=button]]:justify-center [&_[data-slot=button]]:gap-2",
122
133
  className
123
134
  )}
124
135
  {...props}
@@ -158,6 +169,7 @@ function DialogDescription({
158
169
 
159
170
  export {
160
171
  Dialog,
172
+ DialogBody,
161
173
  DialogClose,
162
174
  DialogContent,
163
175
  DialogDescription,
@@ -16,7 +16,9 @@ export type SelectContentProps = SelectPrimitive.Popup.Props &
16
16
  "align" | "alignOffset" | "side" | "sideOffset" | "alignItemWithTrigger"
17
17
  >
18
18
  export type SelectLabelProps = SelectPrimitive.GroupLabel.Props
19
- export type SelectItemProps = SelectPrimitive.Item.Props
19
+ export type SelectItemProps = SelectPrimitive.Item.Props & {
20
+ showIndicator?: boolean
21
+ }
20
22
  export type SelectSeparatorProps = SelectPrimitive.Separator.Props
21
23
  export type SelectScrollUpButtonProps = React.ComponentProps<typeof SelectPrimitive.ScrollUpArrow>
22
24
  export type SelectScrollDownButtonProps = React.ComponentProps<typeof SelectPrimitive.ScrollDownArrow>
@@ -57,6 +59,7 @@ export type SelectProps = Omit<SelectRootProps, "value" | "defaultValue" | "onVa
57
59
  itemClassName?: string
58
60
  searchClassName?: string
59
61
  renderOption?: (option: SelectOption, state: { selected: boolean }) => React.ReactNode
62
+ showSelectedIndicator?: boolean
60
63
  invalid?: boolean
61
64
  onSearchChange?: (value: string) => void
62
65
  }
@@ -98,6 +101,7 @@ function Select({
98
101
  itemClassName,
99
102
  searchClassName,
100
103
  renderOption,
104
+ showSelectedIndicator = true,
101
105
  invalid,
102
106
  children,
103
107
  onOpenChange,
@@ -239,6 +243,7 @@ function Select({
239
243
  key={option.value}
240
244
  value={option.value}
241
245
  disabled={option.disabled}
246
+ showIndicator={showSelectedIndicator}
242
247
  className={cn("rounded-[var(--radius-md)]", itemClassName)}
243
248
  >
244
249
  {renderOption ? (
@@ -247,7 +252,6 @@ function Select({
247
252
  <span className="flex min-w-0 flex-1 flex-col">
248
253
  <span className="flex min-w-0 items-center gap-2">
249
254
  <span className="truncate">{option.label}</span>
250
- {selected ? <CheckIcon className="ml-auto size-3.5 text-primary" /> : null}
251
255
  </span>
252
256
  {option.description ? (
253
257
  <span className="truncate text-xs text-muted-foreground">{option.description}</span>
@@ -297,6 +301,7 @@ function SelectTrigger({
297
301
  data-size={size}
298
302
  className={cn(
299
303
  "flex w-full min-w-0 items-center justify-between gap-2 whitespace-nowrap outline-none select-none disabled:cursor-not-allowed [&_svg]:pointer-events-none [&_svg]:shrink-0",
304
+ "rounded-[var(--radius-lg)] border border-[color:var(--aui-input-border,var(--border))] bg-[color:var(--aui-input-bg,var(--background))] px-3 text-[color:var(--aui-input-fg,var(--foreground))] shadow-sm transition-[border-color,box-shadow,background-color] hover:border-[color:var(--aui-input-border-hover,var(--border))] focus-visible:border-[color:var(--aui-ring,var(--ring))] focus-visible:shadow-[0_0_0_3px_color-mix(in_oklch,var(--aui-ring,var(--ring)),transparent_82%)] disabled:opacity-60 data-[size=sm]:h-9 data-[size=default]:min-h-10 data-[size=lg]:min-h-11 data-[size=lg]:px-4 aria-[invalid=true]:border-[color:var(--aui-danger,var(--destructive))] aria-[invalid=true]:shadow-[0_0_0_3px_color-mix(in_oklch,var(--aui-danger,var(--destructive)),transparent_84%)]",
300
305
  className
301
306
  )}
302
307
  {...props}
@@ -337,7 +342,7 @@ function SelectContent({
337
342
  data-slot="select-content"
338
343
  data-align-trigger={alignItemWithTrigger}
339
344
  className={cn(
340
- "relative isolate max-h-(--available-height) w-(--anchor-width) min-w-52 origin-(--transform-origin) overflow-x-hidden overflow-y-auto",
345
+ "relative isolate max-h-(--available-height) w-(--anchor-width) min-w-52 origin-(--transform-origin) overflow-x-hidden overflow-y-auto rounded-[var(--radius-xl)] border border-[color:var(--aui-surface-border,var(--border))] bg-[color:var(--aui-popover-bg,var(--popover))] p-1 text-[color:var(--aui-popover-fg,var(--popover-foreground))] shadow-xl",
341
346
  className
342
347
  )}
343
348
  {...props}
@@ -361,12 +366,12 @@ function SelectLabel({ className, ...props }: SelectLabelProps) {
361
366
  )
362
367
  }
363
368
 
364
- function SelectItem({ className, children, ...props }: SelectItemProps) {
369
+ function SelectItem({ className, children, showIndicator = true, ...props }: SelectItemProps) {
365
370
  return (
366
371
  <SelectPrimitive.Item
367
372
  data-slot="select-item"
368
373
  className={cn(
369
- "relative flex w-full cursor-default items-center gap-2 outline-hidden select-none data-disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0",
374
+ "relative flex w-full cursor-default items-center gap-2 px-2.5 py-2 pr-8 text-sm outline-hidden select-none data-disabled:pointer-events-none data-highlighted:bg-[color:var(--aui-control-bg,var(--muted))] data-highlighted:text-[color:var(--aui-control-fg,var(--foreground))] data-selected:bg-[color:var(--aui-control-bg,var(--muted))] data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
370
375
  className
371
376
  )}
372
377
  {...props}
@@ -374,11 +379,13 @@ function SelectItem({ className, children, ...props }: SelectItemProps) {
374
379
  <SelectPrimitive.ItemText className="flex flex-1 shrink-0 gap-2 whitespace-nowrap">
375
380
  {children}
376
381
  </SelectPrimitive.ItemText>
377
- <SelectPrimitive.ItemIndicator
378
- render={<span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center" />}
379
- >
380
- <CheckIcon className="pointer-events-none" />
381
- </SelectPrimitive.ItemIndicator>
382
+ {showIndicator ? (
383
+ <SelectPrimitive.ItemIndicator
384
+ render={<span className="pointer-events-none absolute right-2 flex size-4 items-center justify-center" />}
385
+ >
386
+ <CheckIcon className="pointer-events-none size-4" />
387
+ </SelectPrimitive.ItemIndicator>
388
+ ) : null}
382
389
  </SelectPrimitive.Item>
383
390
  )
384
391
  }