@bigtablet/design-system 1.14.3 → 1.16.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.
package/dist/index.css CHANGED
@@ -683,6 +683,12 @@
683
683
  overflow-x: hidden;
684
684
  padding: 0.25rem 0;
685
685
  }
686
+ .select_list_up {
687
+ top: auto;
688
+ bottom: 100%;
689
+ margin-top: 0;
690
+ margin-bottom: 0.25rem;
691
+ }
686
692
  .select_option {
687
693
  width: 100%;
688
694
  box-sizing: border-box;
package/dist/index.js CHANGED
@@ -315,7 +315,9 @@ var Select = ({
315
315
  const currentValue = isControlled ? value ?? null : internalValue;
316
316
  const [isOpen, setIsOpen] = React3.useState(false);
317
317
  const [activeIndex, setActiveIndex] = React3.useState(-1);
318
+ const [dropUp, setDropUp] = React3.useState(false);
318
319
  const wrapperRef = React3.useRef(null);
320
+ const controlRef = React3.useRef(null);
319
321
  const currentOption = React3.useMemo(
320
322
  () => options.find((o) => o.value === currentValue) ?? null,
321
323
  [options, currentValue]
@@ -413,6 +415,14 @@ var Select = ({
413
415
  )
414
416
  );
415
417
  }, [isOpen, options, currentValue]);
418
+ React3.useLayoutEffect(() => {
419
+ if (!isOpen || !controlRef.current) return;
420
+ const rect = controlRef.current.getBoundingClientRect();
421
+ const listHeight = Math.min(options.length * 40, 288);
422
+ const spaceBelow = window.innerHeight - rect.bottom;
423
+ const spaceAbove = rect.top;
424
+ setDropUp(spaceBelow < listHeight && spaceAbove > spaceBelow);
425
+ }, [isOpen, options.length]);
416
426
  const rootClassName = ["select", className ?? ""].filter(Boolean).join(" ");
417
427
  const controlClassName = [
418
428
  "select_control",
@@ -439,6 +449,7 @@ var Select = ({
439
449
  /* @__PURE__ */ jsxs(
440
450
  "button",
441
451
  {
452
+ ref: controlRef,
442
453
  id: selectId,
443
454
  type: "button",
444
455
  className: controlClassName,
@@ -466,7 +477,7 @@ var Select = ({
466
477
  {
467
478
  id: `${selectId}_listbox`,
468
479
  role: "listbox",
469
- className: "select_list",
480
+ className: `select_list${dropUp ? " select_list_up" : ""}`,
470
481
  children: options.map((opt, i) => {
471
482
  const selected = currentValue === opt.value;
472
483
  const active = i === activeIndex;
@@ -9,6 +9,11 @@ $color_background_neutral: #F3F3F3;
9
9
  $color_background_muted: #f0f0f0;
10
10
  $color_background_primary: #47555E;
11
11
 
12
+ /* Background - Dark Palette (for modern/tech sections) */
13
+ $color_background_dark: #1E293B;
14
+ $color_background_darker: #0F172A;
15
+ $color_background_darkest: #020617;
16
+
12
17
  /* Text */
13
18
  $color_text_primary: #1a1a1a;
14
19
  $color_text_secondary: #666666;
@@ -30,5 +35,17 @@ $color_error: #ef4444;
30
35
  $color_warning: #f59e0b;
31
36
  $color_info: #3b82f6;
32
37
 
38
+ /* Accent - Tech Blue */
39
+ $color_accent: #3B82F6;
40
+ $color_accent_light: #60A5FA;
41
+ $color_accent_dark: #2563EB;
42
+
33
43
  /* Overlay */
34
- $color_overlay: rgba(0, 0, 0, 0.5);
44
+ $color_overlay: rgba(0, 0, 0, 0.5);
45
+ $color_overlay_light: rgba(0, 0, 0, 0.3);
46
+ $color_overlay_strong: rgba(0, 0, 0, 0.7);
47
+
48
+ /* Glass Effect */
49
+ $color_glass_light: rgba(255, 255, 255, 0.08);
50
+ $color_glass_border: rgba(255, 255, 255, 0.12);
51
+ $color_glass_dark: rgba(0, 0, 0, 0.4);
@@ -1,3 +1,4 @@
1
+ /* Flex Utilities */
1
2
  @mixin flex_center { display: flex; align-items: center; justify-content: center; }
2
3
  @mixin flex_left { display: flex; align-items: center; justify-content: flex-start; }
3
4
  @mixin flex_right { display: flex; align-items: center; justify-content: flex-end; }
@@ -5,4 +6,47 @@
5
6
 
6
7
  @mixin flex_column { display: flex; flex-direction: column; }
7
8
  @mixin flex_column_center { display: flex; flex-direction: column; align-items: center; justify-content: center; }
8
- @mixin flex_column_start { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; }
9
+ @mixin flex_column_start { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; }
10
+
11
+ /* Glass Effect Mixins */
12
+ @mixin glass_light {
13
+ background: rgba(255, 255, 255, 0.08);
14
+ backdrop-filter: blur(12px);
15
+ -webkit-backdrop-filter: blur(12px);
16
+ border: 1px solid rgba(255, 255, 255, 0.12);
17
+ }
18
+
19
+ @mixin glass_dark {
20
+ background: rgba(0, 0, 0, 0.4);
21
+ backdrop-filter: blur(12px);
22
+ -webkit-backdrop-filter: blur(12px);
23
+ border: 1px solid rgba(255, 255, 255, 0.08);
24
+ }
25
+
26
+ @mixin glass_card {
27
+ background: rgba(255, 255, 255, 0.05);
28
+ backdrop-filter: blur(20px);
29
+ -webkit-backdrop-filter: blur(20px);
30
+ border: 1px solid rgba(255, 255, 255, 0.1);
31
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
32
+ }
33
+
34
+ /* Hover Lift Effect */
35
+ @mixin hover_lift($y: -4px, $shadow: 0 12px 24px rgba(0, 0, 0, 0.15)) {
36
+ transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1),
37
+ box-shadow 0.25s cubic-bezier(0.16, 1, 0.3, 1);
38
+
39
+ &:hover {
40
+ transform: translateY($y);
41
+ box-shadow: $shadow;
42
+ }
43
+ }
44
+
45
+ /* Glow on Hover */
46
+ @mixin hover_glow($color: rgba(59, 130, 246, 0.4)) {
47
+ transition: box-shadow 0.3s cubic-bezier(0.16, 1, 0.3, 1);
48
+
49
+ &:hover {
50
+ box-shadow: 0 0 30px $color;
51
+ }
52
+ }
@@ -1,12 +1,28 @@
1
+ /* Base Transitions */
1
2
  $transition_fast: 0.1s ease-in-out; // hover, icon
2
3
  $transition_base: 0.2s ease-in-out; // 메뉴 열림
3
4
  $transition_slow: 0.3s ease-in-out; // 레이아웃 변화
4
5
 
5
- $transition_emphasized: 0.25s cubic-bezier(0.4, 0, 0.2, 1); // Material 계열
6
- $transition_bounce: 0.3s cubic-bezier(0.16, 1, 0.3, 1); // accordion, toast
6
+ /* Easing Curves */
7
+ $ease_out_expo: cubic-bezier(0.16, 1, 0.3, 1);
8
+ $ease_out_quart: cubic-bezier(0.25, 1, 0.5, 1);
9
+ $ease_in_out_cubic: cubic-bezier(0.65, 0, 0.35, 1);
10
+ $ease_spring: cubic-bezier(0.34, 1.56, 0.64, 1);
7
11
 
8
- $transition_fade: 0.15s ease-in-out; // opacity
9
- $transition_slide: 0.25s ease-in-out; // translate
12
+ /* Material / Emphasized */
13
+ $transition_emphasized: 0.25s cubic-bezier(0.4, 0, 0.2, 1);
14
+ $transition_bounce: 0.3s $ease_out_expo;
15
+
16
+ /* Specific Transitions */
17
+ $transition_fade: 0.15s ease-in-out;
18
+ $transition_slide: 0.25s $ease_out_expo;
10
19
  $transition_scale: 0.2s cubic-bezier(0.2, 0.8, 0.2, 1);
20
+ $transition_state: 0.18s ease-in-out;
21
+
22
+ /* Modern/Tech Transitions */
23
+ $transition_smooth: 0.4s $ease_out_expo;
24
+ $transition_spring: 0.5s $ease_spring;
25
+ $transition_dramatic: 0.6s $ease_out_quart;
11
26
 
12
- $transition_state: 0.18s ease-in-out; // disabled → enabled
27
+ /* Hover Lift */
28
+ $transition_lift: transform 0.25s $ease_out_expo, box-shadow 0.25s $ease_out_expo;
@@ -1,4 +1,20 @@
1
+ /* Standard Shadows */
1
2
  $shadow_sm: 0 2px 4px rgba(0, 0, 0, 0.04);
2
3
  $shadow_md: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.04);
3
4
  $shadow_lg: 0 8px 20px rgba(0, 0, 0, 0.12), 0 4px 8px rgba(0, 0, 0, 0.06);
4
- $shadow_xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
5
+ $shadow_xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
6
+ $shadow_2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
7
+
8
+ /* Elevated Shadows (for floating elements) */
9
+ $shadow_elevated: 0 12px 40px -8px rgba(0, 0, 0, 0.2), 0 4px 12px -2px rgba(0, 0, 0, 0.08);
10
+ $shadow_float: 0 20px 60px -15px rgba(0, 0, 0, 0.3);
11
+
12
+ /* Glow Effects (for tech/accent elements) */
13
+ $glow_accent: 0 0 20px rgba(59, 130, 246, 0.35);
14
+ $glow_accent_strong: 0 0 40px rgba(59, 130, 246, 0.5), 0 0 80px rgba(59, 130, 246, 0.25);
15
+ $glow_white: 0 0 20px rgba(255, 255, 255, 0.15);
16
+ $glow_white_strong: 0 0 40px rgba(255, 255, 255, 0.25);
17
+
18
+ /* Inner Shadows */
19
+ $shadow_inner: inset 0 2px 4px rgba(0, 0, 0, 0.06);
20
+ $shadow_inner_lg: inset 0 4px 8px rgba(0, 0, 0, 0.1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigtablet/design-system",
3
- "version": "1.14.3",
3
+ "version": "1.16.0",
4
4
  "description": "Bigtablet Design System UI Components",
5
5
  "type": "module",
6
6
  "types": "dist/index.d.ts",
@@ -94,7 +94,6 @@
94
94
  },
95
95
  "publishConfig": {
96
96
  "access": "public",
97
- "provenance": true,
98
97
  "registry": "https://registry.npmjs.org/"
99
98
  }
100
99
  }
@@ -9,6 +9,11 @@ $color_background_neutral: #F3F3F3;
9
9
  $color_background_muted: #f0f0f0;
10
10
  $color_background_primary: #47555E;
11
11
 
12
+ /* Background - Dark Palette (for modern/tech sections) */
13
+ $color_background_dark: #1E293B;
14
+ $color_background_darker: #0F172A;
15
+ $color_background_darkest: #020617;
16
+
12
17
  /* Text */
13
18
  $color_text_primary: #1a1a1a;
14
19
  $color_text_secondary: #666666;
@@ -30,5 +35,17 @@ $color_error: #ef4444;
30
35
  $color_warning: #f59e0b;
31
36
  $color_info: #3b82f6;
32
37
 
38
+ /* Accent - Tech Blue */
39
+ $color_accent: #3B82F6;
40
+ $color_accent_light: #60A5FA;
41
+ $color_accent_dark: #2563EB;
42
+
33
43
  /* Overlay */
34
- $color_overlay: rgba(0, 0, 0, 0.5);
44
+ $color_overlay: rgba(0, 0, 0, 0.5);
45
+ $color_overlay_light: rgba(0, 0, 0, 0.3);
46
+ $color_overlay_strong: rgba(0, 0, 0, 0.7);
47
+
48
+ /* Glass Effect */
49
+ $color_glass_light: rgba(255, 255, 255, 0.08);
50
+ $color_glass_border: rgba(255, 255, 255, 0.12);
51
+ $color_glass_dark: rgba(0, 0, 0, 0.4);
@@ -1,3 +1,4 @@
1
+ /* Flex Utilities */
1
2
  @mixin flex_center { display: flex; align-items: center; justify-content: center; }
2
3
  @mixin flex_left { display: flex; align-items: center; justify-content: flex-start; }
3
4
  @mixin flex_right { display: flex; align-items: center; justify-content: flex-end; }
@@ -5,4 +6,47 @@
5
6
 
6
7
  @mixin flex_column { display: flex; flex-direction: column; }
7
8
  @mixin flex_column_center { display: flex; flex-direction: column; align-items: center; justify-content: center; }
8
- @mixin flex_column_start { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; }
9
+ @mixin flex_column_start { display: flex; flex-direction: column; align-items: flex-start; justify-content: flex-start; }
10
+
11
+ /* Glass Effect Mixins */
12
+ @mixin glass_light {
13
+ background: rgba(255, 255, 255, 0.08);
14
+ backdrop-filter: blur(12px);
15
+ -webkit-backdrop-filter: blur(12px);
16
+ border: 1px solid rgba(255, 255, 255, 0.12);
17
+ }
18
+
19
+ @mixin glass_dark {
20
+ background: rgba(0, 0, 0, 0.4);
21
+ backdrop-filter: blur(12px);
22
+ -webkit-backdrop-filter: blur(12px);
23
+ border: 1px solid rgba(255, 255, 255, 0.08);
24
+ }
25
+
26
+ @mixin glass_card {
27
+ background: rgba(255, 255, 255, 0.05);
28
+ backdrop-filter: blur(20px);
29
+ -webkit-backdrop-filter: blur(20px);
30
+ border: 1px solid rgba(255, 255, 255, 0.1);
31
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
32
+ }
33
+
34
+ /* Hover Lift Effect */
35
+ @mixin hover_lift($y: -4px, $shadow: 0 12px 24px rgba(0, 0, 0, 0.15)) {
36
+ transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1),
37
+ box-shadow 0.25s cubic-bezier(0.16, 1, 0.3, 1);
38
+
39
+ &:hover {
40
+ transform: translateY($y);
41
+ box-shadow: $shadow;
42
+ }
43
+ }
44
+
45
+ /* Glow on Hover */
46
+ @mixin hover_glow($color: rgba(59, 130, 246, 0.4)) {
47
+ transition: box-shadow 0.3s cubic-bezier(0.16, 1, 0.3, 1);
48
+
49
+ &:hover {
50
+ box-shadow: 0 0 30px $color;
51
+ }
52
+ }
@@ -1,12 +1,28 @@
1
+ /* Base Transitions */
1
2
  $transition_fast: 0.1s ease-in-out; // hover, icon
2
3
  $transition_base: 0.2s ease-in-out; // 메뉴 열림
3
4
  $transition_slow: 0.3s ease-in-out; // 레이아웃 변화
4
5
 
5
- $transition_emphasized: 0.25s cubic-bezier(0.4, 0, 0.2, 1); // Material 계열
6
- $transition_bounce: 0.3s cubic-bezier(0.16, 1, 0.3, 1); // accordion, toast
6
+ /* Easing Curves */
7
+ $ease_out_expo: cubic-bezier(0.16, 1, 0.3, 1);
8
+ $ease_out_quart: cubic-bezier(0.25, 1, 0.5, 1);
9
+ $ease_in_out_cubic: cubic-bezier(0.65, 0, 0.35, 1);
10
+ $ease_spring: cubic-bezier(0.34, 1.56, 0.64, 1);
7
11
 
8
- $transition_fade: 0.15s ease-in-out; // opacity
9
- $transition_slide: 0.25s ease-in-out; // translate
12
+ /* Material / Emphasized */
13
+ $transition_emphasized: 0.25s cubic-bezier(0.4, 0, 0.2, 1);
14
+ $transition_bounce: 0.3s $ease_out_expo;
15
+
16
+ /* Specific Transitions */
17
+ $transition_fade: 0.15s ease-in-out;
18
+ $transition_slide: 0.25s $ease_out_expo;
10
19
  $transition_scale: 0.2s cubic-bezier(0.2, 0.8, 0.2, 1);
20
+ $transition_state: 0.18s ease-in-out;
21
+
22
+ /* Modern/Tech Transitions */
23
+ $transition_smooth: 0.4s $ease_out_expo;
24
+ $transition_spring: 0.5s $ease_spring;
25
+ $transition_dramatic: 0.6s $ease_out_quart;
11
26
 
12
- $transition_state: 0.18s ease-in-out; // disabled → enabled
27
+ /* Hover Lift */
28
+ $transition_lift: transform 0.25s $ease_out_expo, box-shadow 0.25s $ease_out_expo;
@@ -1,4 +1,20 @@
1
+ /* Standard Shadows */
1
2
  $shadow_sm: 0 2px 4px rgba(0, 0, 0, 0.04);
2
3
  $shadow_md: 0 4px 12px rgba(0, 0, 0, 0.08), 0 2px 4px rgba(0, 0, 0, 0.04);
3
4
  $shadow_lg: 0 8px 20px rgba(0, 0, 0, 0.12), 0 4px 8px rgba(0, 0, 0, 0.06);
4
- $shadow_xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
5
+ $shadow_xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
6
+ $shadow_2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
7
+
8
+ /* Elevated Shadows (for floating elements) */
9
+ $shadow_elevated: 0 12px 40px -8px rgba(0, 0, 0, 0.2), 0 4px 12px -2px rgba(0, 0, 0, 0.08);
10
+ $shadow_float: 0 20px 60px -15px rgba(0, 0, 0, 0.3);
11
+
12
+ /* Glow Effects (for tech/accent elements) */
13
+ $glow_accent: 0 0 20px rgba(59, 130, 246, 0.35);
14
+ $glow_accent_strong: 0 0 40px rgba(59, 130, 246, 0.5), 0 0 80px rgba(59, 130, 246, 0.25);
15
+ $glow_white: 0 0 20px rgba(255, 255, 255, 0.15);
16
+ $glow_white_strong: 0 0 40px rgba(255, 255, 255, 0.25);
17
+
18
+ /* Inner Shadows */
19
+ $shadow_inner: inset 0 2px 4px rgba(0, 0, 0, 0.06);
20
+ $shadow_inner_lg: inset 0 4px 8px rgba(0, 0, 0, 0.1);