@retray-dev/ui-kit 12.1.0 → 12.2.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 (190) hide show
  1. package/COMPONENTS.md +98 -4
  2. package/README.md +4 -4
  3. package/dist/Accordion.d.mts +6 -0
  4. package/dist/Accordion.d.ts +6 -0
  5. package/dist/Accordion.js +16 -0
  6. package/dist/Accordion.mjs +2 -2
  7. package/dist/AlertBanner.js +2 -0
  8. package/dist/AlertBanner.mjs +2 -2
  9. package/dist/AppHeader.js +2 -0
  10. package/dist/AppHeader.mjs +3 -3
  11. package/dist/Avatar.js +2 -0
  12. package/dist/Avatar.mjs +2 -2
  13. package/dist/Badge.js +2 -0
  14. package/dist/Badge.mjs +2 -2
  15. package/dist/Button.js +17 -17
  16. package/dist/Button.mjs +2 -2
  17. package/dist/Card.js +2 -0
  18. package/dist/Card.mjs +2 -2
  19. package/dist/CategoryStrip.js +2 -0
  20. package/dist/CategoryStrip.mjs +2 -2
  21. package/dist/Checkbox.js +2 -0
  22. package/dist/Checkbox.mjs +2 -2
  23. package/dist/Chip.js +2 -0
  24. package/dist/Chip.mjs +2 -2
  25. package/dist/ConfirmDialog.js +26 -20
  26. package/dist/ConfirmDialog.mjs +3 -3
  27. package/dist/CurrencyDisplay.js +2 -0
  28. package/dist/CurrencyDisplay.mjs +2 -2
  29. package/dist/CurrencyInput.js +2 -0
  30. package/dist/CurrencyInput.mjs +3 -3
  31. package/dist/DetailRow.js +2 -0
  32. package/dist/DetailRow.mjs +2 -2
  33. package/dist/EmptyState.js +17 -17
  34. package/dist/EmptyState.mjs +3 -3
  35. package/dist/ErrorBoundary.js +2 -0
  36. package/dist/ErrorBoundary.mjs +2 -2
  37. package/dist/Form.js +2 -0
  38. package/dist/Form.mjs +2 -2
  39. package/dist/IconButton.js +2 -0
  40. package/dist/IconButton.mjs +2 -2
  41. package/dist/IconPicker.js +2 -0
  42. package/dist/IconPicker.mjs +3 -3
  43. package/dist/ImageUpload.d.mts +3 -1
  44. package/dist/ImageUpload.d.ts +3 -1
  45. package/dist/ImageUpload.js +10 -3
  46. package/dist/ImageUpload.mjs +3 -3
  47. package/dist/ImageViewer.js +2 -0
  48. package/dist/ImageViewer.mjs +4 -4
  49. package/dist/Input.js +2 -0
  50. package/dist/Input.mjs +2 -2
  51. package/dist/LabelValue.js +2 -0
  52. package/dist/LabelValue.mjs +2 -2
  53. package/dist/ListGroup.js +2 -0
  54. package/dist/ListGroup.mjs +2 -2
  55. package/dist/ListItem.js +2 -0
  56. package/dist/ListItem.mjs +2 -2
  57. package/dist/MediaCard.js +2 -0
  58. package/dist/MediaCard.mjs +2 -2
  59. package/dist/MenuGroup.js +2 -0
  60. package/dist/MenuGroup.mjs +2 -2
  61. package/dist/MenuItem.js +2 -0
  62. package/dist/MenuItem.mjs +2 -2
  63. package/dist/MonthPicker.js +2 -0
  64. package/dist/MonthPicker.mjs +2 -2
  65. package/dist/NumberStepper.js +2 -0
  66. package/dist/NumberStepper.mjs +2 -2
  67. package/dist/PagerDots.js +2 -0
  68. package/dist/PagerDots.mjs +2 -2
  69. package/dist/PricingCard.js +17 -17
  70. package/dist/PricingCard.mjs +4 -4
  71. package/dist/Progress.js +2 -0
  72. package/dist/Progress.mjs +2 -2
  73. package/dist/RadioGroup.js +2 -0
  74. package/dist/RadioGroup.mjs +2 -2
  75. package/dist/RetrayProvider.d.mts +1 -1
  76. package/dist/RetrayProvider.d.ts +1 -1
  77. package/dist/RetrayProvider.js +2 -0
  78. package/dist/RetrayProvider.mjs +3 -3
  79. package/dist/Select.js +2 -0
  80. package/dist/Select.mjs +2 -2
  81. package/dist/SelectableCard.d.mts +27 -0
  82. package/dist/SelectableCard.d.ts +27 -0
  83. package/dist/SelectableCard.js +511 -0
  84. package/dist/SelectableCard.mjs +8 -0
  85. package/dist/SelectableGrid.js +2 -0
  86. package/dist/SelectableGrid.mjs +2 -2
  87. package/dist/Separator.js +2 -0
  88. package/dist/Separator.mjs +2 -2
  89. package/dist/Sheet.js +11 -3
  90. package/dist/Sheet.mjs +2 -2
  91. package/dist/SheetSelect.js +2 -0
  92. package/dist/SheetSelect.mjs +2 -2
  93. package/dist/Skeleton.d.mts +3 -1
  94. package/dist/Skeleton.d.ts +3 -1
  95. package/dist/Skeleton.js +5 -2
  96. package/dist/Skeleton.mjs +2 -2
  97. package/dist/Slider.js +2 -0
  98. package/dist/Slider.mjs +2 -2
  99. package/dist/Spinner.js +2 -0
  100. package/dist/Spinner.mjs +2 -2
  101. package/dist/Stats.d.mts +4 -1
  102. package/dist/Stats.d.ts +4 -1
  103. package/dist/Stats.js +27 -3
  104. package/dist/Stats.mjs +2 -2
  105. package/dist/Switch.js +2 -0
  106. package/dist/Switch.mjs +2 -2
  107. package/dist/TabBar.js +2 -0
  108. package/dist/TabBar.mjs +2 -2
  109. package/dist/Tabs.js +2 -0
  110. package/dist/Tabs.mjs +2 -2
  111. package/dist/Text.js +2 -0
  112. package/dist/Text.mjs +2 -2
  113. package/dist/Textarea.js +2 -0
  114. package/dist/Textarea.mjs +2 -2
  115. package/dist/Toast.js +2 -0
  116. package/dist/Toast.mjs +2 -2
  117. package/dist/Toggle.js +2 -0
  118. package/dist/Toggle.mjs +2 -2
  119. package/dist/{chunk-JNVAIDLK.mjs → chunk-2BA3JMKK.mjs} +1 -1
  120. package/dist/{chunk-X26S5EVZ.mjs → chunk-2HFD4IHU.mjs} +1 -1
  121. package/dist/{chunk-ZHMSAYLT.mjs → chunk-2LG326TT.mjs} +1 -1
  122. package/dist/chunk-2P2CB235.mjs +236 -0
  123. package/dist/{chunk-MYZ2EDYU.mjs → chunk-3XCFYSX4.mjs} +1 -1
  124. package/dist/{chunk-DOGIPOF5.mjs → chunk-4J2PXL36.mjs} +16 -18
  125. package/dist/{chunk-V6NFJXKO.mjs → chunk-4OORJ2DY.mjs} +1 -1
  126. package/dist/{chunk-5OLNXP3S.mjs → chunk-4XOB5TTD.mjs} +26 -4
  127. package/dist/{chunk-P64WHW4A.mjs → chunk-57V2LXCK.mjs} +1 -1
  128. package/dist/{chunk-HJ46DTJE.mjs → chunk-7AFZWSCI.mjs} +1 -1
  129. package/dist/{chunk-AQEVCEXV.mjs → chunk-7ELGZ66G.mjs} +1 -1
  130. package/dist/{chunk-I4V5XZPS.mjs → chunk-AENAVIKT.mjs} +1 -1
  131. package/dist/{chunk-2CBQKU7H.mjs → chunk-BXF4AMHY.mjs} +1 -1
  132. package/dist/{chunk-JULSIZDM.mjs → chunk-C43HRKXH.mjs} +1 -1
  133. package/dist/{chunk-GK4VRMNE.mjs → chunk-CF27NBXO.mjs} +11 -6
  134. package/dist/{chunk-PGERH3P7.mjs → chunk-DF7JA72E.mjs} +1 -1
  135. package/dist/{chunk-F4V6XLP4.mjs → chunk-E5UKLSJZ.mjs} +3 -3
  136. package/dist/{chunk-FUVYSVGR.mjs → chunk-EDLCGYIO.mjs} +1 -1
  137. package/dist/{chunk-N4ZPVCJH.mjs → chunk-ELGEOM7I.mjs} +1 -1
  138. package/dist/{chunk-FA2KMTH5.mjs → chunk-F3YTWO3T.mjs} +1 -1
  139. package/dist/{chunk-3UYAZ7I4.mjs → chunk-GH67YXG6.mjs} +1 -1
  140. package/dist/{chunk-357YO24D.mjs → chunk-GUTDFUNF.mjs} +1 -1
  141. package/dist/{chunk-7HSILTC4.mjs → chunk-HC4VVCWY.mjs} +2 -2
  142. package/dist/{chunk-WOEWGSTU.mjs → chunk-HEDQPK4I.mjs} +1 -1
  143. package/dist/{chunk-3GEYJ7I5.mjs → chunk-IVSRW4HS.mjs} +1 -1
  144. package/dist/{chunk-P73V2EKS.mjs → chunk-KSUWPU2F.mjs} +1 -1
  145. package/dist/{chunk-BCWEHE34.mjs → chunk-LIS6I5UP.mjs} +1 -1
  146. package/dist/{chunk-J6Q2YJEV.mjs → chunk-LNPKGWBG.mjs} +1 -1
  147. package/dist/{chunk-DF6DU42P.mjs → chunk-LOBLCFMN.mjs} +1 -1
  148. package/dist/{chunk-2A2LEFZG.mjs → chunk-LPV4NJJK.mjs} +2 -2
  149. package/dist/{chunk-FFTYLPSB.mjs → chunk-M3C7XM2M.mjs} +11 -5
  150. package/dist/{chunk-BQZE3HAW.mjs → chunk-MEPSKGBO.mjs} +1 -1
  151. package/dist/{chunk-ISY26JQJ.mjs → chunk-MVMGPZN6.mjs} +2 -2
  152. package/dist/{chunk-265G6A46.mjs → chunk-NHDI3VQB.mjs} +15 -1
  153. package/dist/{chunk-D3Y2T42P.mjs → chunk-NJG7DHVF.mjs} +1 -1
  154. package/dist/{chunk-LRM4AVYY.mjs → chunk-NLZY4TXU.mjs} +1 -1
  155. package/dist/{chunk-OULVKTWL.mjs → chunk-OLVJFKXS.mjs} +1 -1
  156. package/dist/{chunk-BOVUP27T.mjs → chunk-QDAZGZUF.mjs} +4 -3
  157. package/dist/{chunk-S3KJCPEJ.mjs → chunk-QOLWA2PW.mjs} +1 -1
  158. package/dist/{chunk-JCZQOY4O.mjs → chunk-QXDGGOLC.mjs} +12 -6
  159. package/dist/{chunk-4WFMPFZB.mjs → chunk-RJNLAH76.mjs} +1 -1
  160. package/dist/{chunk-HLMPMUK2.mjs → chunk-RMRS44MQ.mjs} +1 -1
  161. package/dist/{chunk-KHYX4IOM.mjs → chunk-SAWUXP3A.mjs} +2 -2
  162. package/dist/{chunk-2I2AYECM.mjs → chunk-TS7DGUIR.mjs} +1 -1
  163. package/dist/{chunk-3N2M3WZL.mjs → chunk-UBUXUMER.mjs} +1 -1
  164. package/dist/{chunk-AKM4EPOT.mjs → chunk-ULGNQPNE.mjs} +1 -1
  165. package/dist/{chunk-FVTVCJAH.mjs → chunk-UNNRUJTM.mjs} +1 -1
  166. package/dist/{chunk-DI7CBDL6.mjs → chunk-UQ4742ET.mjs} +1 -1
  167. package/dist/{chunk-EFLFRAHD.mjs → chunk-VJBUCITV.mjs} +1 -1
  168. package/dist/{chunk-QSFV2P7O.mjs → chunk-YMYIEVZP.mjs} +1 -1
  169. package/dist/{chunk-EMUWGDWC.mjs → chunk-YTXRIXNZ.mjs} +2 -0
  170. package/dist/{chunk-XBAGGKLW.mjs → chunk-ZIMY2QUM.mjs} +2 -2
  171. package/dist/{chunk-NXI4YDZ2.mjs → chunk-ZR6HSEAB.mjs} +1 -1
  172. package/dist/{index-wt-orHUi.d.ts → index-CY34hxPN.d.mts} +1 -0
  173. package/dist/{index-wt-orHUi.d.mts → index-CY34hxPN.d.ts} +1 -0
  174. package/dist/index.d.mts +3 -2
  175. package/dist/index.d.ts +3 -2
  176. package/dist/index.js +733 -453
  177. package/dist/index.mjs +53 -52
  178. package/package.json +1 -1
  179. package/src/components/Accordion/Accordion.tsx +20 -0
  180. package/src/components/Button/Button.tsx +29 -26
  181. package/src/components/ConfirmDialog/ConfirmDialog.tsx +10 -3
  182. package/src/components/ImageUpload/ImageUpload.tsx +10 -3
  183. package/src/components/SelectableCard/SelectableCard.tsx +304 -0
  184. package/src/components/SelectableCard/index.ts +1 -0
  185. package/src/components/Sheet/Sheet.tsx +10 -3
  186. package/src/components/Skeleton/Skeleton.tsx +5 -2
  187. package/src/components/Stats/Stats.tsx +35 -7
  188. package/src/index.ts +1 -0
  189. package/src/theme/colors.ts +7 -0
  190. package/src/theme/types.ts +4 -1
package/COMPONENTS.md CHANGED
@@ -275,8 +275,9 @@ The full palette components consume. Never supply these directly — they are co
275
275
  |-------|-------------|---------|
276
276
  | `foregroundSubtle` | `foreground` @ ~70% | Body text, subtitles, secondary content |
277
277
  | `foregroundMuted` | `foreground` @ ~62% | Captions, timestamps, placeholders |
278
- | `surface` | `background` slightly off-canvas | Chip backgrounds, input fills, tag backgrounds, skeleton |
278
+ | `surface` | `background` slightly off-canvas | Chip backgrounds, input fills, tag backgrounds |
279
279
  | `surfaceStrong` | `background` stronger offset | Pressed/hover fill states |
280
+ | `skeleton` | `background` @ ±10% | Skeleton placeholder — higher contrast than surface for visibility |
280
281
  | `destructiveTint` | `destructive` blended to bg | Alert banner background, toast background |
281
282
  | `destructiveBorder` | `destructive` @ 30% | Alert banner border, badge outline |
282
283
  | `successTint` | `success` blended to bg | Success banner background |
@@ -285,6 +286,7 @@ The full palette components consume. Never supply these directly — they are co
285
286
  | `warningBorder` | `warning` @ 30% | Warning banner border |
286
287
  | `ring` | `= primary` | Focus ring color (always matches primary) |
287
288
  | `input` | `= border` | Input field border (always matches border) |
289
+ | `separator` | `border` @ ±16-22% | Divider/separator line — deliberately darker than border |
288
290
  | `overlay` | `overlay` token or `rgba(0,0,0,0.45)` | Backdrop behind sheets and dialogs |
289
291
  | `accentResolved` | `accent` token or `= primary` | Resolved accent color — always present |
290
292
  | `accentForegroundResolved` | `accentForeground` token or `= primaryForeground` | Resolved text on accent — always present |
@@ -312,7 +314,7 @@ const { colors } = useTheme()
312
314
  import { deriveColors } from '@retray-dev/ui-kit'
313
315
 
314
316
  const resolved = deriveColors(myThemeColors, 'light')
315
- // resolved contains all 24 ResolvedColors tokens
317
+ // resolved contains all 26 ResolvedColors tokens
316
318
  ```
317
319
 
318
320
  ---
@@ -917,7 +919,7 @@ No consumer action required — the fix is internal.
917
919
  | size | `'sm' \| 'md' \| 'lg'` | `'md'` | Controls height, padding, and icon size |
918
920
  | loading | `boolean` | `false` | Replaces label with spinner, forces disabled state |
919
921
  | fullWidth | `boolean` | `false` | Stretches to container width (`alignSelf: 'stretch'`) |
920
- | disabled | `boolean` | — | Reduces opacity to 0.5 |
922
+ | disabled | `boolean` | — | Per-variant explicit colors (no opacity). `filled`→`surface` bg, `secondary`→`border` border, `text`/`outline`→`foregroundMuted` text |
921
923
  | icon | `React.ReactNode \| ((props: { label, size, variant }) => React.ReactNode)` | — | Icon rendered alongside label |
922
924
  | iconName | `string` | — | Icon name from `@expo/vector-icons`. Takes precedence over `icon` |
923
925
  | iconColor | `string` | — | Override icon color. Defaults to variant label color |
@@ -1902,6 +1904,7 @@ const renderItem = useCallback(({ item }) => (
1902
1904
  | width | `number \| string` | `'100%'` | Width of placeholder |
1903
1905
  | height | `number` | `16` | Height of placeholder |
1904
1906
  | borderRadius | `number` | `6` | Corner radius |
1907
+ | backgroundColor | `string` | `colors.skeleton` | Override placeholder background color |
1905
1908
  | preset | `'base' \| 'circle' \| 'text'` | `'base'` | Convenience preset |
1906
1909
  | diameter | `number` | `40` | Used by `'circle'` preset — overrides width/height |
1907
1910
  | style | `ViewStyle` | — | — |
@@ -2349,6 +2352,94 @@ const [accepted, setAccepted] = useState(false)
2349
2352
 
2350
2353
  ---
2351
2354
 
2355
+ ### SelectableCard
2356
+
2357
+ **Import:** `import { SelectableCard, SelectableCardGroup } from '@retray-dev/ui-kit'`
2358
+
2359
+ **When to use:** Selectable cards with radio (single-select) or checkbox (multi-select) behavior. Each card supports an icon, title, description, and disabled state. Perfect for role selectors, plan pickers, feature/module configuration — anywhere you need descriptive options that communicate more than a simple label.
2360
+
2361
+ | Prop | Type | Default | Notes |
2362
+ |------|------|---------|-------|
2363
+ | value | `string` | required | The value this card represents |
2364
+ | title | `string` | required | Card title |
2365
+ | description | `string` | — | Secondary text below title |
2366
+ | iconName | `string` | — | Left icon from @expo/vector-icons |
2367
+ | icon | `ReactNode` | — | Custom left icon |
2368
+ | disabled | `boolean` | `false` | Grayed out, no press/haptic |
2369
+ | style | `ViewStyle` | — | — |
2370
+
2371
+ **SelectableCardGroup Props:**
2372
+
2373
+ | Prop | Type | Default | Notes |
2374
+ |------|------|---------|-------|
2375
+ | type | `'radio' \| 'checkbox'` | `'radio'` | Selection mode |
2376
+ | value | `string \| string[]` | required | Selected value(s) |
2377
+ | onValueChange | `(value: string \| string[]) => void` | required | — |
2378
+ | variant | `'elevated' \| 'outlined' \| 'filled'` | `'elevated'` | Card surface |
2379
+ | gap | `number` | `s(8)` | Spacing between cards |
2380
+ | style | `ViewStyle` | — | — |
2381
+
2382
+ **Card variants:** `elevated` (shadow depth, 2px border matches background when unselected — no layout shift on select), `outlined` (2px border), `filled` (surfaceStrong background + 2px border). All variants use a consistent 2px border width so cards don't resize when selected.
2383
+
2384
+ **Selection visual:** Selected cards get a 2px `colors.primary` border + `EaseView` animated selector indicator. Radio shows a 24×24 circle with spring-animated inner dot. Checkbox shows a 24×24 box with opacity-animated checkmark. Both follow the same visual patterns as `RadioGroup` and `Checkbox`.
2385
+
2386
+ **Haptics:** `impactLight` on selection.
2387
+
2388
+ **Disabled:** Dims content to `foregroundMuted`, removes shadow/elevation, keeps border at `colors.border`. No press, no haptic.
2389
+
2390
+ **Examples:**
2391
+ ```tsx
2392
+ // Single select (radio)
2393
+ <SelectableCardGroup
2394
+ type="radio"
2395
+ value={selectedRole}
2396
+ onValueChange={setSelectedRole}
2397
+ >
2398
+ <SelectableCard
2399
+ value="admin"
2400
+ iconName="shield"
2401
+ title="Administrator"
2402
+ description="Full access to reports, settings, and business management"
2403
+ />
2404
+ <SelectableCard
2405
+ value="waiter"
2406
+ iconName="user-check"
2407
+ title="Waiter"
2408
+ description="Take orders from tables and manage requests"
2409
+ />
2410
+ <SelectableCard
2411
+ value="cook"
2412
+ iconName="chef-hat"
2413
+ title="Cook"
2414
+ description="Receive and prepare items from each order in the kitchen"
2415
+ disabled
2416
+ />
2417
+ </SelectableCardGroup>
2418
+
2419
+ // Multi select (checkbox)
2420
+ <SelectableCardGroup
2421
+ type="checkbox"
2422
+ value={selectedRoles}
2423
+ onValueChange={setSelectedRoles}
2424
+ variant="outlined"
2425
+ >
2426
+ <SelectableCard
2427
+ value="reports"
2428
+ iconName="bar-chart-2"
2429
+ title="Reports"
2430
+ description="View sales, inventory, and performance analytics"
2431
+ />
2432
+ <SelectableCard
2433
+ value="inventory"
2434
+ iconName="package"
2435
+ title="Inventory"
2436
+ description="Manage stock levels and supplier orders"
2437
+ />
2438
+ </SelectableCardGroup>
2439
+ ```
2440
+
2441
+ ---
2442
+
2352
2443
  ### Slider
2353
2444
 
2354
2445
  **Import:** `import { Slider } from '@retray-dev/ui-kit'`
@@ -2510,6 +2601,7 @@ const [tab, setTab] = useState('profile')
2510
2601
  iconName?: string // Icon name from @expo/vector-icons
2511
2602
  icon?: ReactNode // Custom icon node
2512
2603
  iconColor?: string // Override icon color (defaults to foregroundMuted)
2604
+ triggerActions?: ReactNode // Action buttons rendered between trigger and chevron. Touch-isolated — taps on actions won't toggle the accordion.
2513
2605
  }
2514
2606
  ```
2515
2607
 
@@ -3980,12 +4072,13 @@ export default function TabLayout() {
3980
4072
  | icon | `React.ReactNode` | — | Custom icon node |
3981
4073
  | iconName | `string` | — | Icon from `@expo/vector-icons` (left of value, `colors.primary`) |
3982
4074
  | iconColor | `string` | `colors.primary` | Override icon color |
4075
+ | size | `'default' \| 'compact'` | `'default'` | `compact`: 16px SemiBold value, 11px label, reduced padding |
3983
4076
  | variant | `'elevated' \| 'outlined' \| 'filled'` | `'elevated'` | Card surface variant |
3984
4077
  | onPress | `() => void` | — | Makes the card pressable (haptic `impactLight()`) |
3985
4078
  | style | `ViewStyle` | — | — |
3986
4079
  | accessibilityLabel | `string` | — | — |
3987
4080
 
3988
- **Design notes:** Value uses `Sohne-Bold` at 28px. Label uses `Sohne-Regular` at 13px in `foregroundSubtle`. Description uses `Sohne-Regular` at 12px in `foregroundMuted`. Icon renders at 22px, left-aligned with the value. All content is centered vertically and horizontally. The card shrinks to fit its content by default (`alignSelf: 'flex-start'`). When placed inside `Stats.Group`, cards stretch to equal width. When the card is narrow (< 150dp) and has an icon, the layout switches to vertical stacking (icon → value → label → description) to avoid overflow.
4081
+ **Design notes:** Value uses `Sohne-Bold` at 21px. Label uses `Sohne-Regular` at 13px in `foregroundSubtle`. Description uses `Sohne-Regular` at 12px in `foregroundMuted`. Icon renders at 20px, left-aligned with the value. All content is centered vertically and horizontally. The card shrinks to fit its content by default (`alignSelf: 'flex-start'`). When placed inside `Stats.Group`, cards stretch to equal width. When the card is narrow (< 150dp) and has an icon, the layout switches to vertical stacking (icon → value → label → description) to avoid overflow.
3989
4082
 
3990
4083
  **`Stats.Group`** — horizontal layout wrapper that distributes children equally:
3991
4084
 
@@ -4237,6 +4330,7 @@ import { HolographicCard, FOIL_PRESETS } from '@retray-dev/ui-kit/HolographicCar
4237
4330
  | borderRadius | `number` | `RADIUS.lg` | — |
4238
4331
  | resizeMode | `'cover' \| 'contain' \| 'stretch'` | `'cover'` | Image resize mode |
4239
4332
  | disabled | `boolean` | `false` | Prevents pressing |
4333
+ | allowsEditing | `boolean` | `true` | When `true`, iOS opens the crop/editing screen after selecting an image. Set `false` to accept the image directly without cropping |
4240
4334
  | style | `ViewStyle` | — | — |
4241
4335
  | accessibilityLabel | `string` | — | — |
4242
4336
 
package/README.md CHANGED
@@ -2,8 +2,8 @@
2
2
 
3
3
  A personal React Native / Expo UI component library with a built-in design system, dark mode support, haptic feedback, and smooth animations.
4
4
 
5
- - 54 components across 9 categories (plus the deep-import `HolographicCard`)
6
- - Light/dark theme with 12 public tokens (25 resolved) and full customization
5
+ - 55 components across 9 categories (plus the deep-import `HolographicCard`)
6
+ - Light/dark theme with 12 public tokens (26 resolved) and full customization
7
7
  - Apple HIG–compliant touch targets and haptic feedback
8
8
  - Animated interactions: spring press, sliding tabs, accordion easing, animated progress
9
9
  - Built with TypeScript — full type declarations included
@@ -156,7 +156,7 @@ const { colors, colorScheme } = useTheme()
156
156
 
157
157
  **Public tokens (12 — override these):** `background`, `foreground`, `card`, `primary`, `primaryForeground`, `border`, `destructive`, `destructiveForeground`, `success`, `successForeground`, `warning`, `warningForeground`. Optional: `overlay`, `accent`, `accentForeground`.
158
158
 
159
- **Derived tokens (read-only via `useTheme()`):** `foregroundSubtle`, `foregroundMuted`, `surface`, `surfaceStrong`, `destructiveTint`, `destructiveBorder`, `successTint`, `successBorder`, `warningTint`, `warningBorder`, `ring`, `input`, `separator`, `overlay`, `accentResolved`, `accentForegroundResolved`
159
+ **Derived tokens (read-only via `useTheme()`):** `foregroundSubtle`, `foregroundMuted`, `surface`, `surfaceStrong`, `skeleton`, `destructiveTint`, `destructiveBorder`, `successTint`, `successBorder`, `warningTint`, `warningBorder`, `ring`, `input`, `separator`, `overlay`, `accentResolved`, `accentForegroundResolved`
160
160
 
161
161
  ## Design Tokens
162
162
 
@@ -187,7 +187,7 @@ import { SPACING, ICON_SIZES, RADIUS, SHADOWS, BREAKPOINTS, TYPOGRAPHY } from '@
187
187
  | ----------- | ----------------------------------------------------------------------------------------------- |
188
188
  | Display | `Text`, `Badge`, `Avatar`, `Separator`, `Spinner`, `Skeleton`, `Progress`, `CurrencyDisplay`, `Stats` |
189
189
  | Surfaces | `Card`, `AlertBanner`, `EmptyState`, `MediaCard`, `PricingCard` |
190
- | Form | `Form` (+ `Form.Field` / `Form.Section` / `Form.Footer`), `Button`, `ButtonGroup`, `IconButton`, `Input`, `CurrencyInput`, `Textarea`, `Checkbox`, `Switch`, `Toggle`, `RadioGroup`, `Select`, `Slider`, `SelectableGrid`, `SheetSelect`, `ImageUpload`, `IconPicker`, `NumberStepper` |
190
+ | Form | `Form` (+ `Form.Field` / `Form.Section` / `Form.Footer`), `Button`, `ButtonGroup`, `IconButton`, `Input`, `CurrencyInput`, `Textarea`, `Checkbox`, `Switch`, `Toggle`, `RadioGroup`, `Select`, `Slider`, `SelectableGrid`, `SelectableCard` (+ `SelectableCardGroup`), `SheetSelect`, `ImageUpload`, `IconPicker`, `NumberStepper` |
191
191
  | Composition | `Tabs`, `Accordion` |
192
192
  | Navigation | `AppHeader`, `TabBar`, `PagerDots` |
193
193
  | Overlays | `Sheet`, `ConfirmDialog`, `ImageViewer` |
@@ -11,6 +11,12 @@ interface AccordionItem {
11
11
  icon?: React.ReactNode;
12
12
  /** Override icon color. Defaults to foregroundMuted. */
13
13
  iconColor?: string;
14
+ /**
15
+ * Action buttons rendered after the trigger content but before the chevron.
16
+ * Automatically touch-isolated — taps on actions won't toggle the accordion.
17
+ * Use this instead of embedding interactive elements inside `trigger`.
18
+ */
19
+ triggerActions?: React.ReactNode;
14
20
  }
15
21
  interface AccordionProps {
16
22
  items: AccordionItem[];
@@ -11,6 +11,12 @@ interface AccordionItem {
11
11
  icon?: React.ReactNode;
12
12
  /** Override icon color. Defaults to foregroundMuted. */
13
13
  iconColor?: string;
14
+ /**
15
+ * Action buttons rendered after the trigger content but before the chevron.
16
+ * Automatically touch-isolated — taps on actions won't toggle the accordion.
17
+ * Use this instead of embedding interactive elements inside `trigger`.
18
+ */
19
+ triggerActions?: React.ReactNode;
14
20
  }
15
21
  interface AccordionProps {
16
22
  items: AccordionItem[];
package/dist/Accordion.js CHANGED
@@ -163,6 +163,7 @@ function deriveColors(t, scheme) {
163
163
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
164
164
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
165
165
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
166
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
166
167
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
167
168
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
168
169
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -175,6 +176,7 @@ function deriveColors(t, scheme) {
175
176
  foregroundMuted,
176
177
  surface,
177
178
  surfaceStrong,
179
+ skeleton,
178
180
  destructiveTint,
179
181
  destructiveBorder,
180
182
  successTint,
@@ -305,6 +307,14 @@ function AccordionItemComponent({
305
307
  accessibilityLabel: typeof item.trigger === "string" ? item.trigger : void 0
306
308
  },
307
309
  /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.triggerContent }, resolvedIcon ? /* @__PURE__ */ React3__default.default.createElement(reactNative.View, { style: styles.icon }, resolvedIcon) : null, typeof item.trigger === "string" ? /* @__PURE__ */ React3__default.default.createElement(reactNative.Text, { style: [styles.triggerText, { color: colors.foreground }], allowFontScaling: true }, item.trigger) : item.trigger),
310
+ item.triggerActions ? /* @__PURE__ */ React3__default.default.createElement(
311
+ reactNative.View,
312
+ {
313
+ style: styles.triggerActions,
314
+ onTouchEnd: (e) => e.stopPropagation()
315
+ },
316
+ item.triggerActions
317
+ ) : null,
308
318
  /* @__PURE__ */ React3__default.default.createElement(Animated__default.default.View, { style: [styles.chevron, rotationStyle] }, /* @__PURE__ */ React3__default.default.createElement(vectorIcons.Entypo, { name: "chevron-down", size: 18, color: colors.foregroundMuted }))
309
319
  ), /* @__PURE__ */ React3__default.default.createElement(Animated__default.default.View, { style: bodyStyle }, /* @__PURE__ */ React3__default.default.createElement(
310
320
  reactNative.View,
@@ -374,6 +384,12 @@ var styles = reactNative.StyleSheet.create({
374
384
  chevron: {
375
385
  marginLeft: s(8)
376
386
  },
387
+ triggerActions: {
388
+ flexDirection: "row",
389
+ alignItems: "center",
390
+ gap: s(4),
391
+ marginLeft: s(8)
392
+ },
377
393
  // position:'absolute' is the key — the inner View escapes the animated wrapper's
378
394
  // clipped height so onLayout always reports the true content height.
379
395
  content: {
@@ -1,7 +1,7 @@
1
- export { Accordion } from './chunk-265G6A46.mjs';
1
+ export { Accordion } from './chunk-NHDI3VQB.mjs';
2
2
  import './chunk-EJ7ZPXOH.mjs';
3
3
  import './chunk-DVK4G2GT.mjs';
4
4
  import './chunk-KA7LTET3.mjs';
5
- import './chunk-EMUWGDWC.mjs';
5
+ import './chunk-YTXRIXNZ.mjs';
6
6
  import './chunk-2CE3TQVY.mjs';
7
7
  import './chunk-Y6FXYEAI.mjs';
@@ -102,6 +102,7 @@ function deriveColors(t, scheme) {
102
102
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
103
103
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
104
104
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
105
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
105
106
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
106
107
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
107
108
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -114,6 +115,7 @@ function deriveColors(t, scheme) {
114
115
  foregroundMuted,
115
116
  surface,
116
117
  surfaceStrong,
118
+ skeleton,
117
119
  destructiveTint,
118
120
  destructiveBorder,
119
121
  successTint,
@@ -1,6 +1,6 @@
1
- export { AlertBanner } from './chunk-V6NFJXKO.mjs';
1
+ export { AlertBanner } from './chunk-4OORJ2DY.mjs';
2
2
  import './chunk-QY3X2UYR.mjs';
3
3
  import './chunk-KA7LTET3.mjs';
4
- import './chunk-EMUWGDWC.mjs';
4
+ import './chunk-YTXRIXNZ.mjs';
5
5
  import './chunk-2CE3TQVY.mjs';
6
6
  import './chunk-Y6FXYEAI.mjs';
package/dist/AppHeader.js CHANGED
@@ -109,6 +109,7 @@ function deriveColors(t, scheme) {
109
109
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
110
110
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
111
111
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
112
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
112
113
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
113
114
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
114
115
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -121,6 +122,7 @@ function deriveColors(t, scheme) {
121
122
  foregroundMuted,
122
123
  surface,
123
124
  surfaceStrong,
125
+ skeleton,
124
126
  destructiveTint,
125
127
  destructiveBorder,
126
128
  successTint,
@@ -1,10 +1,10 @@
1
- export { AppHeader } from './chunk-ISY26JQJ.mjs';
2
- import './chunk-DF6DU42P.mjs';
1
+ export { AppHeader } from './chunk-MVMGPZN6.mjs';
2
+ import './chunk-LOBLCFMN.mjs';
3
3
  import './chunk-3DKJ2GIC.mjs';
4
4
  import './chunk-EJ7ZPXOH.mjs';
5
5
  import './chunk-DVK4G2GT.mjs';
6
6
  import './chunk-QY3X2UYR.mjs';
7
7
  import './chunk-KA7LTET3.mjs';
8
- import './chunk-EMUWGDWC.mjs';
8
+ import './chunk-YTXRIXNZ.mjs';
9
9
  import './chunk-2CE3TQVY.mjs';
10
10
  import './chunk-Y6FXYEAI.mjs';
package/dist/Avatar.js CHANGED
@@ -89,6 +89,7 @@ function deriveColors(t, scheme) {
89
89
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
90
90
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
91
91
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
92
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
92
93
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
93
94
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
94
95
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -101,6 +102,7 @@ function deriveColors(t, scheme) {
101
102
  foregroundMuted,
102
103
  surface,
103
104
  surfaceStrong,
105
+ skeleton,
104
106
  destructiveTint,
105
107
  destructiveBorder,
106
108
  successTint,
package/dist/Avatar.mjs CHANGED
@@ -1,4 +1,4 @@
1
- export { Avatar } from './chunk-S3KJCPEJ.mjs';
2
- import './chunk-EMUWGDWC.mjs';
1
+ export { Avatar } from './chunk-QOLWA2PW.mjs';
2
+ import './chunk-YTXRIXNZ.mjs';
3
3
  import './chunk-2CE3TQVY.mjs';
4
4
  import './chunk-Y6FXYEAI.mjs';
package/dist/Badge.js CHANGED
@@ -101,6 +101,7 @@ function deriveColors(t, scheme) {
101
101
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
102
102
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
103
103
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
104
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
104
105
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
105
106
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
106
107
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -113,6 +114,7 @@ function deriveColors(t, scheme) {
113
114
  foregroundMuted,
114
115
  surface,
115
116
  surfaceStrong,
117
+ skeleton,
116
118
  destructiveTint,
117
119
  destructiveBorder,
118
120
  successTint,
package/dist/Badge.mjs CHANGED
@@ -1,5 +1,5 @@
1
- export { Badge } from './chunk-3UYAZ7I4.mjs';
1
+ export { Badge } from './chunk-GH67YXG6.mjs';
2
2
  import './chunk-KA7LTET3.mjs';
3
- import './chunk-EMUWGDWC.mjs';
3
+ import './chunk-YTXRIXNZ.mjs';
4
4
  import './chunk-2CE3TQVY.mjs';
5
5
  import './chunk-Y6FXYEAI.mjs';
package/dist/Button.js CHANGED
@@ -162,6 +162,7 @@ function deriveColors(t, scheme) {
162
162
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
163
163
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
164
164
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
165
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
165
166
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
166
167
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
167
168
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -174,6 +175,7 @@ function deriveColors(t, scheme) {
174
175
  foregroundMuted,
175
176
  surface,
176
177
  surfaceStrong,
178
+ skeleton,
177
179
  destructiveTint,
178
180
  destructiveBorder,
179
181
  successTint,
@@ -342,24 +344,26 @@ function ButtonBase({
342
344
  impactMedium();
343
345
  onPress?.();
344
346
  };
345
- const containerVariantStyle = {
347
+ const containerVariantStyle = isDisabled ? {
348
+ primary: { backgroundColor: colors.surface },
349
+ secondary: { backgroundColor: "transparent", borderWidth: 1.5, borderColor: colors.border },
350
+ text: { backgroundColor: "transparent" },
351
+ destructive: { backgroundColor: colors.surface }
352
+ }[variant] : {
346
353
  primary: { backgroundColor: colors.primary },
347
354
  secondary: { backgroundColor: "transparent", borderWidth: 1.5, borderColor: colors.primary },
348
355
  text: { backgroundColor: "transparent" },
349
356
  destructive: { backgroundColor: colors.destructive }
350
357
  }[variant];
351
- const labelVariantStyle = {
352
- primary: { color: colors.primaryForeground },
353
- secondary: { color: colors.primary },
354
- // AUDIT FIX: was colors.foreground — visually indistinguishable from plain text,
355
- // no affordance that it's a CTA. Now uses accentResolved so text-only buttons
356
- // carry the brand voltage. Falls back to primary when no accent is defined.
357
- text: { color: colors.accentResolved },
358
- destructive: { color: colors.destructiveForeground }
358
+ const labelColor = isDisabled ? colors.foregroundMuted : {
359
+ primary: colors.primaryForeground,
360
+ secondary: colors.primary,
361
+ text: colors.accentResolved,
362
+ destructive: colors.destructiveForeground
359
363
  }[variant];
360
- const textColor = iconColor ?? labelVariantStyle.color;
364
+ const textColor = iconColor ?? labelColor;
361
365
  const effectiveIcon = iconName ? renderIcon(iconName, iconSizeMap[size], textColor) : typeof icon === "function" ? icon({ label, size, variant, color: textColor }) : icon;
362
- const spinnerColor = variant === "destructive" ? colors.destructiveForeground : variant === "primary" ? colors.primaryForeground : colors.accentResolved;
366
+ const spinnerColor = isDisabled ? colors.foregroundMuted : variant === "destructive" ? colors.destructiveForeground : variant === "primary" ? colors.primaryForeground : colors.accentResolved;
363
367
  const styleArray = Array.isArray(style) ? style : style ? [style] : [];
364
368
  const flatStyle = reactNative.StyleSheet.flatten(styleArray);
365
369
  const { flex, ...restStyle } = flatStyle || {};
@@ -371,7 +375,6 @@ function ButtonBase({
371
375
  containerVariantStyle,
372
376
  containerSizeStyles[size],
373
377
  fullWidth && styles.fullWidth,
374
- isDisabled && styles.disabled,
375
378
  restStyle
376
379
  ],
377
380
  enabled: !isDisabled,
@@ -387,7 +390,7 @@ function ButtonBase({
387
390
  loading ? /* @__PURE__ */ React3__default.default.createElement(React3__default.default.Fragment, null, /* @__PURE__ */ React3__default.default.createElement(reactNative.ActivityIndicator, { size: "small", color: spinnerColor, style: { marginRight: s(6) } }), /* @__PURE__ */ React3__default.default.createElement(
388
391
  reactNative.Text,
389
392
  {
390
- style: [styles.label, labelVariantStyle, labelSizeStyles[size], styles.labelLoading],
393
+ style: [styles.label, { color: labelColor }, labelSizeStyles[size], styles.labelLoading],
391
394
  allowFontScaling: true,
392
395
  numberOfLines: 1
393
396
  },
@@ -395,7 +398,7 @@ function ButtonBase({
395
398
  )) : /* @__PURE__ */ React3__default.default.createElement(React3__default.default.Fragment, null, effectiveIcon && iconPosition === "left" && /* @__PURE__ */ React3__default.default.createElement(React3__default.default.Fragment, null, effectiveIcon), /* @__PURE__ */ React3__default.default.createElement(
396
399
  reactNative.Text,
397
400
  {
398
- style: [styles.label, labelVariantStyle, labelSizeStyles[size], effectiveIcon ? styles.labelWithIcon : void 0],
401
+ style: [styles.label, { color: labelColor }, labelSizeStyles[size], effectiveIcon ? styles.labelWithIcon : void 0],
399
402
  allowFontScaling: true,
400
403
  numberOfLines: 1
401
404
  },
@@ -414,9 +417,6 @@ var styles = reactNative.StyleSheet.create({
414
417
  fullWidth: {
415
418
  width: "100%"
416
419
  },
417
- disabled: {
418
- opacity: 0.45
419
- },
420
420
  label: {
421
421
  fontFamily: "Sohne-Medium",
422
422
  flexShrink: 1
package/dist/Button.mjs CHANGED
@@ -1,9 +1,9 @@
1
- export { Button } from './chunk-DOGIPOF5.mjs';
1
+ export { Button } from './chunk-4J2PXL36.mjs';
2
2
  import './chunk-3DKJ2GIC.mjs';
3
3
  import './chunk-EJ7ZPXOH.mjs';
4
4
  import './chunk-DVK4G2GT.mjs';
5
5
  import './chunk-QY3X2UYR.mjs';
6
6
  import './chunk-KA7LTET3.mjs';
7
- import './chunk-EMUWGDWC.mjs';
7
+ import './chunk-YTXRIXNZ.mjs';
8
8
  import './chunk-2CE3TQVY.mjs';
9
9
  import './chunk-Y6FXYEAI.mjs';
package/dist/Card.js CHANGED
@@ -150,6 +150,7 @@ function deriveColors(t, scheme) {
150
150
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
151
151
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
152
152
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
153
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
153
154
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
154
155
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
155
156
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -162,6 +163,7 @@ function deriveColors(t, scheme) {
162
163
  foregroundMuted,
163
164
  surface,
164
165
  surfaceStrong,
166
+ skeleton,
165
167
  destructiveTint,
166
168
  destructiveBorder,
167
169
  successTint,
package/dist/Card.mjs CHANGED
@@ -1,8 +1,8 @@
1
- export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-2CBQKU7H.mjs';
1
+ export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from './chunk-BXF4AMHY.mjs';
2
2
  import './chunk-3DKJ2GIC.mjs';
3
3
  import './chunk-EJ7ZPXOH.mjs';
4
4
  import './chunk-DVK4G2GT.mjs';
5
5
  import './chunk-QY3X2UYR.mjs';
6
- import './chunk-EMUWGDWC.mjs';
6
+ import './chunk-YTXRIXNZ.mjs';
7
7
  import './chunk-2CE3TQVY.mjs';
8
8
  import './chunk-Y6FXYEAI.mjs';
@@ -163,6 +163,7 @@ function deriveColors(t, scheme) {
163
163
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
164
164
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
165
165
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
166
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
166
167
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
167
168
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
168
169
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -175,6 +176,7 @@ function deriveColors(t, scheme) {
175
176
  foregroundMuted,
176
177
  surface,
177
178
  surfaceStrong,
179
+ skeleton,
178
180
  destructiveTint,
179
181
  destructiveBorder,
180
182
  successTint,
@@ -1,9 +1,9 @@
1
- export { CategoryStrip } from './chunk-MYZ2EDYU.mjs';
1
+ export { CategoryStrip } from './chunk-3XCFYSX4.mjs';
2
2
  import './chunk-YNROWHQJ.mjs';
3
3
  import './chunk-EJ7ZPXOH.mjs';
4
4
  import './chunk-DVK4G2GT.mjs';
5
5
  import './chunk-QY3X2UYR.mjs';
6
6
  import './chunk-KA7LTET3.mjs';
7
- import './chunk-EMUWGDWC.mjs';
7
+ import './chunk-YTXRIXNZ.mjs';
8
8
  import './chunk-2CE3TQVY.mjs';
9
9
  import './chunk-Y6FXYEAI.mjs';
package/dist/Checkbox.js CHANGED
@@ -151,6 +151,7 @@ function deriveColors(t, scheme) {
151
151
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
152
152
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
153
153
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
154
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
154
155
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
155
156
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
156
157
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -163,6 +164,7 @@ function deriveColors(t, scheme) {
163
164
  foregroundMuted,
164
165
  surface,
165
166
  surfaceStrong,
167
+ skeleton,
166
168
  destructiveTint,
167
169
  destructiveBorder,
168
170
  successTint,
package/dist/Checkbox.mjs CHANGED
@@ -1,7 +1,7 @@
1
- export { Checkbox } from './chunk-3N2M3WZL.mjs';
1
+ export { Checkbox } from './chunk-UBUXUMER.mjs';
2
2
  import './chunk-3DKJ2GIC.mjs';
3
3
  import './chunk-EJ7ZPXOH.mjs';
4
4
  import './chunk-DVK4G2GT.mjs';
5
- import './chunk-EMUWGDWC.mjs';
5
+ import './chunk-YTXRIXNZ.mjs';
6
6
  import './chunk-2CE3TQVY.mjs';
7
7
  import './chunk-Y6FXYEAI.mjs';
package/dist/Chip.js CHANGED
@@ -163,6 +163,7 @@ function deriveColors(t, scheme) {
163
163
  const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
164
164
  const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
165
165
  const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
166
+ const skeleton = dark ? lighten(bg, -0.1) : darken(bg, 0.1);
166
167
  const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
167
168
  const destructiveBorder = dark ? withAlphaOnDark(t.destructive, 0.45, bg) : withAlphaOnWhite(t.destructive, 0.3);
168
169
  const successTint = dark ? withAlphaOnDark(t.success, 0.15, bg) : withAlphaOnWhite(t.success, 0.08);
@@ -175,6 +176,7 @@ function deriveColors(t, scheme) {
175
176
  foregroundMuted,
176
177
  surface,
177
178
  surfaceStrong,
179
+ skeleton,
178
180
  destructiveTint,
179
181
  destructiveBorder,
180
182
  successTint,
package/dist/Chip.mjs CHANGED
@@ -1,8 +1,8 @@
1
- export { Chip, ChipGroup } from './chunk-FA2KMTH5.mjs';
1
+ export { Chip, ChipGroup } from './chunk-F3YTWO3T.mjs';
2
2
  import './chunk-3DKJ2GIC.mjs';
3
3
  import './chunk-EJ7ZPXOH.mjs';
4
4
  import './chunk-DVK4G2GT.mjs';
5
5
  import './chunk-KA7LTET3.mjs';
6
- import './chunk-EMUWGDWC.mjs';
6
+ import './chunk-YTXRIXNZ.mjs';
7
7
  import './chunk-2CE3TQVY.mjs';
8
8
  import './chunk-Y6FXYEAI.mjs';