@lindle/linoardo 1.0.37 → 1.0.39

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 (42) hide show
  1. package/dist/chip.cjs +2 -2
  2. package/dist/chip.cjs.map +1 -1
  3. package/dist/chip.js +1 -1
  4. package/dist/{chunk-DJMAR7NV.js → chunk-5MVIF5GP.js} +8 -3
  5. package/dist/chunk-5MVIF5GP.js.map +1 -0
  6. package/dist/chunk-BDN4EDJQ.js +171 -0
  7. package/dist/chunk-BDN4EDJQ.js.map +1 -0
  8. package/dist/{chunk-XPEOXO2T.js → chunk-HJFHZNOV.js} +4 -4
  9. package/dist/{chunk-XPEOXO2T.js.map → chunk-HJFHZNOV.js.map} +1 -1
  10. package/dist/{chunk-5WQW6YSJ.js → chunk-L4UUC4EF.js} +48 -16
  11. package/dist/chunk-L4UUC4EF.js.map +1 -0
  12. package/dist/{chunk-AK7LFJI4.js → chunk-NADLY6LM.js} +17 -26
  13. package/dist/chunk-NADLY6LM.js.map +1 -0
  14. package/dist/index.cjs +183 -148
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.js +5 -5
  17. package/dist/list/item.cjs +46 -14
  18. package/dist/list/item.cjs.map +1 -1
  19. package/dist/list/item.js +1 -1
  20. package/dist/list.cjs +60 -37
  21. package/dist/list.cjs.map +1 -1
  22. package/dist/list.d.cts +7 -7
  23. package/dist/list.d.ts +7 -7
  24. package/dist/list.js +2 -2
  25. package/dist/profileCard.cjs +6 -1
  26. package/dist/profileCard.cjs.map +1 -1
  27. package/dist/profileCard.d.cts +1 -0
  28. package/dist/profileCard.d.ts +1 -0
  29. package/dist/profileCard.js +1 -1
  30. package/dist/select.cjs +118 -111
  31. package/dist/select.cjs.map +1 -1
  32. package/dist/select.d.cts +22 -16
  33. package/dist/select.d.ts +22 -16
  34. package/dist/select.js +2 -1
  35. package/dist/styles.css +174 -2
  36. package/package.json +1 -1
  37. package/readme.md +4 -0
  38. package/dist/chunk-5WQW6YSJ.js.map +0 -1
  39. package/dist/chunk-AK7LFJI4.js.map +0 -1
  40. package/dist/chunk-BZVDAMMY.js +0 -164
  41. package/dist/chunk-BZVDAMMY.js.map +0 -1
  42. package/dist/chunk-DJMAR7NV.js.map +0 -1
package/dist/select.d.ts CHANGED
@@ -1,28 +1,34 @@
1
1
  import react__default from 'react';
2
- import { a as GlobalSize } from './global.types-D-o85tuX.js';
2
+ import { b as PropIcon, a as GlobalSize } from './global.types-D-o85tuX.js';
3
3
  import { a as InputVariant } from './types-CbQEphC3.js';
4
4
 
5
- type SelectOptionObject = {
6
- label: react__default.ReactNode;
7
- value: string;
5
+ interface SelectOptionObject {
6
+ value: string | number;
7
+ label: string;
8
8
  disabled?: boolean;
9
- };
10
- type SelectOption = string | SelectOptionObject;
11
- type SelectProps = Omit<react__default.SelectHTMLAttributes<HTMLSelectElement>, 'children' | 'size'> & {
12
- /**
13
- * Options can be an array of strings or objects with label/value.
14
- */
9
+ icon?: PropIcon;
10
+ }
11
+ type SelectOption = SelectOptionObject | string;
12
+ interface SelectProps extends Omit<react__default.DetailsHTMLAttributes<HTMLDetailsElement>, 'onChange' | 'value' | 'defaultValue'> {
15
13
  options: SelectOption[];
16
- label?: react__default.ReactNode;
14
+ label?: string;
17
15
  placeholder?: string;
18
- wrapperClassName?: string;
19
16
  variant?: InputVariant;
20
17
  size?: GlobalSize;
21
- };
22
-
18
+ wrapperClassName?: string;
19
+ error?: boolean;
20
+ helperText?: string;
21
+ value?: string | number | readonly string[];
22
+ defaultValue?: string | number | readonly string[];
23
+ name?: string;
24
+ multiple?: boolean;
25
+ disabled?: boolean;
26
+ required?: boolean;
27
+ onChange?: react__default.ChangeEventHandler<HTMLInputElement>;
28
+ }
23
29
  /**
24
- * Native select styled with the same visual variants as Input.
25
- * Accepts options as string[] or { label, value }[] for convenience.
30
+ * Custom styled Select component using <details> and radio/checkbox inputs.
31
+ * Supports icons and custom styling while remaining a Server Component (no hooks).
26
32
  */
27
33
  declare const Select: react__default.FC<SelectProps>;
28
34
 
package/dist/select.js CHANGED
@@ -1,4 +1,5 @@
1
- export { Select_default as default } from './chunk-BZVDAMMY.js';
1
+ export { Select_default as default } from './chunk-BDN4EDJQ.js';
2
2
  import './chunk-6SKW43XI.js';
3
+ import './chunk-IEILIKS2.js';
3
4
  //# sourceMappingURL=select.js.map
4
5
  //# sourceMappingURL=select.js.map
package/dist/styles.css CHANGED
@@ -283,6 +283,9 @@
283
283
  .pointer-events-none {
284
284
  pointer-events: none;
285
285
  }
286
+ .invisible {
287
+ visibility: hidden;
288
+ }
286
289
  .visible {
287
290
  visibility: visible;
288
291
  }
@@ -843,6 +846,9 @@
843
846
  .list-disc {
844
847
  list-style-type: disc;
845
848
  }
849
+ .list-none {
850
+ list-style-type: none;
851
+ }
846
852
  .appearance-none {
847
853
  appearance: none;
848
854
  }
@@ -1896,8 +1902,8 @@
1896
1902
  .text-\[0\.65rem\] {
1897
1903
  font-size: 0.65rem;
1898
1904
  }
1899
- .text-\[1em\] {
1900
- font-size: 1em;
1905
+ .text-\[1\.125em\] {
1906
+ font-size: 1.125em;
1901
1907
  }
1902
1908
  .text-\[15px\] {
1903
1909
  font-size: 15px;
@@ -2420,6 +2426,11 @@
2420
2426
  -webkit-user-select: none;
2421
2427
  user-select: none;
2422
2428
  }
2429
+ .group-open\:rotate-180 {
2430
+ &:is(:where(.group):is([open], :popover-open, :open) *) {
2431
+ rotate: 180deg;
2432
+ }
2433
+ }
2423
2434
  .group-focus-within\/menu\:pointer-events-auto {
2424
2435
  &:is(:where(.group\/menu):focus-within *) {
2425
2436
  pointer-events: auto;
@@ -2504,6 +2515,11 @@
2504
2515
  }
2505
2516
  }
2506
2517
  }
2518
+ .peer-checked\:visible {
2519
+ &:is(:where(.peer):checked ~ *) {
2520
+ visibility: visible;
2521
+ }
2522
+ }
2507
2523
  .peer-checked\:block {
2508
2524
  &:is(:where(.peer):checked ~ *) {
2509
2525
  display: block;
@@ -2514,6 +2530,17 @@
2514
2530
  display: none;
2515
2531
  }
2516
2532
  }
2533
+ .peer-checked\:font-medium {
2534
+ &:is(:where(.peer):checked ~ *) {
2535
+ --tw-font-weight: var(--font-weight-medium);
2536
+ font-weight: var(--font-weight-medium);
2537
+ }
2538
+ }
2539
+ .peer-checked\:text-primary {
2540
+ &:is(:where(.peer):checked ~ *) {
2541
+ color: var(--color-primary);
2542
+ }
2543
+ }
2517
2544
  .peer-checked\/advanced\:flex {
2518
2545
  &:is(:where(.peer\/advanced):checked ~ *) {
2519
2546
  display: flex;
@@ -3256,6 +3283,11 @@
3256
3283
  border-color: var(--color-primary);
3257
3284
  }
3258
3285
  }
3286
+ .focus-visible\:border-red-500 {
3287
+ &:focus-visible {
3288
+ border-color: var(--color-red-500);
3289
+ }
3290
+ }
3259
3291
  .focus-visible\:bg-white {
3260
3292
  &:focus-visible {
3261
3293
  background-color: var(--color-white);
@@ -3423,6 +3455,11 @@
3423
3455
  --tw-ring-color: var(--color-red-400);
3424
3456
  }
3425
3457
  }
3458
+ .focus-visible\:ring-red-500 {
3459
+ &:focus-visible {
3460
+ --tw-ring-color: var(--color-red-500);
3461
+ }
3462
+ }
3426
3463
  .focus-visible\:ring-sky-200 {
3427
3464
  &:focus-visible {
3428
3465
  --tw-ring-color: var(--color-sky-200);
@@ -3644,6 +3681,13 @@
3644
3681
  padding-block: calc(var(--spacing) * 24);
3645
3682
  }
3646
3683
  }
3684
+ .dark\:divide-gray-800 {
3685
+ &:is(.dark &) {
3686
+ :where(& > :not(:last-child)) {
3687
+ border-color: var(--color-gray-800);
3688
+ }
3689
+ }
3690
+ }
3647
3691
  .dark\:border-black {
3648
3692
  &:is(.dark &) {
3649
3693
  border-color: var(--color-black);
@@ -3664,6 +3708,11 @@
3664
3708
  border-color: var(--color-gray-800);
3665
3709
  }
3666
3710
  }
3711
+ .dark\:border-slate-700 {
3712
+ &:is(.dark &) {
3713
+ border-color: var(--color-slate-700);
3714
+ }
3715
+ }
3667
3716
  .dark\:border-slate-800 {
3668
3717
  &:is(.dark &) {
3669
3718
  border-color: var(--color-slate-800);
@@ -3698,6 +3747,11 @@
3698
3747
  }
3699
3748
  }
3700
3749
  }
3750
+ .dark\:border-b-gray-300 {
3751
+ &:is(.dark &) {
3752
+ border-bottom-color: var(--color-gray-300);
3753
+ }
3754
+ }
3701
3755
  .dark\:border-b-gray-600 {
3702
3756
  &:is(.dark &) {
3703
3757
  border-bottom-color: var(--color-gray-600);
@@ -3713,11 +3767,53 @@
3713
3767
  border-bottom-color: var(--color-slate-700);
3714
3768
  }
3715
3769
  }
3770
+ .dark\:bg-amber-500\/15 {
3771
+ &:is(.dark &) {
3772
+ background-color: color-mix(in srgb, oklch(76.9% 0.188 70.08) 15%, transparent);
3773
+ @supports (color: color-mix(in lab, red, red)) {
3774
+ background-color: color-mix(in oklab, var(--color-amber-500) 15%, transparent);
3775
+ }
3776
+ }
3777
+ }
3778
+ .dark\:bg-emerald-500\/15 {
3779
+ &:is(.dark &) {
3780
+ background-color: color-mix(in srgb, oklch(69.6% 0.17 162.48) 15%, transparent);
3781
+ @supports (color: color-mix(in lab, red, red)) {
3782
+ background-color: color-mix(in oklab, var(--color-emerald-500) 15%, transparent);
3783
+ }
3784
+ }
3785
+ }
3786
+ .dark\:bg-gray-100 {
3787
+ &:is(.dark &) {
3788
+ background-color: var(--color-gray-100);
3789
+ }
3790
+ }
3716
3791
  .dark\:bg-gray-800 {
3717
3792
  &:is(.dark &) {
3718
3793
  background-color: var(--color-gray-800);
3719
3794
  }
3720
3795
  }
3796
+ .dark\:bg-gray-900 {
3797
+ &:is(.dark &) {
3798
+ background-color: var(--color-gray-900);
3799
+ }
3800
+ }
3801
+ .dark\:bg-gray-900\/60 {
3802
+ &:is(.dark &) {
3803
+ background-color: color-mix(in srgb, oklch(21% 0.034 264.665) 60%, transparent);
3804
+ @supports (color: color-mix(in lab, red, red)) {
3805
+ background-color: color-mix(in oklab, var(--color-gray-900) 60%, transparent);
3806
+ }
3807
+ }
3808
+ }
3809
+ .dark\:bg-gray-900\/70 {
3810
+ &:is(.dark &) {
3811
+ background-color: color-mix(in srgb, oklch(21% 0.034 264.665) 70%, transparent);
3812
+ @supports (color: color-mix(in lab, red, red)) {
3813
+ background-color: color-mix(in oklab, var(--color-gray-900) 70%, transparent);
3814
+ }
3815
+ }
3816
+ }
3721
3817
  .dark\:bg-gray-900\/95 {
3722
3818
  &:is(.dark &) {
3723
3819
  background-color: color-mix(in srgb, oklch(21% 0.034 264.665) 95%, transparent);
@@ -3726,6 +3822,30 @@
3726
3822
  }
3727
3823
  }
3728
3824
  }
3825
+ .dark\:bg-primary\/15 {
3826
+ &:is(.dark &) {
3827
+ background-color: color-mix(in srgb, oklch(0.62 0.13 250) 15%, transparent);
3828
+ @supports (color: color-mix(in lab, red, red)) {
3829
+ background-color: color-mix(in oklab, var(--color-primary) 15%, transparent);
3830
+ }
3831
+ }
3832
+ }
3833
+ .dark\:bg-red-500\/15 {
3834
+ &:is(.dark &) {
3835
+ background-color: color-mix(in srgb, oklch(63.7% 0.237 25.331) 15%, transparent);
3836
+ @supports (color: color-mix(in lab, red, red)) {
3837
+ background-color: color-mix(in oklab, var(--color-red-500) 15%, transparent);
3838
+ }
3839
+ }
3840
+ }
3841
+ .dark\:bg-sky-500\/15 {
3842
+ &:is(.dark &) {
3843
+ background-color: color-mix(in srgb, oklch(68.5% 0.169 237.323) 15%, transparent);
3844
+ @supports (color: color-mix(in lab, red, red)) {
3845
+ background-color: color-mix(in oklab, var(--color-sky-500) 15%, transparent);
3846
+ }
3847
+ }
3848
+ }
3729
3849
  .dark\:bg-slate-800 {
3730
3850
  &:is(.dark &) {
3731
3851
  background-color: var(--color-slate-800);
@@ -3770,6 +3890,14 @@
3770
3890
  background-color: transparent;
3771
3891
  }
3772
3892
  }
3893
+ .dark\:bg-white\/10 {
3894
+ &:is(.dark &) {
3895
+ background-color: color-mix(in srgb, #fff 10%, transparent);
3896
+ @supports (color: color-mix(in lab, red, red)) {
3897
+ background-color: color-mix(in oklab, var(--color-white) 10%, transparent);
3898
+ }
3899
+ }
3900
+ }
3773
3901
  .dark\:from-amber-300\/30 {
3774
3902
  &:is(.dark &) {
3775
3903
  --tw-gradient-from: color-mix(in srgb, oklch(87.9% 0.169 91.605) 30%, transparent);
@@ -3884,6 +4012,11 @@
3884
4012
  color: var(--color-amber-300);
3885
4013
  }
3886
4014
  }
4015
+ .dark\:text-amber-400 {
4016
+ &:is(.dark &) {
4017
+ color: var(--color-amber-400);
4018
+ }
4019
+ }
3887
4020
  .dark\:text-emerald-300 {
3888
4021
  &:is(.dark &) {
3889
4022
  color: var(--color-emerald-300);
@@ -3919,11 +4052,26 @@
3919
4052
  color: var(--color-gray-400);
3920
4053
  }
3921
4054
  }
4055
+ .dark\:text-primary {
4056
+ &:is(.dark &) {
4057
+ color: var(--color-primary);
4058
+ }
4059
+ }
3922
4060
  .dark\:text-red-300 {
3923
4061
  &:is(.dark &) {
3924
4062
  color: var(--color-red-300);
3925
4063
  }
3926
4064
  }
4065
+ .dark\:text-red-400 {
4066
+ &:is(.dark &) {
4067
+ color: var(--color-red-400);
4068
+ }
4069
+ }
4070
+ .dark\:text-sky-400 {
4071
+ &:is(.dark &) {
4072
+ color: var(--color-sky-400);
4073
+ }
4074
+ }
3927
4075
  .dark\:text-slate-50 {
3928
4076
  &:is(.dark &) {
3929
4077
  color: var(--color-slate-50);
@@ -4067,6 +4215,18 @@
4067
4215
  }
4068
4216
  }
4069
4217
  }
4218
+ .dark\:hover\:bg-white\/5 {
4219
+ &:is(.dark &) {
4220
+ &:hover {
4221
+ @media (hover: hover) {
4222
+ background-color: color-mix(in srgb, #fff 5%, transparent);
4223
+ @supports (color: color-mix(in lab, red, red)) {
4224
+ background-color: color-mix(in oklab, var(--color-white) 5%, transparent);
4225
+ }
4226
+ }
4227
+ }
4228
+ }
4229
+ }
4070
4230
  .dark\:hover\:text-white {
4071
4231
  &:is(.dark &) {
4072
4232
  &:hover {
@@ -4159,6 +4319,13 @@
4159
4319
  }
4160
4320
  }
4161
4321
  }
4322
+ .dark\:focus-visible\:ring-offset-gray-900 {
4323
+ &:is(.dark &) {
4324
+ &:focus-visible {
4325
+ --tw-ring-offset-color: var(--color-gray-900);
4326
+ }
4327
+ }
4328
+ }
4162
4329
  .dark\:focus-visible\:ring-offset-slate-900 {
4163
4330
  &:is(.dark &) {
4164
4331
  &:focus-visible {
@@ -4285,6 +4452,11 @@
4285
4452
  padding-left: calc(var(--spacing) * 5);
4286
4453
  }
4287
4454
  }
4455
+ .\[\&\:\:-webkit-details-marker\]\:hidden {
4456
+ &::-webkit-details-marker {
4457
+ display: none;
4458
+ }
4459
+ }
4288
4460
  }
4289
4461
  @font-face {
4290
4462
  font-family: "Material Design Icons";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lindle/linoardo",
3
- "version": "1.0.37",
3
+ "version": "1.0.39",
4
4
  "description": "",
5
5
  "keywords": [],
6
6
  "author": "",
package/readme.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## instructions for codex
2
+
3
+ All components are server components, if possible. If not, mark file as "use client" Components working with forms must be compatible with react-hook-form.
4
+
1
5
  # Linoardo
2
6
 
3
7
  Linoardo is a React UI component library. It is built on Tailwind CSS, includes core building blocks (Button, Input, Menu, Dialog, etc.), and lets you easily override the color palette via CSS variables.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/Containment/List/Item/index.tsx"],"names":[],"mappings":"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","file":"chunk-5WQW6YSJ.js","sourcesContent":["import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport type { Palette } from '@lindle/linoardo/global.types';\n\nimport type { ListDensity, ListLines } from '../types.list';\n\nconst listItemBaseClasses =\n 'relative flex w-full items-center gap-4 bg-transparent text-left text-sm transition-colors duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/40 focus-visible:ring-offset-2 focus-visible:ring-offset-white hover:bg-neutral-200';\n\nconst densityClasses: Record<ListDensity, string> = {\n default: 'px-4 py-3 text-base',\n comfortable: 'px-4 py-2.5 text-sm',\n compact: 'px-3 py-2 text-sm'\n};\n\nconst lineClasses: Record<ListLines, string> = {\n one: 'min-h-[3rem]',\n two: 'min-h-[3.75rem]',\n three: 'min-h-[4.5rem]'\n};\n\nconst accentClasses: Record<Palette, { text: string; bg: string; indicator: string }> = {\n primary: { text: 'text-primary', bg: 'bg-primary/10', indicator: 'bg-primary' },\n neutral: { text: 'text-gray-900', bg: 'bg-gray-100', indicator: 'bg-gray-900' },\n info: { text: 'text-sky-600', bg: 'bg-sky-50', indicator: 'bg-sky-500' },\n success: { text: 'text-emerald-600', bg: 'bg-emerald-50', indicator: 'bg-emerald-500' },\n warning: { text: 'text-amber-700', bg: 'bg-amber-50', indicator: 'bg-amber-500' },\n danger: { text: 'text-red-600', bg: 'bg-red-50', indicator: 'bg-red-500' },\n surface: { text: 'text-gray-900', bg: 'bg-gray-100', indicator: 'bg-gray-900' },\n bw: { text: 'text-gray-900', bg: 'bg-gray-100', indicator: 'bg-gray-900' }\n};\n\nexport interface ListItemProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {\n component?: React.ElementType;\n href?: string;\n target?: string;\n rel?: string;\n type?: 'button' | 'submit' | 'reset';\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n overline?: React.ReactNode;\n prepend?: React.ReactNode;\n append?: React.ReactNode;\n active?: boolean;\n disabled?: boolean;\n inset?: boolean;\n density?: ListDensity;\n lines?: ListLines;\n nav?: boolean;\n divided?: boolean;\n color?: Palette;\n sharp?: boolean;\n}\n\n/**\n * Single list row supporting titles, overlines, adornments and navigation styling.\n */\nconst ListItem = React.forwardRef<HTMLElement, ListItemProps>((props, ref) => {\n const {\n component,\n href,\n target,\n rel,\n type,\n title,\n subtitle,\n overline,\n prepend,\n append,\n active = false,\n disabled = false,\n inset = false,\n density: densityOverride,\n lines: linesOverride,\n nav: navOverride,\n divided: dividedOverride,\n color: colorOverride,\n sharp: sharpOverride,\n className,\n children,\n tabIndex,\n role,\n ...rest\n } = props;\n\n const density = densityOverride ?? 'default';\n const lines = linesOverride ?? 'one';\n const nav = navOverride ?? false;\n const divided = dividedOverride ?? false;\n const color = colorOverride ?? 'primary';\n const sharp = sharpOverride ?? false;\n const accent = accentClasses[color] ?? accentClasses.primary;\n const shapeClass = divided || sharp ? 'rounded-none' : 'rounded-lg';\n\n const Component = component ?? (href ? 'a' : 'div');\n const interactive =\n typeof rest.onClick === 'function' || Component === 'a' || Component === 'button';\n\n const resolvedRole = role ?? 'listitem';\n const resolvedTabIndex = disabled\n ? -1\n : tabIndex ?? (interactive && Component === 'div' ? 0 : undefined);\n const resolvedRel = Component === 'a' ? rel : undefined;\n const resolvedTarget = Component === 'a' ? target : undefined;\n const resolvedHref = Component === 'a' ? href : undefined;\n const resolvedType = Component === 'button' ? type ?? 'button' : undefined;\n\n const disabledClass = disabled ? 'pointer-events-none opacity-60' : 'cursor-pointer';\n const navPaddingClass = nav ? 'pl-5' : undefined;\n const insetClass = inset ? 'pl-12' : undefined;\n const activeClasses = active ? accent.bg : undefined;\n\n return (\n <Component\n {...rest}\n ref={ref}\n role={resolvedRole}\n tabIndex={resolvedTabIndex}\n aria-disabled={disabled || undefined}\n aria-current={active ? 'true' : undefined}\n className={twMerge(\n listItemBaseClasses,\n densityClasses[density],\n lineClasses[lines],\n shapeClass,\n navPaddingClass,\n insetClass,\n disabledClass,\n activeClasses,\n className\n )}\n href={resolvedHref}\n target={resolvedTarget}\n rel={resolvedRel}\n type={resolvedType}\n data-active={active || undefined}\n >\n {nav && (\n <span\n aria-hidden\n className={twMerge(\n 'absolute left-1 top-2 bottom-2 w-0.5 rounded-full bg-transparent transition-colors duration-150',\n active ? accent.indicator : undefined\n )}\n />\n )}\n {prepend && (\n <span className='flex h-10 w-10 shrink-0 items-center justify-center text-base text-gray-500'>\n {prepend}\n </span>\n )}\n <span className='flex min-w-0 flex-col gap-0.5 text-left'>\n {overline && (\n <span className='text-[0.65rem] font-semibold uppercase tracking-wide text-gray-500'>\n {overline}\n </span>\n )}\n {title && (\n <span\n className={twMerge(\n 'truncate font-medium text-gray-900',\n active ? accent.text : undefined\n )}\n >\n {title}\n </span>\n )}\n {subtitle && <span className='text-sm text-gray-500'>{subtitle}</span>}\n {children}\n </span>\n {append && (\n <span className='ml-auto flex items-center gap-2 whitespace-nowrap text-sm text-gray-500'>\n {append}\n </span>\n )}\n </Component>\n );\n});\n\nListItem.displayName = 'ListItem';\n\nexport default ListItem;\nexport type { ListDensity, ListLines } from '../types.list';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/Containment/List/index.tsx"],"names":[],"mappings":";;;;;AAQA,IAAM,eAAA,GAAkB,2EAAA;AAExB,IAAM,kBAAA,GAAkD;AAAA,EACtD,KAAA,EAAO,6DAAA;AAAA,EACP,KAAA,EAAO,0EAAA;AAAA,EACP,OAAA,EAAS,uCAAA;AAAA,EACT,KAAA,EAAO,sCAAA;AAAA,EACP,IAAA,EAAM,0CAAA;AAAA,EACN,MAAA,EAAQ,kEAAA;AAAA,EACR,UAAA,EAAY,gFAAA;AAAA,EACZ,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,kBAAA,GAAkD;AAAA,EACtD,IAAA,EAAM,cAAA;AAAA,EACN,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI,YAAA;AAAA,EACJ,IAAA,EAAM;AACR,CAAA;AAYA,IAAM,iBAAA,GAAoB,CACxB,OAAA,KACiD;AACjD,EAAA,IAAI,CAAO,KAAA,CAAA,cAAA,CAAe,OAAO,CAAA,EAAG;AAClC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAc,OAAA,CAAQ,IAAA;AAC5B,EAAA,OAAO,OAAA,CAAQ,IAAA,KAAS,YAAA,IAAY,WAAA,CAAY,gBAAgB,YAAA,CAAS,WAAA;AAC3E,CAAA;AAKA,IAAM,IAAA,GAAa,KAAA,CAAA,UAAA,CAAsC,CAAC,KAAA,EAAO,GAAA,KAAQ;AACvE,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,OAAA;AAAA,IACV,OAAA,GAAU,SAAA;AAAA,IACV,KAAA,GAAQ,KAAA;AAAA,IACR,GAAA,GAAM,KAAA;AAAA,IACN,OAAA,GAAU,KAAA;AAAA,IACV,OAAA,GAAU,IAAA;AAAA,IACV,KAAA,GAAQ,SAAA;AAAA,IACR,SAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,iBAAiB,OAAA,KAAY,OAAA;AACnC,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,OAAO,CAAA,IAAK,kBAAA,CAAmB,KAAA;AACvE,EAAA,MAAM,eAAe,cAAA,GACjB,cAAA,GACA,kBAAA,CAAmB,OAAO,KAAK,kBAAA,CAAmB,EAAA;AACtD,EAAA,MAAM,YAAA,GAAe,UAAU,0BAAA,GAA6B,MAAA;AAC5D,EAAA,MAAM,QAAA,GAAW,UAAU,KAAA,GAAQ,WAAA;AACnC,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,GAAS,MAAA;AAChC,EAAA,MAAM,WAAA,GAAc,KAAA;AAEpB,EAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAA4C;AAChE,IAAA,IAAI,CAAO,KAAA,CAAA,cAAA,CAAe,KAAK,CAAA,EAAG;AAChC,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,MAAA,OAAa,mBAAa,KAAA,EAAO;AAAA,QAC/B,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,OAAA,IAAW,OAAA;AAAA,QAChC,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,KAAA;AAAA,QAC5B,GAAA,EAAK,KAAA,CAAM,KAAA,CAAM,GAAA,IAAO,GAAA;AAAA,QACxB,OAAA,EAAS,KAAA,CAAM,KAAA,CAAM,OAAA,IAAW,OAAA;AAAA,QAChC,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS,WAAA;AAAA,QAC5B,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,KAAA,IAAS;AAAA,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,OAAO,KAAA,CAAM,UAAU,QAAA,IAAY,UAAA,IAAc,MAAM,KAAA,EAAO;AAC/E,MAAA,MAAM,iBAAuB,KAAA,CAAA,QAAA,CAAS,GAAA;AAAA,QACpC,MAAM,KAAA,CAAM,QAAA;AAAA,QACZ;AAAA,OACF;AACA,MAAA,IAAI,cAAA,KAAmB,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU;AAC3C,QAAA,OAAa,KAAA,CAAA,YAAA,CAAa,KAAA,EAAO,MAAA,EAAW,cAAc,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAyB,KAAA,CAAA,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,YAAY,CAAA;AAElE,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,GAAA;AAAA,MACA,MAAM,IAAA,IAAQ,MAAA;AAAA,MACd,SAAA,EAAW,OAAA;AAAA,QACT,eAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA;AAAA,GACH;AAEJ,CAAC,CAAA;AAED,IAAA,CAAK,WAAA,GAAc,MAAA;AAKnB,IAAO,YAAA,GAAQ","file":"chunk-AK7LFJI4.js","sourcesContent":["import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport type { Palette } from '@lindle/linoardo/global.types';\n\nimport ListItem from './Item';\nimport type { ListItemProps } from './Item';\nimport type { ListDensity, ListLines, ListRounded, ListVariant } from './types.list';\n\nconst listBaseClasses = 'flex w-full min-w-0 flex-col text-gray-900 transition-colors duration-150';\n\nconst listVariantClasses: Record<ListVariant, string> = {\n solid: 'bg-white border border-gray-200 shadow-sm shadow-gray-900/5',\n sharp: 'bg-white border border-gray-200 shadow-sm shadow-gray-900/5 rounded-none',\n outline: 'bg-transparent border border-gray-300',\n ghost: 'bg-gray-50 border border-transparent',\n text: 'bg-transparent border border-transparent',\n filled: 'bg-gray-50 border border-gray-200 shadow-inner shadow-gray-900/5',\n underlined: 'bg-transparent border border-transparent border-b border-gray-200 rounded-none',\n rounded: 'bg-white border border-gray-200 shadow-lg shadow-gray-900/10'\n};\n\nconst listRoundedClasses: Record<ListRounded, string> = {\n none: 'rounded-none',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n pill: 'rounded-full'\n};\n\nexport interface ListProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: ListVariant;\n density?: ListDensity;\n lines?: ListLines;\n nav?: boolean;\n divided?: boolean;\n rounded?: ListRounded;\n color?: Palette;\n}\n\nconst isListItemElement = (\n element: React.ReactNode\n): element is React.ReactElement<ListItemProps> => {\n if (!React.isValidElement(element)) {\n return false;\n }\n\n const elementType = element.type as { displayName?: string };\n return element.type === ListItem || elementType.displayName === ListItem.displayName;\n};\n\n/**\n * List container that normalizes spacing, rounding and density for nested `ListItem` children.\n */\nconst List = React.forwardRef<HTMLDivElement, ListProps>((props, ref) => {\n const {\n variant = 'solid',\n density = 'default',\n lines = 'one',\n nav = false,\n divided = false,\n rounded = 'lg',\n color = 'primary',\n className,\n role,\n children,\n ...rest\n } = props;\n\n const isSharpVariant = variant === 'sharp';\n const variantClass = listVariantClasses[variant] ?? listVariantClasses.solid;\n const roundedClass = isSharpVariant\n ? 'rounded-none'\n : listRoundedClasses[rounded] ?? listRoundedClasses.lg;\n const dividerClass = divided ? 'divide-y divide-gray-100' : undefined;\n const gapClass = divided ? 'p-0' : 'gap-1 p-1';\n const navClass = nav ? 'py-1' : undefined;\n const accentColor = color;\n\n const enhanceChild = (child: React.ReactNode): React.ReactNode => {\n if (!React.isValidElement(child)) {\n return child;\n }\n\n if (isListItemElement(child)) {\n return React.cloneElement(child, {\n density: child.props.density ?? density,\n lines: child.props.lines ?? lines,\n nav: child.props.nav ?? nav,\n divided: child.props.divided ?? divided,\n color: child.props.color ?? accentColor,\n sharp: child.props.sharp ?? isSharpVariant\n });\n }\n\n if (child.props && typeof child.props === 'object' && 'children' in child.props) {\n const nestedChildren = React.Children.map(\n child.props.children as React.ReactNode,\n enhanceChild\n );\n if (nestedChildren !== child.props.children) {\n return React.cloneElement(child, undefined, nestedChildren);\n }\n }\n\n return child;\n };\n\n const resolvedChildren = React.Children.map(children, enhanceChild);\n\n return (\n <div\n {...rest}\n ref={ref}\n role={role ?? 'list'}\n className={twMerge(\n listBaseClasses,\n variantClass,\n roundedClass,\n dividerClass,\n gapClass,\n navClass,\n className\n )}\n >\n {resolvedChildren}\n </div>\n );\n});\n\nList.displayName = 'List';\n\nexport { ListItem };\nexport type { ListItemProps } from './Item';\nexport type { ListVariant, ListDensity, ListLines, ListRounded } from './types.list';\nexport default List;\n"]}
@@ -1,164 +0,0 @@
1
- import { generateString } from './chunk-6SKW43XI.js';
2
- import React from 'react';
3
- import { twMerge } from 'tailwind-merge';
4
- import { jsx, jsxs } from 'react/jsx-runtime';
5
-
6
- var baseClass = "select-base w-full appearance-none focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed bg-white text-gray-900 placeholder:text-gray-500 dark:bg-slate-900 dark:text-gray-100 dark:placeholder:text-gray-400";
7
- var variantClasses = {
8
- solid: "rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40",
9
- sharp: "rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40",
10
- outline: "rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40",
11
- text: "rounded-none border-0 border-b border-transparent pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70",
12
- ghost: "rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25",
13
- filled: "rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30",
14
- underlined: "rounded-none border-0 border-b border-gray-300 pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70",
15
- rounded: "rounded-full pl-4 pr-10 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20"
16
- };
17
- var sizeClasses = {
18
- "x-small": { padding: "pl-2 pr-8 py-2", text: "text-xs" },
19
- small: { padding: "pl-2.5 pr-9 py-2.5", text: "text-sm" },
20
- medium: { padding: "pl-3 pr-10 py-3", text: "text-base" },
21
- large: { padding: "pl-3.5 pr-11 py-3.5", text: "text-lg" },
22
- "x-large": { padding: "pl-4 pr-12 py-4", text: "text-xl" }
23
- };
24
- var normalizeOption = (option) => {
25
- if (typeof option === "string") {
26
- return { label: option, value: option };
27
- }
28
- return option;
29
- };
30
- var Select = ({
31
- options,
32
- label,
33
- placeholder,
34
- variant = "outline",
35
- size = "medium",
36
- className,
37
- wrapperClassName,
38
- id,
39
- name,
40
- multiple,
41
- onFocus,
42
- onBlur,
43
- onChange,
44
- value,
45
- defaultValue,
46
- ...props
47
- }) => {
48
- const selectId = id || name || generateString();
49
- const selectName = name || selectId;
50
- const variantClass = variantClasses[variant] ?? variantClasses.outline;
51
- const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;
52
- const sizeClass = `${sizeConfig.padding} ${sizeConfig.text}`;
53
- const normalizedOptions = options.map(normalizeOption);
54
- const hasLabel = Boolean(label);
55
- const hasProvidedPlaceholder = typeof placeholder === "string" && placeholder.trim().length > 0;
56
- const hidePlaceholderUntilFocus = hasLabel && hasProvidedPlaceholder && !multiple;
57
- const placeholderText = placeholder ?? (hasLabel ? " " : void 0);
58
- const [isFocused, setIsFocused] = React.useState(false);
59
- const [hasValue, setHasValue] = React.useState(() => {
60
- const initial = value ?? defaultValue;
61
- if (initial === void 0 || initial === null) return false;
62
- if (multiple) {
63
- if (Array.isArray(initial)) return initial.length > 0;
64
- return String(initial).length > 0;
65
- }
66
- if (Array.isArray(initial)) {
67
- if (initial.length === 0) return false;
68
- return String(initial[0]).length > 0;
69
- }
70
- return String(initial).length > 0;
71
- });
72
- const isControlled = value !== void 0;
73
- React.useEffect(() => {
74
- if (!isControlled) return;
75
- if (value === void 0 || value === null) {
76
- setHasValue(false);
77
- return;
78
- }
79
- if (multiple) {
80
- if (Array.isArray(value)) {
81
- setHasValue(value.length > 0);
82
- } else {
83
- setHasValue(String(value).length > 0);
84
- }
85
- return;
86
- }
87
- if (Array.isArray(value)) {
88
- setHasValue(value.length > 0 ? String(value[0]).length > 0 : false);
89
- return;
90
- }
91
- setHasValue(String(value).length > 0);
92
- }, [isControlled, multiple, value]);
93
- const placeholderOptionLabel = hidePlaceholderUntilFocus && !isFocused ? " " : placeholderText;
94
- const shouldRenderPlaceholder = !multiple && placeholderText !== void 0;
95
- const labelShouldFloat = hasValue || isFocused;
96
- const labelLeftClass = "left-3";
97
- const labelBgDefault = ["outline", "text", "underlined"].includes(variant) ? "bg-transparent" : "bg-white/90 dark:bg-slate-900";
98
- const handleFocus = (event) => {
99
- if (hidePlaceholderUntilFocus) setIsFocused(true);
100
- onFocus?.(event);
101
- };
102
- const handleBlur = (event) => {
103
- if (hidePlaceholderUntilFocus) setIsFocused(false);
104
- onBlur?.(event);
105
- };
106
- const handleChange = (event) => {
107
- if (!isControlled) {
108
- const nextHasValue = multiple ? event.target.selectedOptions.length > 0 : event.target.value !== "";
109
- setHasValue(nextHasValue);
110
- }
111
- onChange?.(event);
112
- };
113
- return /* @__PURE__ */ jsx("div", { className: twMerge("flex flex-col gap-1", wrapperClassName), children: /* @__PURE__ */ jsxs("div", { className: "relative flex items-center", children: [
114
- /* @__PURE__ */ jsxs(
115
- "select",
116
- {
117
- ...props,
118
- id: selectId,
119
- name: selectName,
120
- multiple,
121
- value,
122
- defaultValue: value === void 0 ? defaultValue : void 0,
123
- onFocus: handleFocus,
124
- onBlur: handleBlur,
125
- onChange: handleChange,
126
- className: twMerge("peer", baseClass, variantClass, sizeClass, className),
127
- children: [
128
- shouldRenderPlaceholder && /* @__PURE__ */ jsx("option", { value: "", disabled: props.required, hidden: hasValue, children: placeholderOptionLabel }),
129
- normalizedOptions.map((option, index) => /* @__PURE__ */ jsx(
130
- "option",
131
- {
132
- value: option.value,
133
- disabled: option.disabled,
134
- children: option.label
135
- },
136
- `${selectId}-${option.value}-${index}`
137
- ))
138
- ]
139
- }
140
- ),
141
- !multiple && /* @__PURE__ */ jsx("span", { className: "pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500 dark:text-gray-300", children: /* @__PURE__ */ jsx("i", { className: "mdi mdi-chevron-down text-base leading-none", "aria-hidden": true }) }),
142
- label && /* @__PURE__ */ jsx(
143
- "label",
144
- {
145
- htmlFor: selectId,
146
- className: twMerge(
147
- "absolute transition-all duration-150 pointer-events-none text-gray-700 dark:text-gray-200",
148
- labelLeftClass,
149
- labelShouldFloat ? [
150
- "-top-1.5 left-1 text-xs px-1",
151
- isFocused ? "-translate-y-1/2 text-gray-600" : "-translate-y-2/3",
152
- labelBgDefault
153
- ].join(" ") : "top-1/2 -translate-y-1/2 text-sm text-gray-500"
154
- ),
155
- children: label
156
- }
157
- )
158
- ] }) });
159
- };
160
- var Select_default = Select;
161
-
162
- export { Select_default };
163
- //# sourceMappingURL=chunk-BZVDAMMY.js.map
164
- //# sourceMappingURL=chunk-BZVDAMMY.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/Form/Select/index.tsx"],"names":[],"mappings":"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","file":"chunk-BZVDAMMY.js","sourcesContent":["import React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport type { GlobalSize } from '@lindle/linoardo/global.types';\nimport type { InputVariant } from '../Input/types';\nimport type { SelectOption, SelectOptionObject, SelectProps } from './types.select';\nimport { generateString } from '../../utils/helpers/randomStr';\n\nconst baseClass =\n 'select-base w-full appearance-none focus-visible:outline-none focus-visible:ring-primary transition-colors duration-200 disabled:opacity-50 disabled:cursor-not-allowed bg-white text-gray-900 placeholder:text-gray-500 dark:bg-slate-900 dark:text-gray-100 dark:placeholder:text-gray-400';\n\nconst variantClasses = {\n solid:\n 'rounded border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\n sharp:\n 'rounded-none border border-gray-400 bg-white shadow-sm focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/30 dark:border-gray-600 dark:bg-slate-900 dark:shadow-black/20 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/40',\n outline:\n 'rounded border-2 border-black bg-white focus-visible:border-black focus-visible:ring-2 focus-visible:ring-black/30 dark:border-black dark:bg-transparent dark:focus-visible:border-black dark:focus-visible:ring-black/40',\n text: 'rounded-none border-0 border-b border-transparent pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70',\n ghost:\n 'rounded border border-transparent bg-gray-50 text-gray-900 focus-visible:bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/15 dark:bg-slate-800 dark:text-gray-100 dark:focus-visible:bg-slate-700 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/25',\n filled:\n 'rounded border border-gray-200 bg-gray-100 focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/25 dark:border-gray-700 dark:bg-slate-800 dark:focus-visible:border-primary/60 dark:focus-visible:ring-primary/30',\n underlined:\n 'rounded-none border-0 border-b border-gray-300 pl-0 pr-10 bg-transparent focus-visible:border-primary focus-visible:ring-0 focus-visible:ring-transparent dark:border-b-gray-600 dark:focus-visible:border-primary/70',\n rounded:\n 'rounded-full pl-4 pr-10 border border-gray-300 bg-white focus-visible:border-primary focus-visible:ring-2 focus-visible:ring-primary/20 shadow-sm dark:border-gray-600 dark:bg-slate-900 dark:focus-visible:border-primary/70 dark:focus-visible:ring-primary/30 dark:shadow-black/20'\n} satisfies Record<InputVariant, string>;\n\nconst sizeClasses = {\n 'x-small': { padding: 'pl-2 pr-8 py-2', text: 'text-xs' },\n small: { padding: 'pl-2.5 pr-9 py-2.5', text: 'text-sm' },\n medium: { padding: 'pl-3 pr-10 py-3', text: 'text-base' },\n large: { padding: 'pl-3.5 pr-11 py-3.5', text: 'text-lg' },\n 'x-large': { padding: 'pl-4 pr-12 py-4', text: 'text-xl' }\n} satisfies Record<GlobalSize, { padding: string; text: string }>;\n\nconst normalizeOption = (option: SelectOption): SelectOptionObject => {\n if (typeof option === 'string') {\n return { label: option, value: option };\n }\n\n return option;\n};\n\n/**\n * Native select styled with the same visual variants as Input.\n * Accepts options as string[] or { label, value }[] for convenience.\n */\nconst Select: React.FC<SelectProps> = ({\n options,\n label,\n placeholder,\n variant = 'outline',\n size = 'medium',\n className,\n wrapperClassName,\n id,\n name,\n multiple,\n onFocus,\n onBlur,\n onChange,\n value,\n defaultValue,\n ...props\n}) => {\n const selectId = id || name || generateString();\n const selectName = name || selectId;\n const variantClass = variantClasses[variant] ?? variantClasses.outline;\n const sizeConfig = sizeClasses[size] ?? sizeClasses.medium;\n const sizeClass = `${sizeConfig.padding} ${sizeConfig.text}`;\n const normalizedOptions = options.map(normalizeOption);\n const hasLabel = Boolean(label);\n const hasProvidedPlaceholder = typeof placeholder === 'string' && placeholder.trim().length > 0;\n const hidePlaceholderUntilFocus = hasLabel && hasProvidedPlaceholder && !multiple;\n const placeholderText = placeholder ?? (hasLabel ? ' ' : undefined);\n const [isFocused, setIsFocused] = React.useState(false);\n const [hasValue, setHasValue] = React.useState(() => {\n const initial = value ?? defaultValue;\n if (initial === undefined || initial === null) return false;\n if (multiple) {\n if (Array.isArray(initial)) return initial.length > 0;\n return String(initial).length > 0;\n }\n if (Array.isArray(initial)) {\n if (initial.length === 0) return false;\n return String(initial[0]).length > 0;\n }\n return String(initial).length > 0;\n });\n const isControlled = value !== undefined;\n\n React.useEffect(() => {\n if (!isControlled) return;\n if (value === undefined || value === null) {\n setHasValue(false);\n return;\n }\n if (multiple) {\n if (Array.isArray(value)) {\n setHasValue(value.length > 0);\n } else {\n setHasValue(String(value).length > 0);\n }\n return;\n }\n if (Array.isArray(value)) {\n setHasValue(value.length > 0 ? String(value[0]).length > 0 : false);\n return;\n }\n setHasValue(String(value).length > 0);\n }, [isControlled, multiple, value]);\n\n const placeholderOptionLabel = hidePlaceholderUntilFocus && !isFocused ? ' ' : placeholderText;\n const shouldRenderPlaceholder = !multiple && placeholderText !== undefined;\n const labelShouldFloat = hasValue || isFocused;\n const labelLeftClass = 'left-3';\n const labelBgDefault = ['outline', 'text', 'underlined'].includes(variant)\n ? 'bg-transparent'\n : 'bg-white/90 dark:bg-slate-900';\n\n const handleFocus: React.FocusEventHandler<HTMLSelectElement> = event => {\n if (hidePlaceholderUntilFocus) setIsFocused(true);\n onFocus?.(event);\n };\n\n const handleBlur: React.FocusEventHandler<HTMLSelectElement> = event => {\n if (hidePlaceholderUntilFocus) setIsFocused(false);\n onBlur?.(event);\n };\n\n const handleChange: React.ChangeEventHandler<HTMLSelectElement> = event => {\n if (!isControlled) {\n const nextHasValue = multiple\n ? event.target.selectedOptions.length > 0\n : event.target.value !== '';\n setHasValue(nextHasValue);\n }\n onChange?.(event);\n };\n\n return (\n <div className={twMerge('flex flex-col gap-1', wrapperClassName)}>\n <div className='relative flex items-center'>\n <select\n {...props}\n id={selectId}\n name={selectName}\n multiple={multiple}\n value={value}\n defaultValue={value === undefined ? defaultValue : undefined}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n className={twMerge('peer', baseClass, variantClass, sizeClass, className)}\n >\n {shouldRenderPlaceholder && (\n <option value='' disabled={props.required} hidden={hasValue}>\n {placeholderOptionLabel}\n </option>\n )}\n {normalizedOptions.map((option, index) => (\n <option\n key={`${selectId}-${option.value}-${index}`}\n value={option.value}\n disabled={option.disabled}\n >\n {option.label}\n </option>\n ))}\n </select>\n {!multiple && (\n <span className='pointer-events-none absolute inset-y-0 right-3 flex items-center text-gray-500 dark:text-gray-300'>\n <i className='mdi mdi-chevron-down text-base leading-none' aria-hidden />\n </span>\n )}\n {label && (\n <label\n htmlFor={selectId}\n className={twMerge(\n 'absolute transition-all duration-150 pointer-events-none text-gray-700 dark:text-gray-200',\n labelLeftClass,\n labelShouldFloat\n ? [\n '-top-1.5 left-1 text-xs px-1',\n isFocused ? '-translate-y-1/2 text-gray-600' : '-translate-y-2/3',\n labelBgDefault\n ].join(' ')\n : 'top-1/2 -translate-y-1/2 text-sm text-gray-500'\n )}\n >\n {label}\n </label>\n )}\n </div>\n </div>\n );\n};\n\nexport default Select;\nexport type { SelectProps, SelectOption, SelectOptionObject } from './types.select';\n"]}