@infonomic/uikit 5.44.0 → 6.0.1

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 (180) hide show
  1. package/README.md +12 -3
  2. package/dist/components/accordion/accordion.d.ts +9 -9
  3. package/dist/components/accordion/accordion.d.ts.map +1 -1
  4. package/dist/components/accordion/accordion.js +4 -4
  5. package/dist/components/accordion/accordion.module.css +6 -5
  6. package/dist/components/accordion/accordion_module.css +4 -4
  7. package/dist/components/avatar/avatar.js +2 -2
  8. package/dist/components/badge/badge.d.ts +5 -13
  9. package/dist/components/badge/badge.d.ts.map +1 -1
  10. package/dist/components/badge/badge.js +12 -9
  11. package/dist/components/button/button-group.d.ts +9 -7
  12. package/dist/components/button/button-group.d.ts.map +1 -1
  13. package/dist/components/button/button-group.js +26 -36
  14. package/dist/components/button/button.d.ts +6 -13
  15. package/dist/components/button/button.d.ts.map +1 -1
  16. package/dist/components/button/button.js +19 -18
  17. package/dist/components/button/button.module.css +32 -54
  18. package/dist/components/button/button_module.css +7 -10
  19. package/dist/components/button/combo-button.d.ts +1 -1
  20. package/dist/components/button/combo-button.d.ts.map +1 -1
  21. package/dist/components/button/combo-button.js +13 -9
  22. package/dist/components/button/combo-button.module.css +16 -7
  23. package/dist/components/button/combo-button_module.css +22 -4
  24. package/dist/components/button/icon-button.d.ts +2 -3
  25. package/dist/components/button/icon-button.d.ts.map +1 -1
  26. package/dist/components/card/card.d.ts +5 -12
  27. package/dist/components/card/card.d.ts.map +1 -1
  28. package/dist/components/card/card.js +13 -9
  29. package/dist/components/chips/chip.d.ts +5 -11
  30. package/dist/components/chips/chip.d.ts.map +1 -1
  31. package/dist/components/chips/chip.js +36 -28
  32. package/dist/components/chips/chip.module.css +22 -36
  33. package/dist/components/chips/chip_module.css +3 -6
  34. package/dist/components/dropdown/dropdown.d.ts +28 -14
  35. package/dist/components/dropdown/dropdown.d.ts.map +1 -1
  36. package/dist/components/dropdown/dropdown.js +34 -20
  37. package/dist/components/forms/calendar.d.ts +1 -1
  38. package/dist/components/forms/calendar.d.ts.map +1 -1
  39. package/dist/components/forms/calendar.js +38 -29
  40. package/dist/components/forms/checkbox.astro +13 -8
  41. package/dist/components/forms/checkbox.d.ts +6 -2
  42. package/dist/components/forms/checkbox.d.ts.map +1 -1
  43. package/dist/components/forms/checkbox.js +11 -7
  44. package/dist/components/forms/checkbox.module.css +20 -20
  45. package/dist/components/forms/checkbox_module.css +13 -10
  46. package/dist/components/forms/input.module.css +10 -11
  47. package/dist/components/forms/input_module.css +3 -5
  48. package/dist/components/forms/radio-group.d.ts +6 -5
  49. package/dist/components/forms/radio-group.d.ts.map +1 -1
  50. package/dist/components/forms/radio-group.js +9 -4
  51. package/dist/components/forms/radio-group.module.css +13 -22
  52. package/dist/components/forms/radio-group_module.css +6 -24
  53. package/dist/components/forms/select.d.ts +4 -5
  54. package/dist/components/forms/select.d.ts.map +1 -1
  55. package/dist/components/forms/select.js +27 -29
  56. package/dist/components/forms/select.module.css +22 -22
  57. package/dist/components/forms/select.module.js +15 -15
  58. package/dist/components/forms/select_module.css +15 -15
  59. package/dist/components/notifications/@types/toast.d.ts +9 -7
  60. package/dist/components/notifications/@types/toast.d.ts.map +1 -1
  61. package/dist/components/notifications/toast.d.ts +12 -16
  62. package/dist/components/notifications/toast.d.ts.map +1 -1
  63. package/dist/components/notifications/toast.js +73 -57
  64. package/dist/components/notifications/toast.module.css +151 -177
  65. package/dist/components/notifications/toast.module.js +8 -12
  66. package/dist/components/notifications/toast_module.css +114 -159
  67. package/dist/components/pager/first-button.d.ts +2 -2
  68. package/dist/components/pager/first-button.d.ts.map +1 -1
  69. package/dist/components/pager/first-button.js +23 -16
  70. package/dist/components/pager/last-button.d.ts +2 -2
  71. package/dist/components/pager/last-button.d.ts.map +1 -1
  72. package/dist/components/pager/last-button.js +23 -16
  73. package/dist/components/pager/next-button.d.ts +2 -2
  74. package/dist/components/pager/next-button.d.ts.map +1 -1
  75. package/dist/components/pager/next-button.js +27 -20
  76. package/dist/components/pager/number-button.d.ts +2 -2
  77. package/dist/components/pager/number-button.d.ts.map +1 -1
  78. package/dist/components/pager/number-button.js +28 -23
  79. package/dist/components/pager/pagination.d.ts +8 -13
  80. package/dist/components/pager/pagination.d.ts.map +1 -1
  81. package/dist/components/pager/previous-button.d.ts +2 -2
  82. package/dist/components/pager/previous-button.d.ts.map +1 -1
  83. package/dist/components/pager/previous-button.js +25 -18
  84. package/dist/components/scroll-area/scroll-area.d.ts +2 -2
  85. package/dist/components/scroll-area/scroll-area.d.ts.map +1 -1
  86. package/dist/components/scroll-area/scroll-area.js +4 -2
  87. package/dist/components/tabs/tabs.d.ts +13 -13
  88. package/dist/components/tabs/tabs.d.ts.map +1 -1
  89. package/dist/components/tabs/tabs.js +8 -8
  90. package/dist/components/tabs/tabs.module.css +8 -17
  91. package/dist/components/tabs/tabs_module.css +1 -1
  92. package/dist/components/tooltip/tooltip.d.ts +6 -8
  93. package/dist/components/tooltip/tooltip.d.ts.map +1 -1
  94. package/dist/components/tooltip/tooltip.js +49 -20
  95. package/dist/components/tooltip/tooltip.module.css +43 -10
  96. package/dist/components/tooltip/tooltip.module.js +7 -1
  97. package/dist/components/tooltip/tooltip_module.css +36 -4
  98. package/dist/hooks/use-focus-trap/index.d.ts +2 -0
  99. package/dist/hooks/use-focus-trap/index.d.ts.map +1 -0
  100. package/dist/hooks/use-focus-trap/index.js +1 -0
  101. package/dist/hooks/use-focus-trap/scope-tab.d.ts +11 -0
  102. package/dist/hooks/use-focus-trap/scope-tab.d.ts.map +1 -0
  103. package/dist/hooks/use-focus-trap/scope-tab.js +19 -0
  104. package/dist/hooks/use-focus-trap/tabbable.d.ts +14 -0
  105. package/dist/hooks/use-focus-trap/tabbable.d.ts.map +1 -0
  106. package/dist/hooks/use-focus-trap/tabbable.js +36 -0
  107. package/dist/hooks/use-focus-trap/use-focus-trap.d.ts +11 -0
  108. package/dist/hooks/use-focus-trap/use-focus-trap.d.ts.map +1 -0
  109. package/dist/hooks/use-focus-trap/use-focus-trap.js +45 -0
  110. package/dist/icons/chevron-up-icon.d.ts +7 -0
  111. package/dist/icons/chevron-up-icon.d.ts.map +1 -0
  112. package/dist/icons/chevron-up-icon.js +27 -0
  113. package/dist/lib/ripple.d.ts +25 -0
  114. package/dist/lib/ripple.d.ts.map +1 -0
  115. package/dist/lib/ripple.js +53 -0
  116. package/dist/styles/components-vanilla.css +1 -1
  117. package/dist/widgets/datepicker/datepicker.d.ts +1 -1
  118. package/dist/widgets/datepicker/datepicker.d.ts.map +1 -1
  119. package/dist/widgets/datepicker/datepicker.js +118 -116
  120. package/dist/widgets/datepicker/datepicker.module.css +6 -5
  121. package/dist/widgets/datepicker/datepicker_module.css +4 -4
  122. package/dist/widgets/drawer/drawer-wrapper.d.ts.map +1 -1
  123. package/dist/widgets/drawer/drawer-wrapper.js +1 -1
  124. package/dist/widgets/modal/modal-wrapper.d.ts.map +1 -1
  125. package/dist/widgets/modal/modal-wrapper.js +1 -1
  126. package/package.json +2 -6
  127. package/src/components/accordion/accordion.module.css +6 -5
  128. package/src/components/accordion/accordion.stories.tsx +10 -13
  129. package/src/components/accordion/accordion.tsx +13 -13
  130. package/src/components/avatar/avatar.tsx +2 -2
  131. package/src/components/badge/badge.tsx +20 -29
  132. package/src/components/button/button-group.tsx +60 -44
  133. package/src/components/button/button.module.css +32 -54
  134. package/src/components/button/button.tsx +35 -47
  135. package/src/components/button/combo-button.module.css +16 -7
  136. package/src/components/button/combo-button.tsx +17 -9
  137. package/src/components/button/icon-button.tsx +3 -5
  138. package/src/components/card/card.tsx +20 -32
  139. package/src/components/chips/chip.module.css +22 -36
  140. package/src/components/chips/chip.stories.tsx +2 -2
  141. package/src/components/chips/chip.tsx +59 -57
  142. package/src/components/dropdown/dropdown.stories.tsx +2 -4
  143. package/src/components/dropdown/dropdown.tsx +86 -40
  144. package/src/components/forms/calendar.tsx +43 -33
  145. package/src/components/forms/checkbox-group.tsx +1 -1
  146. package/src/components/forms/checkbox.astro +13 -8
  147. package/src/components/forms/checkbox.module.css +20 -20
  148. package/src/components/forms/checkbox.tsx +11 -6
  149. package/src/components/forms/input.module.css +10 -11
  150. package/src/components/forms/radio-group.module.css +13 -22
  151. package/src/components/forms/radio-group.tsx +13 -11
  152. package/src/components/forms/select.module.css +22 -22
  153. package/src/components/forms/select.tsx +36 -33
  154. package/src/components/notifications/@types/toast.ts +9 -7
  155. package/src/components/notifications/toast.module.css +151 -177
  156. package/src/components/notifications/toast.stories.tsx +21 -23
  157. package/src/components/notifications/toast.tsx +90 -86
  158. package/src/components/pager/first-button.tsx +24 -26
  159. package/src/components/pager/last-button.tsx +24 -25
  160. package/src/components/pager/next-button.tsx +24 -23
  161. package/src/components/pager/number-button.tsx +37 -36
  162. package/src/components/pager/pagination.tsx +4 -11
  163. package/src/components/pager/previous-button.tsx +24 -24
  164. package/src/components/scroll-area/scroll-area.tsx +3 -3
  165. package/src/components/tabs/tabs.module.css +8 -17
  166. package/src/components/tabs/tabs.stories.tsx +5 -5
  167. package/src/components/tabs/tabs.tsx +17 -16
  168. package/src/components/tooltip/tooltip.module.css +43 -10
  169. package/src/components/tooltip/tooltip.stories.tsx +4 -4
  170. package/src/components/tooltip/tooltip.tsx +56 -28
  171. package/src/hooks/use-focus-trap/index.ts +1 -0
  172. package/src/hooks/use-focus-trap/scope-tab.ts +48 -0
  173. package/src/hooks/use-focus-trap/tabbable.ts +72 -0
  174. package/src/hooks/use-focus-trap/use-focus-trap.ts +83 -0
  175. package/src/icons/chevron-up-icon.tsx +37 -0
  176. package/src/lib/ripple.ts +95 -0
  177. package/src/widgets/datepicker/datepicker.module.css +6 -5
  178. package/src/widgets/datepicker/datepicker.tsx +137 -135
  179. package/src/widgets/drawer/drawer-wrapper.tsx +1 -1
  180. package/src/widgets/modal/modal-wrapper.tsx +1 -1
@@ -1,7 +1,7 @@
1
1
  'use client'
2
2
 
3
3
  /**
4
- * @file Calendar component using react-day-picker and radix-ui
4
+ * @file Calendar component using react-day-picker and @base-ui/react
5
5
  * @see https://github.com/Maliksidk19/shadcn-datetime-picker/
6
6
  * Portions copyright (c) 2023 Maliksidk19 licensed under the MIT
7
7
  * license found in the LICENSE file in the root directory of this source tree.
@@ -10,8 +10,8 @@
10
10
 
11
11
  import * as React from 'react'
12
12
 
13
+ import { Select as SelectPrimitive } from '@base-ui/react/select'
13
14
  import cx from 'classnames'
14
- import { Select as SelectPrimitive } from 'radix-ui'
15
15
  import {
16
16
  DayPicker,
17
17
  type DayPickerProps,
@@ -87,48 +87,58 @@ export function Calendar({
87
87
  const Dropdown = React.useCallback(
88
88
  ({ value, onChange, options }: React.ComponentProps<typeof DropDownDayPicker>) => {
89
89
  const selected = options?.find((option) => option.value === value)
90
- const handleChange = (value: string) => {
90
+ const handleChange = (newValue: string) => {
91
91
  const changeEvent = {
92
- target: { value },
92
+ target: { value: newValue },
93
93
  } as React.ChangeEvent<HTMLSelectElement>
94
94
  onChange?.(changeEvent)
95
95
  }
96
96
  return (
97
97
  <SelectPrimitive.Root
98
98
  value={value?.toString()}
99
- onValueChange={(value) => {
100
- handleChange(value)
99
+ onValueChange={(newValue) => {
100
+ handleChange(newValue as string)
101
101
  }}
102
102
  >
103
- <SelectPrimitive.Trigger asChild>
104
- <Button
105
- variant="outlined"
106
- size="sm"
107
- className={cx(styles['select-trigger'], props.selectTriggerClassName)}
108
- >
109
- <SelectPrimitive.Value>{selected?.label}</SelectPrimitive.Value>
103
+ <SelectPrimitive.Trigger
104
+ render={
105
+ <Button
106
+ variant="outlined"
107
+ size="sm"
108
+ className={cx(styles['select-trigger'], props.selectTriggerClassName)}
109
+ />
110
+ }
111
+ >
112
+ <SelectPrimitive.Value>{() => selected?.label}</SelectPrimitive.Value>
113
+ <SelectPrimitive.Icon>
110
114
  <ChevronsUpDown height="18px" width="18px" svgClassName={styles['select-chevrons']} />
111
- </Button>
115
+ </SelectPrimitive.Icon>
112
116
  </SelectPrimitive.Trigger>
113
- <SelectPrimitive.Content
114
- className={styles['select-content']}
115
- position="popper"
116
- sideOffset={4}
117
- align="center"
118
- >
119
- <ScrollArea className={cx(styles['scroll-area'])}>
120
- {options?.map(({ value, label, disabled }, id) => (
121
- <SelectPrimitive.Item
122
- className={styles['select-item']}
123
- key={`${value}-${id}`}
124
- value={value?.toString()}
125
- disabled={disabled}
126
- >
127
- {label}
128
- </SelectPrimitive.Item>
129
- ))}
130
- </ScrollArea>
131
- </SelectPrimitive.Content>
117
+ <SelectPrimitive.Portal>
118
+ <SelectPrimitive.Positioner
119
+ className={styles['select-content']}
120
+ sideOffset={4}
121
+ align="center"
122
+ alignItemWithTrigger={false}
123
+ >
124
+ <SelectPrimitive.Popup>
125
+ <ScrollArea className={cx(styles['scroll-area'])}>
126
+ <SelectPrimitive.List>
127
+ {options?.map(({ value, label, disabled }, id) => (
128
+ <SelectPrimitive.Item
129
+ className={styles['select-item']}
130
+ key={`${value}-${id}`}
131
+ value={value?.toString()}
132
+ disabled={disabled}
133
+ >
134
+ <SelectPrimitive.ItemText>{label}</SelectPrimitive.ItemText>
135
+ </SelectPrimitive.Item>
136
+ ))}
137
+ </SelectPrimitive.List>
138
+ </ScrollArea>
139
+ </SelectPrimitive.Popup>
140
+ </SelectPrimitive.Positioner>
141
+ </SelectPrimitive.Portal>
132
142
  </SelectPrimitive.Root>
133
143
  )
134
144
  },
@@ -50,7 +50,7 @@ export const CheckboxGroup: React.FC<CheckboxGroupProps> = ({
50
50
  }
51
51
  }, [controlledValue, defaultValues])
52
52
 
53
- const handleCheckboxChange = (id: string, checked: boolean | 'indeterminate') => {
53
+ const handleCheckboxChange = (id: string, checked: boolean) => {
54
54
  const s = [...selected]
55
55
  if (checked === true) {
56
56
  if (s.includes(id) === false) {
@@ -71,11 +71,13 @@ const {
71
71
  checkBoxClasses,
72
72
  className
73
73
  ]}
74
- data-state={checked ? 'checked' : 'unchecked'}
74
+ data-checked={checked ? '' : undefined}
75
+ data-unchecked={!checked ? '' : undefined}
75
76
  >
76
77
  <span
77
78
  class:list={['checkbox-indicator', styles.indicator]}
78
- data-state={checked ? 'checked' : 'unchecked'}
79
+ data-checked={checked ? '' : undefined}
80
+ data-unchecked={!checked ? '' : undefined}
79
81
  >
80
82
  <CheckIcon class={styles.icon} />
81
83
  </span>
@@ -110,17 +112,20 @@ const {
110
112
  const indicator = visualCheckbox?.querySelector('.checkbox-indicator')
111
113
 
112
114
  if (visualCheckbox && indicator) {
115
+ const updateState = (checked: boolean) => {
116
+ for (const el of [visualCheckbox, indicator]) {
117
+ el.toggleAttribute('data-checked', checked)
118
+ el.toggleAttribute('data-unchecked', !checked)
119
+ }
120
+ }
121
+
113
122
  // Update state on change
114
123
  checkboxInput.addEventListener('change', () => {
115
- const state = checkboxInput.checked ? 'checked' : 'unchecked'
116
- visualCheckbox.setAttribute('data-state', state)
117
- indicator.setAttribute('data-state', state)
124
+ updateState(checkboxInput.checked)
118
125
  })
119
126
 
120
127
  // Ensure initial state is correct
121
- const state = checkboxInput.checked ? 'checked' : 'unchecked'
122
- visualCheckbox.setAttribute('data-state', state)
123
- indicator.setAttribute('data-state', state)
128
+ updateState(checkboxInput.checked)
124
129
  }
125
130
  })
126
131
  }
@@ -32,22 +32,19 @@ infonomic-components;
32
32
  display: inline-flex;
33
33
  align-items: center;
34
34
  justify-content: center;
35
+ outline: 1px solid transparent;
36
+ outline-offset: 2px;
35
37
  border-radius: var(--border-radius-sm);
36
38
  transition: all var(--transition-normal);
37
39
  }
38
40
 
39
- .checkbox[data-state="checked"],
40
- :global(.infonomic-checkbox)[data-state="checked"] {
41
- --ring-offset-color: var(--background);
42
- --ring-offset-shadow: var(--ring-inset) 0 0 0 var(--ring-offset-width) var(--ring-offset-color);
43
- --ring-shadow: var(--ring-inset) 0 0 0 calc(1px + var(--ring-offset-width)) var(--ring-color);
44
- box-shadow: var(--ring-offset-shadow), var(--ring-shadow), var(--shadow, 0 0 #0000);
41
+ .checkbox[data-checked],
42
+ :global(.infonomic-checkbox)[data-checked] {
43
+ outline-color: var(--ring-color);
45
44
  }
46
45
 
47
- .checkbox:disabled,
48
- :global(.infonomic-checkbox):disabled,
49
- .checkbox[disabled],
50
- :global(.infonomic-checkbox)[disabled] {
46
+ .checkbox[data-disabled],
47
+ :global(.infonomic-checkbox)[data-disabled] {
51
48
  pointer-events: none;
52
49
  }
53
50
 
@@ -74,16 +71,16 @@ infonomic-components;
74
71
  }
75
72
 
76
73
  /* Style for the "checked" state — animation overrides the transition for bouncy entry */
77
- .indicator[data-state="checked"] .icon,
78
- :global(.infonomic-checkbox-indicator)[data-state="checked"] :global(.infonomic-checkbox-icon) {
74
+ .indicator[data-checked] .icon,
75
+ :global(.infonomic-checkbox-indicator)[data-checked] :global(.infonomic-checkbox-icon) {
79
76
  animation: checkBoxIn 0.3s cubic-bezier(0.25, 1.5, 0.5, 1) forwards;
80
77
  opacity: 1;
81
78
  transform: scale(1);
82
79
  }
83
80
 
84
81
  /* Style for the "unchecked" state — no animation, let the CSS transition handle the exit */
85
- .indicator[data-state="unchecked"] .icon,
86
- :global(.infonomic-checkbox-indicator)[data-state="unchecked"] :global(.infonomic-checkbox-icon) {
82
+ .indicator[data-unchecked] .icon,
83
+ :global(.infonomic-checkbox-indicator)[data-unchecked] :global(.infonomic-checkbox-icon) {
87
84
  opacity: 0;
88
85
  transform: scale(0.8);
89
86
  }
@@ -96,10 +93,8 @@ infonomic-components;
96
93
  color: var(--label-color);
97
94
  }
98
95
 
99
- .checkbox:disabled~.label,
100
- .checkbox[disabled]~.label,
101
- :global(.infonomic-checkbox):disabled~ :global(.infonomic-checkbox-label),
102
- :global(.infonomic-checkbox)[disabled]~ :global(.infonomic-checkbox-label) {
96
+ .checkbox[data-disabled]~.label,
97
+ :global(.infonomic-checkbox)[data-disabled]~ :global(.infonomic-checkbox-label) {
103
98
  pointer-events: none;
104
99
  }
105
100
 
@@ -169,8 +164,8 @@ infonomic-components;
169
164
  --checkbox-icon-color: white;
170
165
  }
171
166
 
172
- .outlined[data-state="checked"],
173
- :global(.infonomic-checkbox-outlined)[data-state="checked"] {
167
+ .outlined[data-checked],
168
+ :global(.infonomic-checkbox-outlined)[data-checked] {
174
169
  --ring-color: var(--checkbox-variant-outline-ring-color);
175
170
  background-color: var(--checkbox-variant-outlined);
176
171
  }
@@ -181,6 +176,11 @@ infonomic-components;
181
176
  --checkbox-icon-color: white;
182
177
  }
183
178
 
179
+ .filled[data-checked],
180
+ :global(.infonomic-checkbox-filled)[data-checked] {
181
+ --ring-color: var(--checkbox-variant-outline-ring-color);
182
+ }
183
+
184
184
  /* Intents */
185
185
  .primary,
186
186
  :global(.infonomic-checkbox-primary) {
@@ -2,8 +2,8 @@
2
2
 
3
3
  import type * as React from 'react'
4
4
 
5
+ import { Checkbox as CheckboxPrimitive } from '@base-ui/react/checkbox'
5
6
  import cx from 'classnames'
6
- import { Checkbox as CheckboxPrimitive, Label as LabelPrimitive } from 'radix-ui'
7
7
 
8
8
  import { CheckIcon } from '../../icons/check-icon'
9
9
  import styles from './checkbox.module.css'
@@ -11,7 +11,7 @@ import { ErrorText } from './error-text.js'
11
11
  import { HelpText } from './help-text.js'
12
12
  import type { Intent, Size, Variant } from './@types/checkbox.js'
13
13
 
14
- export interface Props extends React.ButtonHTMLAttributes<HTMLButtonElement> {
14
+ export interface Props {
15
15
  id: string
16
16
  name: string
17
17
  label?: string
@@ -20,6 +20,7 @@ export interface Props extends React.ButtonHTMLAttributes<HTMLButtonElement> {
20
20
  intent?: Intent
21
21
  reverse?: boolean
22
22
  checked?: boolean
23
+ disabled?: boolean
23
24
  className?: string
24
25
  checkBoxClasses?: string
25
26
  containerClasses?: string
@@ -28,7 +29,9 @@ export interface Props extends React.ButtonHTMLAttributes<HTMLButtonElement> {
28
29
  error?: boolean
29
30
  helpText?: string
30
31
  errorText?: string
31
- onCheckedChange?: (checked: boolean | 'indeterminate') => void
32
+ onCheckedChange?: React.ComponentProps<typeof CheckboxPrimitive.Root>['onCheckedChange']
33
+ onClick?: React.MouseEventHandler
34
+ 'aria-label'?: string
32
35
  }
33
36
 
34
37
  export const Checkbox = function Checkbox({
@@ -63,6 +66,8 @@ export const Checkbox = function Checkbox({
63
66
  ref={ref}
64
67
  id={id}
65
68
  name={name}
69
+ nativeButton
70
+ render={<button type="button" />}
66
71
  className={cx(
67
72
  'infonomic-checkbox',
68
73
  `infonomic-checkbox-${variant}`,
@@ -78,7 +83,7 @@ export const Checkbox = function Checkbox({
78
83
  {...rest}
79
84
  >
80
85
  <CheckboxPrimitive.Indicator
81
- forceMount
86
+ keepMounted
82
87
  className={cx('infonomic-checkbox-indicator', styles.indicator)}
83
88
  >
84
89
  <CheckIcon className={styles.icon} />
@@ -86,12 +91,12 @@ export const Checkbox = function Checkbox({
86
91
  </CheckboxPrimitive.Root>
87
92
 
88
93
  {label != null && (
89
- <LabelPrimitive.Label
94
+ <label
90
95
  htmlFor={id}
91
96
  className={cx('infonomic-checkbox-label', styles.label, labelClasses)}
92
97
  >
93
98
  {label}
94
- </LabelPrimitive.Label>
99
+ </label>
95
100
  )}
96
101
  </div>
97
102
  {error ? (
@@ -1,11 +1,12 @@
1
1
  @layer infonomic-base,
2
- infonomic-functional,
3
- infonomic-utilities,
4
- infonomic-theme,
5
- infonomic-typography,
6
- infonomic-components;
2
+ infonomic-functional,
3
+ infonomic-utilities,
4
+ infonomic-theme,
5
+ infonomic-typography,
6
+ infonomic-components;
7
7
 
8
8
  @layer infonomic-components {
9
+
9
10
  .input-wrapper,
10
11
  :global(.infonomic-input-wrapper) {
11
12
  display: flex;
@@ -26,7 +27,8 @@
26
27
  .input,
27
28
  :global(.infonomic-input) {
28
29
  border: none;
29
- outline: none;
30
+ outline: 1px solid transparent;
31
+ outline-offset: 2px;
30
32
  font-weight: normal;
31
33
  display: inline-flex;
32
34
  gap: var(--gap-2);
@@ -40,10 +42,7 @@
40
42
  .input:active,
41
43
  :global(.infonomic-input):focus,
42
44
  :global(.infonomic-input):active {
43
- --ring-offset-color: var(--background);
44
- --ring-offset-shadow: var(--ring-inset) 0 0 0 var(--ring-offset-width) var(--ring-offset-color);
45
- --ring-shadow: var(--ring-inset) 0 0 0 calc(1px + var(--ring-offset-width)) var(--ring-color);
46
- box-shadow: var(--ring-offset-shadow), var(--ring-shadow), var(--shadow, 0 0 #0000);
45
+ outline-color: var(--ring-color);
47
46
  }
48
47
 
49
48
  .input:disabled,
@@ -281,4 +280,4 @@
281
280
  }
282
281
 
283
282
  /* Dark mode handled by semantic tokens in theme layer */
284
- }
283
+ }
@@ -1,12 +1,13 @@
1
1
  @layer infonomic-base,
2
- infonomic-functional,
3
- infonomic-utilities,
4
- infonomic-theme,
5
- infonomic-typography,
6
- infonomic-components;
2
+ infonomic-functional,
3
+ infonomic-utilities,
4
+ infonomic-theme,
5
+ infonomic-typography,
6
+ infonomic-components;
7
7
 
8
8
  /* 'border-collapse w-full text-sm text-left text-gray-700 dark:text-gray-400 m-0', */
9
9
  @layer infonomic-components {
10
+
10
11
  .column,
11
12
  :global(.infonomic-radio-group-column) {
12
13
  display: flex;
@@ -38,32 +39,22 @@
38
39
  transition: all var(--transition-normal);
39
40
  }
40
41
 
41
- .item[data-state="checked"],
42
- :global(.infonomic-radio-group-item[data-state="checked"]) {
43
- --ring-offset-color: var(--background);
44
- --ring-offset-shadow: var(--ring-inset) 0 0 0 var(--ring-offset-width) var(--ring-offset-color);
45
- --ring-shadow: var(--ring-inset) 0 0 0 calc(1px + var(--ring-offset-width)) var(--ring-color);
46
- box-shadow: var(--ring-offset-shadow), var(--ring-shadow), var(--shadow, 0 0 #0000);
47
- }
48
-
49
- .item:disabled,
50
- :global(.infonomic-radio-group-item:disabled),
51
- .item[disabled],
52
- :global(.infonomic-radio-group-item[disabled]) {
42
+ .item[data-disabled],
43
+ :global(.infonomic-radio-group-item[data-disabled]) {
53
44
  pointer-events: none;
54
45
  }
55
46
 
56
47
  /* Style for the "checked" state */
57
- .indicator[data-state="checked"],
58
- :global(.infonomic-radio-group-indicator[data-state="checked"]) {
48
+ .indicator[data-checked],
49
+ :global(.infonomic-radio-group-indicator[data-checked]) {
59
50
  animation: radioIn 0.3s cubic-bezier(0.25, 1.5, 0.5, 1) forwards;
60
51
  opacity: 1;
61
52
  transform: scale(1);
62
53
  }
63
54
 
64
55
  /* Style for the "unchecked" state */
65
- .indicator[data-state="unchecked"],
66
- :global(.infonomic-radio-group-indicator[data-state="unchecked"]) {
56
+ .indicator[data-unchecked],
57
+ :global(.infonomic-radio-group-indicator[data-unchecked]) {
67
58
  animation: radioOut 0.2s ease-in;
68
59
  opacity: 0;
69
60
  transform: scale(0.8);
@@ -182,4 +173,4 @@
182
173
  transform: scale(0.8);
183
174
  }
184
175
  }
185
- }
176
+ }
@@ -2,8 +2,9 @@
2
2
 
3
3
  import type React from 'react'
4
4
 
5
+ import { Radio } from '@base-ui/react/radio'
6
+ import { RadioGroup as RadioGroupPrimitive } from '@base-ui/react/radio-group'
5
7
  import cx from 'classnames'
6
- import { RadioGroup as RadioGroupPrimitive } from 'radix-ui'
7
8
 
8
9
  import styles from './radio-group.module.css'
9
10
  import type { Intent } from '../@types/shared'
@@ -22,24 +23,26 @@ export const RadioGroupItem = ({
22
23
  label,
23
24
  ref: forwardedRef,
24
25
  ...props
25
- }: RadioGroupPrimitive.RadioGroupItemProps & {
26
+ }: Omit<React.ComponentProps<typeof Radio.Root>, 'value'> & {
26
27
  intent?: Intent
27
28
  className?: string
28
29
  id: string
29
30
  value: string
30
31
  label: string
31
- ref?: React.RefObject<React.ComponentRef<'div'>>
32
+ ref?: React.RefObject<HTMLDivElement>
32
33
  }) => {
33
34
  return (
34
35
  <div ref={forwardedRef} className={styles['item-container']}>
35
- <RadioGroupPrimitive.Item
36
+ <Radio.Root
36
37
  {...props}
37
38
  className={cx(styles.item, styles[intent])}
38
39
  value={value}
39
40
  id={id}
41
+ nativeButton
42
+ render={<button type="button" />}
40
43
  >
41
- <RadioGroupPrimitive.Indicator className={styles.indicator} />
42
- </RadioGroupPrimitive.Item>
44
+ <Radio.Indicator className={styles.indicator} />
45
+ </Radio.Root>
43
46
  <label className={styles.label} htmlFor={id}>
44
47
  {label}
45
48
  </label>
@@ -53,18 +56,17 @@ export const RadioGroup = ({
53
56
  direction = 'column',
54
57
  children,
55
58
  ...props
56
- }: RadioGroupPrimitive.RadioGroupProps & {
59
+ }: React.ComponentProps<typeof RadioGroupPrimitive> & {
57
60
  direction?: 'row' | 'column'
58
61
  className?: string
59
62
  children: React.ReactNode
60
- ref?: React.RefObject<React.ComponentRef<'div'>>
63
+ ref?: React.RefObject<HTMLDivElement>
61
64
  }) => (
62
- <RadioGroupPrimitive.Root
65
+ <RadioGroupPrimitive
63
66
  ref={forwardedRef}
64
67
  className={cx('infonomic-radio-group', styles[direction], className)}
65
- // aria-label="View density"
66
68
  {...props}
67
69
  >
68
70
  {children}
69
- </RadioGroupPrimitive.Root>
71
+ </RadioGroupPrimitive>
70
72
  )
@@ -7,13 +7,13 @@ infonomic-components;
7
7
 
8
8
  @layer infonomic-components {
9
9
 
10
- .content,
11
- :global(.infonomic-select-content) {
10
+ .positioner,
11
+ :global(.infonomic-select-positioner) {
12
12
  z-index: 50;
13
13
  }
14
14
 
15
- .viewport,
16
- :global(.infonomic-select-viewport) {
15
+ .popup,
16
+ :global(.infonomic-select-popup) {
17
17
  z-index: 50;
18
18
  margin-top: 2px;
19
19
  border: 1px solid var(--surface-panel-border);
@@ -23,33 +23,33 @@ infonomic-components;
23
23
  padding: 6px;
24
24
  }
25
25
 
26
- .viewport-xs {
26
+ .popup-xs {
27
27
  padding: 4px;
28
28
  }
29
29
 
30
- .viewport-sm {
30
+ .popup-sm {
31
31
  padding: 4px;
32
32
  }
33
33
 
34
- .viewport-md {
34
+ .popup-md {
35
35
  padding: 6px;
36
36
  }
37
37
 
38
- .viewport-lg {
38
+ .popup-lg {
39
39
  padding: 6px;
40
40
  }
41
41
 
42
- .viewport-xl {
42
+ .popup-xl {
43
43
  padding: 8px;
44
44
  }
45
45
 
46
- .group,
47
- :global(.infonomic-select-group) {
46
+ .list,
47
+ :global(.infonomic-select-list) {
48
48
  z-index: 50;
49
49
  }
50
50
 
51
- .scroll-button,
52
- :global(.infonomic-select-scroll-button) {
51
+ .scroll-arrow,
52
+ :global(.infonomic-select-scroll-arrow) {
53
53
  display: flex;
54
54
  align-items: center;
55
55
  justify-content: center;
@@ -101,7 +101,7 @@ infonomic-components;
101
101
  }
102
102
 
103
103
  /* size variants — treat current values as 'md' */
104
- .viewport-xs .select-item {
104
+ .popup-xs .select-item {
105
105
  font-size: 0.75rem;
106
106
  height: 24px;
107
107
  padding-right: 28px;
@@ -109,11 +109,11 @@ infonomic-components;
109
109
  border-radius: 4px;
110
110
  }
111
111
 
112
- .viewport-xs .select-item-indicator {
112
+ .popup-xs .select-item-indicator {
113
113
  width: 20px;
114
114
  }
115
115
 
116
- .viewport-sm .select-item {
116
+ .popup-sm .select-item {
117
117
  font-size: 0.875rem;
118
118
  height: 28px;
119
119
  padding-right: 30px;
@@ -121,13 +121,13 @@ infonomic-components;
121
121
  border-radius: 5px;
122
122
  }
123
123
 
124
- .viewport-sm .select-item-indicator {
124
+ .popup-sm .select-item-indicator {
125
125
  width: 22px;
126
126
  }
127
127
 
128
- /* .viewport-md — inherits base .select-item values */
128
+ /* .popup-md — inherits base .select-item values */
129
129
 
130
- .viewport-lg .select-item {
130
+ .popup-lg .select-item {
131
131
  font-size: 1.125rem;
132
132
  height: 34px;
133
133
  padding-right: 32px;
@@ -135,11 +135,11 @@ infonomic-components;
135
135
  border-radius: 6px;
136
136
  }
137
137
 
138
- .viewport-lg .select-item-indicator {
138
+ .popup-lg .select-item-indicator {
139
139
  width: 24px;
140
140
  }
141
141
 
142
- .viewport-xl .select-item {
142
+ .popup-xl .select-item {
143
143
  font-size: 1.25rem;
144
144
  height: 40px;
145
145
  padding-right: 36px;
@@ -147,7 +147,7 @@ infonomic-components;
147
147
  border-radius: 8px;
148
148
  }
149
149
 
150
- .viewport-xl .select-item-indicator {
150
+ .popup-xl .select-item-indicator {
151
151
  width: 28px;
152
152
  }
153
153
  }