cclkit4svelte 2.0.2 → 2.0.4

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/Alert.svelte CHANGED
@@ -46,51 +46,51 @@ function dismissAlert() {
46
46
  </script>
47
47
 
48
48
  <div
49
- class="alert-wrapper"
50
- class:dismissible={dismissible}
51
- class:outline={outline}
52
- style="background-color: var({computedBgColor}); color: {textColor}; border-color: var({computedBorderColor});"
49
+ class="alert-wrapper"
50
+ class:dismissible
51
+ class:outline
52
+ style="background-color: var({computedBgColor}); color: {textColor}; border-color: var({computedBorderColor});"
53
53
  >
54
- <span class="alert-message">{message}</span>
55
- {#if dismissible}
56
- <button class="dismiss-button" on:click={dismissAlert} aria-label="Dismiss alert">
57
- &times;
58
- </button>
59
- {/if}
54
+ <span class="alert-message">{message}</span>
55
+ {#if dismissible}
56
+ <button class="dismiss-button" on:click={dismissAlert} aria-label="Dismiss alert">
57
+ &times;
58
+ </button>
59
+ {/if}
60
60
  </div>
61
61
 
62
62
  <style>
63
- .alert-wrapper {
64
- padding: 12px 20px;
65
- border-radius: 8px;
66
- display: flex;
67
- justify-content: space-between;
68
- align-items: center;
69
- font-size: 16px;
70
- font-weight: 500;
71
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
72
- margin-bottom: 10px; /* Add some spacing when multiple alerts are shown */
73
- border: 2px solid; /* Use solid border, color set by style attribute */
74
- }
63
+ .alert-wrapper {
64
+ padding: 12px 20px;
65
+ border-radius: 8px;
66
+ display: flex;
67
+ justify-content: space-between;
68
+ align-items: center;
69
+ font-size: 16px;
70
+ font-weight: 500;
71
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
72
+ margin-bottom: 10px; /* Add some spacing when multiple alerts are shown */
73
+ border: 2px solid; /* Use solid border, color set by style attribute */
74
+ }
75
75
 
76
- .alert-message {
77
- flex-grow: 1;
78
- }
76
+ .alert-message {
77
+ flex-grow: 1;
78
+ }
79
79
 
80
- .dismiss-button {
81
- background: none;
82
- border: none;
83
- color: inherit; /* Inherit text color from parent */
84
- font-size: 20px;
85
- cursor: pointer;
86
- margin-left: 15px;
87
- padding: 0;
88
- line-height: 1;
89
- opacity: 0.7;
90
- transition: opacity 0.2s ease-in-out;
91
- }
80
+ .dismiss-button {
81
+ background: none;
82
+ border: none;
83
+ color: inherit; /* Inherit text color from parent */
84
+ font-size: 20px;
85
+ cursor: pointer;
86
+ margin-left: 15px;
87
+ padding: 0;
88
+ line-height: 1;
89
+ opacity: 0.7;
90
+ transition: opacity 0.2s ease-in-out;
91
+ }
92
92
 
93
- .dismiss-button:hover {
94
- opacity: 1;
95
- }
96
- </style>
93
+ .dismiss-button:hover {
94
+ opacity: 1;
95
+ }
96
+ </style>
@@ -39,4 +39,4 @@ let buttonColor = getButtonColor(bgColor);
39
39
  font-size: 18px;
40
40
  line-height: normal;
41
41
  }
42
- </style>
42
+ </style>
package/dist/Card.svelte CHANGED
@@ -86,4 +86,4 @@ $: bodyColor = getBodyColor(borderColor);
86
86
  text-overflow: ellipsis;
87
87
  overflow: hidden;
88
88
  }
89
- </style>
89
+ </style>
@@ -1,3 +1,5 @@
1
+ <script context="module"></script>
2
+
1
3
  <script>import "./const/variables.css";
2
4
  export let src;
3
5
  export let csWidth;
@@ -12,7 +14,10 @@ const prevSlide = () => {
12
14
  };
13
15
  </script>
14
16
 
15
- <div class="carouselWrapper" style="--carousel-width: {csWidth}; --translate-x: calc(-{currentIndex} * 100%)">
17
+ <div
18
+ class="carouselWrapper"
19
+ style="--carousel-width: {csWidth}; --translate-x: calc(-{currentIndex} * 100%)"
20
+ >
16
21
  <div class="slides">
17
22
  {#each src as item, index}
18
23
  <img class="slide" src={item.src} alt={item.alt} />
@@ -68,4 +73,4 @@ const prevSlide = () => {
68
73
  justify-content: center;
69
74
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.3);
70
75
  }
71
- </style>
76
+ </style>
@@ -1,4 +1,8 @@
1
1
  import { SvelteComponentTyped } from "svelte";
2
+ export interface Imgsrc {
3
+ src: string;
4
+ alt: string;
5
+ }
2
6
  import './const/variables.css';
3
7
  declare const __propDef: {
4
8
  props: {
@@ -0,0 +1,157 @@
1
+ <script>import "./const/variables.css";
2
+ import { CCLVividColor, CCLPastelColor } from "./const/config";
3
+ export let historyItems = [];
4
+ export let height = void 0;
5
+ export let defaultColor = CCLVividColor.SODA_BLUE;
6
+ const vividToPastelMap = {
7
+ [CCLVividColor.STRAWBERRY_PINK]: CCLPastelColor.PEACH_PINK,
8
+ [CCLVividColor.PINEAPPLE_YELLOW]: CCLPastelColor.LEMON_YELLOW,
9
+ [CCLVividColor.SODA_BLUE]: CCLPastelColor.SUGAR_BLUE,
10
+ [CCLVividColor.MELON_GREEN]: CCLPastelColor.MATCHA_GREEN,
11
+ [CCLVividColor.GRAPE_PURPLE]: CCLPastelColor.AKEBI_PURPLE,
12
+ [CCLVividColor.WRAP_GREY]: CCLPastelColor.CLOUD_GREY
13
+ };
14
+ $: defaultPastelColor = vividToPastelMap[defaultColor] || CCLPastelColor.SUGAR_BLUE;
15
+ </script>
16
+
17
+ <div class="change-history-container" style={height ? `height: ${height};` : ''}>
18
+ <ul class="timeline">
19
+ {#each historyItems as item (item.date + item.title)}
20
+ <li
21
+ class="timeline-item"
22
+ style:--marker-color="var({item.color || defaultColor})"
23
+ style:--tag-color="var({item.color || defaultColor})"
24
+ style:--tag-bg-color="var({vividToPastelMap[item.color || defaultColor] || defaultPastelColor})"
25
+ >
26
+ <div class="timeline-marker"></div>
27
+ <div class="timeline-content">
28
+ <div class="header">
29
+ <time class="date" datetime={item.date}>{item.date}</time>
30
+ {#if item.tag}
31
+ <span class="tag">{item.tag}</span>
32
+ {/if}
33
+ {#if item.version}
34
+ <span class="version">{item.version}</span>
35
+ {/if}
36
+ </div>
37
+ <h3 class="title">{item.title}</h3>
38
+ {#if item.details && item.details.length > 0}
39
+ <ul class="details">
40
+ {#each item.details as detail}
41
+ <li>{detail}</li>
42
+ {/each}
43
+ </ul>
44
+ {/if}
45
+ </div>
46
+ </li>
47
+ {/each}
48
+ </ul>
49
+ </div>
50
+
51
+ <style>
52
+ .change-history-container {
53
+ font-family: sans-serif;
54
+ max-width: 800px;
55
+ margin: 0 auto;
56
+ padding: 20px;
57
+ overflow-y: auto;
58
+ }
59
+
60
+ .timeline {
61
+ list-style-type: none;
62
+ padding-left: 20px;
63
+ position: relative;
64
+ }
65
+
66
+ /* タイムラインの縦線 */
67
+ .timeline::before {
68
+ content: '';
69
+ position: absolute;
70
+ top: 5px;
71
+ left: 5px;
72
+ height: calc(100% - 5px);
73
+ width: 2px;
74
+ background-color: #dee2e6;
75
+ }
76
+
77
+ .timeline-item {
78
+ position: relative;
79
+ margin-bottom: 30px;
80
+ padding-left: 35px;
81
+ }
82
+
83
+ .timeline-item:last-child {
84
+ margin-bottom: 0;
85
+ }
86
+
87
+ .timeline-marker {
88
+ position: absolute;
89
+ top: 5px;
90
+ left: -2px;
91
+ width: 16px;
92
+ height: 16px;
93
+ border-radius: 50%;
94
+ background-color: var(--marker-color);
95
+ border: 3px solid #fff;
96
+ z-index: 1;
97
+ }
98
+
99
+ .timeline-content {
100
+ background-color: #ffffff;
101
+ padding: 15px 20px;
102
+ border-radius: 6px;
103
+ border: 1px solid #dee2e6;
104
+ }
105
+
106
+ .header {
107
+ display: flex;
108
+ align-items: center;
109
+ gap: 12px;
110
+ margin-bottom: 8px;
111
+ }
112
+
113
+ .date {
114
+ font-weight: bold;
115
+ color: #343a40;
116
+ }
117
+
118
+ .tag {
119
+ background-color: var(--tag-bg-color);
120
+ color: var(--tag-color);
121
+ padding: 3px 10px;
122
+ border-radius: 12px;
123
+ font-size: 0.85em;
124
+ font-weight: 600;
125
+ }
126
+
127
+ .version {
128
+ background-color: #f1f3f5; /* ニュートラルなグレー */
129
+ color: #495057;
130
+ padding: 3px 10px;
131
+ border-radius: 12px;
132
+ font-size: 0.85em;
133
+ font-weight: 600;
134
+ }
135
+
136
+ .title {
137
+ margin: 0 0 12px 0;
138
+ font-size: 1.15em;
139
+ font-weight: 600;
140
+ color: #212529;
141
+ }
142
+
143
+ .details {
144
+ list-style-type: disc;
145
+ padding-left: 20px;
146
+ margin: 0;
147
+ color: #495057;
148
+ line-height: 1.6;
149
+ }
150
+
151
+ .details li {
152
+ margin-bottom: 5px;
153
+ }
154
+ .details li:last-child {
155
+ margin-bottom: 0;
156
+ }
157
+ </style>
@@ -0,0 +1,28 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ import './const/variables.css';
3
+ declare const __propDef: {
4
+ props: {
5
+ /**
6
+ * 表示する更新履歴の配列
7
+ * @type {HistoryItem[]}
8
+ */ historyItems?: HistoryItem[];
9
+ /**
10
+ * コンポーネントの高さ。'400px'や'50vh'のようにCSSの値を指定します。
11
+ * @type {string | undefined}
12
+ */ height?: string | undefined;
13
+ /**
14
+ * アイテムに色が指定されていない場合のデフォルトカラー。`CCLVividColor`の値を指定します。
15
+ * @type {string}
16
+ */ defaultColor?: string;
17
+ };
18
+ events: {
19
+ [evt: string]: CustomEvent<any>;
20
+ };
21
+ slots: {};
22
+ };
23
+ export type ChangeHistoryProps = typeof __propDef.props;
24
+ export type ChangeHistoryEvents = typeof __propDef.events;
25
+ export type ChangeHistorySlots = typeof __propDef.slots;
26
+ export default class ChangeHistory extends SvelteComponentTyped<ChangeHistoryProps, ChangeHistoryEvents, ChangeHistorySlots> {
27
+ }
28
+ export {};
@@ -6,7 +6,7 @@ export let color = CCLVividColor.SODA_BLUE;
6
6
  export let disabled = false;
7
7
  export let onChange = () => {
8
8
  };
9
- let checkMarkColor = "white";
9
+ const checkMarkColor = "white";
10
10
  function handleChange(event) {
11
11
  if (disabled) {
12
12
  return;
@@ -17,9 +17,19 @@ function handleChange(event) {
17
17
  }
18
18
  </script>
19
19
 
20
- <label class="checkboxWrapper" class:disabled={disabled}>
21
- <input type="checkbox" bind:checked on:change={handleChange} {disabled} aria-label={label} name={label} />
22
- <span class="customCheckbox" style="--bg-color: var({color}); --check-mark-color: {checkMarkColor};">
20
+ <label class="checkboxWrapper" class:disabled>
21
+ <input
22
+ type="checkbox"
23
+ bind:checked
24
+ on:change={handleChange}
25
+ {disabled}
26
+ aria-label={label}
27
+ name={label}
28
+ />
29
+ <span
30
+ class="customCheckbox"
31
+ style="--bg-color: var({color}); --check-mark-color: {checkMarkColor};"
32
+ >
23
33
  {#if checked}
24
34
  <svg
25
35
  class="checkMark"
@@ -6,18 +6,20 @@ export let selectedDate = null;
6
6
  export let placeholder = "\u65E5\u4ED8\u3092\u9078\u629E";
7
7
  export let id = "date-picker-" + Math.random().toString(36).substring(2, 9);
8
8
  export let borderColor = "--strawberry-pink";
9
- export let disableBlurClose = false;
10
9
  let showCalendar = false;
11
10
  let currentMonth = selectedDate ? DateTime.fromJSDate(selectedDate) : DateTime.local();
12
11
  $: formattedDate = selectedDate ? DateTime.fromJSDate(selectedDate).toFormat("yyyy/MM/dd") : "";
13
- function toggleCalendar() {
14
- showCalendar = !showCalendar;
12
+ function openCalendar() {
13
+ showCalendar = true;
14
+ }
15
+ function closeCalendar() {
16
+ showCalendar = false;
15
17
  }
16
18
  function selectDay(day) {
17
19
  const newDate = currentMonth.set({ day }).toJSDate();
18
20
  selectedDate = newDate;
19
21
  dispatch("change", newDate);
20
- showCalendar = false;
22
+ closeCalendar();
21
23
  }
22
24
  function prevMonth() {
23
25
  currentMonth = currentMonth.minus({ months: 1 });
@@ -29,27 +31,59 @@ function getDaysInMonth(date) {
29
31
  const startOfMonth = date.startOf("month");
30
32
  const endOfMonth = date.endOf("month");
31
33
  const days = [];
32
- const startDayOfWeek = startOfMonth.weekday === 7 ? 0 : startOfMonth.weekday;
34
+ const startDayOfWeek = startOfMonth.weekday % 7;
33
35
  for (let i = 0; i < startDayOfWeek; i++) {
34
36
  days.push(null);
35
37
  }
36
38
  for (let i = 1; i <= endOfMonth.day; i++) {
37
39
  days.push(i);
38
40
  }
39
- const remainingDays = 42 - days.length;
40
- for (let i = 0; i < remainingDays; i++) {
41
+ while (days.length < 42) {
41
42
  days.push(null);
42
43
  }
43
44
  return days;
44
45
  }
46
+ function clickOutside(node) {
47
+ const handleClick = (event) => {
48
+ if (node && !node.contains(event.target) && !event.defaultPrevented) {
49
+ node.dispatchEvent(new CustomEvent("click_outside"));
50
+ }
51
+ };
52
+ document.addEventListener("click", handleClick, true);
53
+ return {
54
+ destroy() {
55
+ document.removeEventListener("click", handleClick, true);
56
+ }
57
+ };
58
+ }
45
59
  $: daysInMonth = getDaysInMonth(currentMonth);
46
60
  </script>
47
61
 
48
- <div class="datePickerWrapper" style="--selected-color: var({borderColor});">
49
- <input type="text" {id} value={formattedDate} placeholder={placeholder} on:focus={toggleCalendar} on:blur={() => { if (!disableBlurClose) toggleCalendar(); }} readonly style="border-color: var({borderColor});" />
62
+ <!--
63
+ - `use:clickOutside` でアクションを適用
64
+ - `on:click_outside` で外側クリック時の動作を定義
65
+ -->
66
+ <div
67
+ class="datePickerWrapper"
68
+ style="--selected-color: var({borderColor});"
69
+ use:clickOutside
70
+ on:click_outside={closeCalendar}
71
+ >
72
+ <input
73
+ type="text"
74
+ {id}
75
+ value={formattedDate}
76
+ {placeholder}
77
+ on:focus={openCalendar}
78
+ readonly
79
+ style="border-color: var({borderColor});"
80
+ />
50
81
 
51
82
  {#if showCalendar}
52
- <div class="calendarOverlay" on:mousedown|preventDefault={() => {}}>
83
+ <!--
84
+ - カレンダー内のクリックが外側クリックと誤認されないようにイベントの伝播を止める
85
+ -->
86
+ <div class="calendarOverlay" on:click|stopPropagation>
53
87
  <div class="calendarHeader">
54
88
  <button on:click={prevMonth} aria-label="前月へ">&lt;</button>
55
89
  <span>{currentMonth.toFormat('yyyy年MM月')}</span>
@@ -67,10 +101,13 @@ $: daysInMonth = getDaysInMonth(currentMonth);
67
101
  <div class="daysGrid">
68
102
  {#each daysInMonth as day}
69
103
  <button
70
- class:currentMonthDay={day !== null}
71
- class:selected={selectedDate && day === DateTime.fromJSDate(selectedDate).day && currentMonth.month === DateTime.fromJSDate(selectedDate).month && currentMonth.year === DateTime.fromJSDate(selectedDate).year}
72
- on:click={() => day && selectDay(day)}
73
- disabled={day === null}
104
+ class:currentMonthDay={day !== null}
105
+ class:selected={selectedDate &&
106
+ day === DateTime.fromJSDate(selectedDate).day &&
107
+ currentMonth.month === DateTime.fromJSDate(selectedDate).month &&
108
+ currentMonth.year === DateTime.fromJSDate(selectedDate).year}
109
+ on:click={() => day && selectDay(day)}
110
+ disabled={day === null}
74
111
  >
75
112
  {day !== null ? day : ''}
76
113
  </button>
@@ -81,6 +118,7 @@ $: daysInMonth = getDaysInMonth(currentMonth);
81
118
  </div>
82
119
 
83
120
  <style>
121
+ /* スタイルは変更なし */
84
122
  .datePickerWrapper {
85
123
  position: relative;
86
124
  display: inline-block;
@@ -91,6 +129,11 @@ $: daysInMonth = getDaysInMonth(currentMonth);
91
129
  border: 1px solid #ccc;
92
130
  border-radius: 4px;
93
131
  width: 120px;
132
+ cursor: pointer; /* クリックできることを示す */
133
+ }
134
+
135
+ .datePickerWrapper input:focus {
136
+ outline: none;
94
137
  }
95
138
 
96
139
  .calendarOverlay {
@@ -159,4 +202,4 @@ $: daysInMonth = getDaysInMonth(currentMonth);
159
202
  color: #ccc;
160
203
  cursor: default;
161
204
  }
162
- </style>
205
+ </style>
@@ -22,14 +22,9 @@ declare const __propDef: {
22
22
  * @default --strawberry-pink
23
23
  * @type string
24
24
  */ borderColor?: string;
25
- /**
26
- * blurイベントでカレンダーを閉じないようにするか
27
- * テスト用途で利用
28
- * @default false
29
- * @type boolean
30
- */ disableBlurClose?: boolean;
31
25
  };
32
26
  events: {
27
+ click: MouseEvent;
33
28
  change: CustomEvent<any>;
34
29
  } & {
35
30
  [evt: string]: CustomEvent<any>;
@@ -22,4 +22,4 @@ const year = getYear();
22
22
  color: #fff;
23
23
  font-size: 9px;
24
24
  }
25
- </style>
25
+ </style>
@@ -10,7 +10,7 @@ export let height;
10
10
  href="https://candychupslab.netlify.app/"
11
11
  target="_blank"
12
12
  rel="noopener noreferrer"
13
- style="display: inline-block; height: 100%; width: 100%; display: flex; align-items: center; justify-content: center;"
13
+ style="display: flex; height: 100%; width: 100%; align-items: center; justify-content: center;"
14
14
  >
15
15
  <svg viewBox="0 0 665 63" xmlns="http://www.w3.org/2000/svg">
16
16
  <title>CANDY CHUPS Lab.</title>
@@ -106,4 +106,3 @@ export let height;
106
106
  fill: #fff;
107
107
  }
108
108
  </style>
109
-
@@ -13,40 +13,40 @@ $: finalBackgroundColor = backgroundColor.startsWith("--") ? `var(${backgroundCo
13
13
  </script>
14
14
 
15
15
  <div
16
- class="progress-bar-container"
17
- class:sticky={isSticky}
18
- class:rounded={isRounded}
19
- style="background-color: {finalBackgroundColor}; width: {containerWidth}; height: {height};"
20
- role="progressbar"
21
- aria-valuenow={value}
22
- aria-valuemin="0"
23
- aria-valuemax={maxValue}
16
+ class="progress-bar-container"
17
+ class:sticky={isSticky}
18
+ class:rounded={isRounded}
19
+ style="background-color: {finalBackgroundColor}; width: {containerWidth}; height: {height};"
20
+ role="progressbar"
21
+ aria-valuenow={value}
22
+ aria-valuemin="0"
23
+ aria-valuemax={maxValue}
24
24
  >
25
- <div class="progress-bar" style="width: {progress}%; background-color: {finalBarColor};"></div>
25
+ <div class="progress-bar" style="width: {progress}%; background-color: {finalBarColor};"></div>
26
26
  </div>
27
27
 
28
28
  <style>
29
- .progress-bar-container {
30
- overflow: hidden;
31
- position: relative;
32
- }
29
+ .progress-bar-container {
30
+ overflow: hidden;
31
+ position: relative;
32
+ }
33
33
 
34
- .progress-bar-container.sticky {
35
- position: fixed;
36
- top: 0;
37
- left: 0;
38
- z-index: 9999;
39
- }
34
+ .progress-bar-container.sticky {
35
+ position: fixed;
36
+ top: 0;
37
+ left: 0;
38
+ z-index: 9999;
39
+ }
40
40
 
41
- .progress-bar-container.rounded {
42
- border-radius: 10px;
43
- }
41
+ .progress-bar-container.rounded {
42
+ border-radius: 10px;
43
+ }
44
44
 
45
- .progress-bar {
46
- height: 100%;
47
- }
45
+ .progress-bar {
46
+ height: 100%;
47
+ }
48
48
 
49
- .progress-bar-container.rounded .progress-bar {
50
- border-radius: 10px;
51
- }
49
+ .progress-bar-container.rounded .progress-bar {
50
+ border-radius: 10px;
51
+ }
52
52
  </style>
@@ -8,7 +8,7 @@ export let disabled = false;
8
8
  let circleColor = "white";
9
9
  </script>
10
10
 
11
- <label class="radioWrapper" class:disabled={disabled}>
11
+ <label class="radioWrapper" class:disabled>
12
12
  <input type="radio" bind:group {value} {disabled} aria-label={label} />
13
13
  <span class="customRadio" style="--bg-color: var({color});">
14
14
  {#if group === value}
@@ -0,0 +1,91 @@
1
+ <script>export let serviceName;
2
+ export let description;
3
+ export let imageUrl;
4
+ export let altText;
5
+ export let linkUrl = void 0;
6
+ export let borderColor = "var(--peach-pink)";
7
+ const colorMap = {
8
+ "var(--peach-pink)": "var(--strawberry-pink)",
9
+ "var(--lemon-yellow)": "var(--pineapple-yellow)",
10
+ "var(--sugar-blue)": "var(--soda-blue)",
11
+ "var(--matcha-green)": "var(--melon-green)",
12
+ "var(--akebi-purple)": "var(--grape-purple)",
13
+ "var(--cloud-grey)": "var(--wrap-grey)"
14
+ };
15
+ let borderColorHover;
16
+ $: {
17
+ borderColorHover = colorMap[borderColor] || borderColor;
18
+ }
19
+ const Tag = linkUrl ? "a" : "div";
20
+ </script>
21
+
22
+ <svelte:element
23
+ this={Tag}
24
+ href={linkUrl}
25
+ class="service-card"
26
+ target={linkUrl ? '_blank' : undefined}
27
+ rel={linkUrl ? 'noopener noreferrer' : undefined}
28
+ style="--card-border-color: {borderColor}; --card-border-color-hover: {borderColorHover};"
29
+ >
30
+ <div class="image-container">
31
+ <img src={imageUrl} alt={altText} class="service-image" />
32
+ </div>
33
+ <div class="text-container">
34
+ <h3 class="service-name">{serviceName}</h3>
35
+ <p class="service-description">{description}</p>
36
+ </div>
37
+ </svelte:element>
38
+
39
+ <style>
40
+ .service-card {
41
+ display: flex;
42
+ align-items: center;
43
+ background-color: white;
44
+ border: 1px solid var(--card-border-color);
45
+ border-radius: 8px;
46
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
47
+ padding: 16px;
48
+ margin: 16px;
49
+ max-width: 500px;
50
+ text-decoration: none;
51
+ color: inherit;
52
+ transition: all 0.2s ease-in-out;
53
+ }
54
+
55
+ .service-card:hover {
56
+ transform: translateY(-4px);
57
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
58
+ border-color: var(--card-border-color-hover);
59
+ }
60
+
61
+ .image-container {
62
+ flex-shrink: 0;
63
+ width: 120px;
64
+ height: 120px;
65
+ margin-right: 16px;
66
+ }
67
+
68
+ .service-image {
69
+ width: 100%;
70
+ height: 100%;
71
+ object-fit: cover;
72
+ border-radius: 4px;
73
+ }
74
+
75
+ .text-container {
76
+ flex-grow: 1;
77
+ }
78
+
79
+ .service-name {
80
+ font-size: 1.25rem;
81
+ font-weight: bold;
82
+ color: var(--wrap-grey);
83
+ margin: 0 0 8px 0;
84
+ }
85
+
86
+ .service-description {
87
+ font-size: 1rem;
88
+ color: black;
89
+ margin: 0;
90
+ }
91
+ </style>
@@ -0,0 +1,21 @@
1
+ import { SvelteComponentTyped } from "svelte";
2
+ declare const __propDef: {
3
+ props: {
4
+ serviceName: string;
5
+ description: string;
6
+ imageUrl: string;
7
+ altText: string;
8
+ linkUrl?: string | undefined;
9
+ borderColor?: string;
10
+ };
11
+ events: {
12
+ [evt: string]: CustomEvent<any>;
13
+ };
14
+ slots: {};
15
+ };
16
+ export type ServiceCardProps = typeof __propDef.props;
17
+ export type ServiceCardEvents = typeof __propDef.events;
18
+ export type ServiceCardSlots = typeof __propDef.slots;
19
+ export default class ServiceCard extends SvelteComponentTyped<ServiceCardProps, ServiceCardEvents, ServiceCardSlots> {
20
+ }
21
+ export {};
@@ -5,27 +5,27 @@ export let borderWidth = "4px";
5
5
  </script>
6
6
 
7
7
  <div
8
- class="spinner"
9
- style="width: {size}; height: {size}; border-width: {borderWidth}; --spinner-color: var({color});"
10
- role="status"
8
+ class="spinner"
9
+ style="width: {size}; height: {size}; border-width: {borderWidth}; --spinner-color: var({color});"
10
+ role="status"
11
11
  ></div>
12
12
 
13
13
  <style>
14
- .spinner {
15
- display: inline-block;
16
- border-radius: 50%;
17
- border-style: solid;
18
- border-color: #f3f3f3;
19
- border-top-color: var(--spinner-color);
20
- animation: spin 1s linear infinite;
21
- }
14
+ .spinner {
15
+ display: inline-block;
16
+ border-radius: 50%;
17
+ border-style: solid;
18
+ border-color: #f3f3f3;
19
+ border-top-color: var(--spinner-color);
20
+ animation: spin 1s linear infinite;
21
+ }
22
22
 
23
- @keyframes spin {
24
- 0% {
25
- transform: rotate(0deg);
26
- }
27
- 100% {
28
- transform: rotate(360deg);
29
- }
30
- }
23
+ @keyframes spin {
24
+ 0% {
25
+ transform: rotate(0deg);
26
+ }
27
+ 100% {
28
+ transform: rotate(360deg);
29
+ }
30
+ }
31
31
  </style>
@@ -21,4 +21,4 @@ export let altText;
21
21
  border-radius: 320px;
22
22
  border: 5px solid var(--borderColor);
23
23
  }
24
- </style>
24
+ </style>
@@ -15,7 +15,7 @@ function handleChange(event) {
15
15
  }
16
16
  </script>
17
17
 
18
- <label class="switchWrapper" class:disabled={disabled}>
18
+ <label class="switchWrapper" class:disabled>
19
19
  <input type="checkbox" {checked} on:change={handleChange} {disabled} />
20
20
  <span class="slider" style="--bg-color: var({color});" />
21
21
  </label>
@@ -6,125 +6,134 @@ export let backgroundColor = CCLVividColor.WRAP_GREY;
6
6
  const tooltipId = `tooltip-${Math.random().toString(36).substr(2, 9)}`;
7
7
  </script>
8
8
 
9
- <div class="tooltip-trigger" data-testid="tooltip-trigger" tabindex="0" aria-describedby={!disabled ? tooltipId : undefined}>
10
- <slot />
11
- <span
12
- {...{id: tooltipId}}
13
- style:--tooltip-background-color={backgroundColor.startsWith('--') ? `var(${backgroundColor})` : backgroundColor}
14
- class="tooltip-content"
15
- data-testid="tooltip-content"
16
- class:disabled
17
- class:top={position === 'top'}
18
- class:bottom={position === 'bottom'}
19
- class:left={position === 'left'}
20
- class:right={position === 'right'}
21
- role="tooltip"
22
- >
23
- {text}
24
- </span>
9
+ <div
10
+ class="tooltip-trigger"
11
+ data-testid="tooltip-trigger"
12
+ tabindex="0"
13
+ aria-describedby={!disabled ? tooltipId : undefined}
14
+ >
15
+ <slot />
16
+ <span
17
+ {...{ id: tooltipId }}
18
+ style:--tooltip-background-color={backgroundColor.startsWith('--')
19
+ ? `var(${backgroundColor})`
20
+ : backgroundColor}
21
+ class="tooltip-content"
22
+ data-testid="tooltip-content"
23
+ class:disabled
24
+ class:top={position === 'top'}
25
+ class:bottom={position === 'bottom'}
26
+ class:left={position === 'left'}
27
+ class:right={position === 'right'}
28
+ role="tooltip"
29
+ >
30
+ {text}
31
+ </span>
25
32
  </div>
26
33
 
27
34
  <style>
28
- .tooltip-trigger {
29
- position: relative;
30
- display: inline-block;
31
- cursor: pointer;
32
- }
35
+ .tooltip-trigger {
36
+ position: relative;
37
+ display: inline-block;
38
+ cursor: pointer;
39
+ }
33
40
 
34
- .tooltip-content {
35
- position: absolute;
36
- z-index: 10;
37
- background-color: var(--tooltip-background-color);
38
- color: white;
39
- padding: 0.5em 1em;
40
- border-radius: 4px;
41
- font-size: 0.875rem;
42
- line-height: 1.4;
43
- white-space: nowrap;
44
- /* デフォルトは非表示 */
45
- visibility: hidden;
46
- opacity: 0;
47
- transition: opacity 0.2s, visibility 0.2s;
48
- }
41
+ .tooltip-content {
42
+ position: absolute;
43
+ z-index: 10;
44
+ background-color: var(--tooltip-background-color);
45
+ color: white;
46
+ padding: 0.5em 1em;
47
+ border-radius: 4px;
48
+ font-size: 0.875rem;
49
+ line-height: 1.4;
50
+ white-space: nowrap;
51
+ /* デフォルトは非表示 */
52
+ visibility: hidden;
53
+ opacity: 0;
54
+ transition:
55
+ opacity 0.2s,
56
+ visibility 0.2s;
57
+ }
49
58
 
50
- /* disabledの場合は完全に非表示 */
51
- .tooltip-content.disabled {
52
- display: none;
53
- }
59
+ /* disabledの場合は完全に非表示 */
60
+ .tooltip-content.disabled {
61
+ display: none;
62
+ }
54
63
 
55
- /* ホバーまたはフォーカスで表示 */
56
- .tooltip-trigger:hover .tooltip-content,
57
- .tooltip-trigger:focus .tooltip-content {
58
- visibility: visible;
59
- opacity: 1;
60
- }
64
+ /* ホバーまたはフォーカスで表示 */
65
+ .tooltip-trigger:hover .tooltip-content,
66
+ .tooltip-trigger:focus .tooltip-content {
67
+ visibility: visible;
68
+ opacity: 1;
69
+ }
61
70
 
62
- /* 吹き出しの矢印 */
63
- .tooltip-content::after {
64
- content: '';
65
- position: absolute;
66
- border-style: solid;
67
- }
71
+ /* 吹き出しの矢印 */
72
+ .tooltip-content::after {
73
+ content: '';
74
+ position: absolute;
75
+ border-style: solid;
76
+ }
68
77
 
69
- /* --- ポジションごとのスタイル --- */
78
+ /* --- ポジションごとのスタイル --- */
70
79
 
71
- /* 上に表示 */
72
- .tooltip-content.top {
73
- bottom: 100%;
74
- left: 50%;
75
- transform: translateX(-50%);
76
- margin-bottom: 8px;
77
- }
78
- .tooltip-content.top::after {
79
- top: 100%;
80
- left: 50%;
81
- transform: translateX(-50%);
82
- border-width: 5px;
83
- border-color: var(--tooltip-background-color) transparent transparent transparent;
84
- }
80
+ /* 上に表示 */
81
+ .tooltip-content.top {
82
+ bottom: 100%;
83
+ left: 50%;
84
+ transform: translateX(-50%);
85
+ margin-bottom: 8px;
86
+ }
87
+ .tooltip-content.top::after {
88
+ top: 100%;
89
+ left: 50%;
90
+ transform: translateX(-50%);
91
+ border-width: 5px;
92
+ border-color: var(--tooltip-background-color) transparent transparent transparent;
93
+ }
85
94
 
86
- /* 下に表示 */
87
- .tooltip-content.bottom {
88
- top: 100%;
89
- left: 50%;
90
- transform: translateX(-50%);
91
- margin-top: 8px;
92
- }
93
- .tooltip-content.bottom::after {
94
- bottom: 100%;
95
- left: 50%;
96
- transform: translateX(-50%);
97
- border-width: 5px;
98
- border-color: transparent transparent var(--tooltip-background-color) transparent;
99
- }
95
+ /* 下に表示 */
96
+ .tooltip-content.bottom {
97
+ top: 100%;
98
+ left: 50%;
99
+ transform: translateX(-50%);
100
+ margin-top: 8px;
101
+ }
102
+ .tooltip-content.bottom::after {
103
+ bottom: 100%;
104
+ left: 50%;
105
+ transform: translateX(-50%);
106
+ border-width: 5px;
107
+ border-color: transparent transparent var(--tooltip-background-color) transparent;
108
+ }
100
109
 
101
- /* 左に表示 */
102
- .tooltip-content.left {
103
- right: 100%;
104
- top: 50%;
105
- transform: translateY(-50%);
106
- margin-right: 8px;
107
- }
108
- .tooltip-content.left::after {
109
- left: 100%;
110
- top: 50%;
111
- transform: translateY(-50%);
112
- border-width: 5px;
113
- border-color: transparent transparent transparent var(--tooltip-background-color);
114
- }
110
+ /* 左に表示 */
111
+ .tooltip-content.left {
112
+ right: 100%;
113
+ top: 50%;
114
+ transform: translateY(-50%);
115
+ margin-right: 8px;
116
+ }
117
+ .tooltip-content.left::after {
118
+ left: 100%;
119
+ top: 50%;
120
+ transform: translateY(-50%);
121
+ border-width: 5px;
122
+ border-color: transparent transparent transparent var(--tooltip-background-color);
123
+ }
115
124
 
116
- /* 右に表示 */
117
- .tooltip-content.right {
118
- left: 100%;
119
- top: 50%;
120
- transform: translateY(-50%);
121
- margin-left: 8px;
122
- }
123
- .tooltip-content.right::after {
124
- right: 100%;
125
- top: 50%;
126
- transform: translateY(-50%);
127
- border-width: 5px;
128
- border-color: transparent var(--tooltip-background-color) transparent transparent;
129
- }
125
+ /* 右に表示 */
126
+ .tooltip-content.right {
127
+ left: 100%;
128
+ top: 50%;
129
+ transform: translateY(-50%);
130
+ margin-left: 8px;
131
+ }
132
+ .tooltip-content.right::after {
133
+ right: 100%;
134
+ top: 50%;
135
+ transform: translateY(-50%);
136
+ border-width: 5px;
137
+ border-color: transparent var(--tooltip-background-color) transparent transparent;
138
+ }
130
139
  </style>
package/dist/index.d.ts CHANGED
@@ -20,3 +20,5 @@ export { default as Alert } from './Alert.svelte';
20
20
  export { default as Select } from './Select.svelte';
21
21
  export { default as ToolTip } from './Tooltip.svelte';
22
22
  export { default as Input } from './Input.svelte';
23
+ export { default as ChangeHistory } from './ChangeHistory.svelte';
24
+ export { default as ServiceCard } from './ServiceCard.svelte';
package/dist/index.js CHANGED
@@ -21,3 +21,5 @@ export { default as Alert } from './Alert.svelte';
21
21
  export { default as Select } from './Select.svelte';
22
22
  export { default as ToolTip } from './Tooltip.svelte';
23
23
  export { default as Input } from './Input.svelte';
24
+ export { default as ChangeHistory } from './ChangeHistory.svelte';
25
+ export { default as ServiceCard } from './ServiceCard.svelte';
@@ -1,5 +1,4 @@
1
- import { DateTime } from 'luxon';
2
1
  var getYear = function () {
3
- return DateTime.now().year;
2
+ return new Date().getFullYear();
4
3
  };
5
4
  export { getYear };
package/package.json CHANGED
@@ -1,85 +1,85 @@
1
1
  {
2
- "name": "cclkit4svelte",
3
- "version": "2.0.2",
4
- "author": "reiji1020 <sk@reiji1020.info>",
5
- "license": "MIT",
6
- "type": "module",
7
- "main": "./dist/index.js",
8
- "files": [
9
- "dist"
10
- ],
11
- "repository": "https://github.com/reiji1020/ccl-component-kit4svelte.git",
12
- "bugs": {
13
- "url": "https://github.com/reiji1020/ccl-component-kit4svelte/issues"
14
- },
15
- "homepage": "https://github.com/reiji1020/ccl-component-kit4svelte#readme",
16
- "description": "Component kit for CANDY CHUPS Lab.",
17
- "scripts": {
18
- "preinstall": "npx only-allow pnpm",
19
- "dev": "vite dev",
20
- "build": "vite build",
21
- "preview": "vite preview",
22
- "package": "svelte-package",
23
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
24
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
25
- "lint": "prettier --check . && eslint .",
26
- "format": "prettier --write .",
27
- "storybook": "storybook dev -p 6006",
28
- "build-storybook": "storybook build -o ./public/storybook",
29
- "chromatic": "chromatic",
30
- "test-sb": "test-storybook --coverage"
31
- },
32
- "exports": {
33
- ".": {
34
- "types": "./dist/index.d.ts",
35
- "svelte": "./dist/index.js"
36
- }
37
- },
38
- "dependencies": {
39
- "luxon": "^3.5.0"
40
- },
41
- "devDependencies": {
42
- "@chromatic-com/storybook": "^1.9.0",
43
- "@semantic-release/changelog": "^6.0.3",
44
- "@semantic-release/git": "^10.0.1",
45
- "@storybook/addon-coverage": "^1.0.4",
46
- "@storybook/addon-essentials": "^8.5.8",
47
- "@storybook/addon-interactions": "^8.5.8",
48
- "@storybook/addon-links": "^8.5.8",
49
- "@storybook/addon-mdx-gfm": "^8.5.8",
50
- "@storybook/addon-viewport": "^8.5.8",
51
- "@storybook/blocks": "^8.5.8",
52
- "@storybook/svelte": "^8.5.8",
53
- "@storybook/sveltekit": "^8.5.8",
54
- "@storybook/test": "^8.5.8",
55
- "@storybook/test-runner": "^0.17.0",
56
- "@sveltejs/adapter-auto": "^3.0.0",
57
- "@sveltejs/kit": "^2.0.0",
58
- "@sveltejs/package": "^2.3.0",
59
- "@sveltejs/vite-plugin-svelte": "^3.0.0",
60
- "@types/luxon": "^3.4.2",
61
- "@typescript-eslint/eslint-plugin": "^6.21.0",
62
- "@typescript-eslint/parser": "^6.21.0",
63
- "chromatic": "^11.10.4",
64
- "eslint": "^8.57.1",
65
- "eslint-config-prettier": "^9.1.0",
66
- "eslint-plugin-storybook": "^0.8.0",
67
- "eslint-plugin-svelte": "^2.44.0",
68
- "prettier": "^3.3.3",
69
- "prettier-plugin-svelte": "^3.2.7",
70
- "react": "^18.3.1",
71
- "react-dom": "^18.3.1",
72
- "semantic-release": "^23.1.1",
73
- "storybook": "^8.5.8",
74
- "svelte": "^4.2.7",
75
- "svelte-check": "^3.8.6",
76
- "svelte2tsx": "^0.6.27",
77
- "tslib": "^2.7.0",
78
- "typescript": "^5.0.0",
79
- "vite": "^5.0.0"
80
- },
81
- "volta": {
82
- "node": "20.11.1",
83
- "npm": "10.5.0"
84
- }
2
+ "name": "cclkit4svelte",
3
+ "version": "2.0.4",
4
+ "author": "reiji1020 <sk@reiji1020.info>",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "repository": "https://github.com/reiji1020/ccl-component-kit4svelte.git",
12
+ "bugs": {
13
+ "url": "https://github.com/reiji1020/ccl-component-kit4svelte/issues"
14
+ },
15
+ "homepage": "https://github.com/reiji1020/ccl-component-kit4svelte#readme",
16
+ "description": "Component kit for CANDY CHUPS Lab.",
17
+ "scripts": {
18
+ "preinstall": "npx only-allow pnpm",
19
+ "dev": "vite dev",
20
+ "build": "vite build",
21
+ "preview": "vite preview",
22
+ "package": "svelte-package",
23
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
24
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
25
+ "lint": "prettier --check . && eslint .",
26
+ "format": "prettier --write .",
27
+ "storybook": "storybook dev -p 6006",
28
+ "build-storybook": "storybook build -o ./public/storybook",
29
+ "chromatic": "chromatic",
30
+ "test-sb": "test-storybook --coverage"
31
+ },
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "svelte": "./dist/index.js"
36
+ }
37
+ },
38
+ "dependencies": {
39
+ "luxon": "^3.5.0"
40
+ },
41
+ "devDependencies": {
42
+ "@chromatic-com/storybook": "^1.9.0",
43
+ "@semantic-release/changelog": "^6.0.3",
44
+ "@semantic-release/git": "^10.0.1",
45
+ "@storybook/addon-coverage": "^1.0.4",
46
+ "@storybook/addon-essentials": "^8.5.8",
47
+ "@storybook/addon-interactions": "^8.5.8",
48
+ "@storybook/addon-links": "^8.5.8",
49
+ "@storybook/addon-mdx-gfm": "^8.5.8",
50
+ "@storybook/addon-viewport": "^8.5.8",
51
+ "@storybook/blocks": "^8.5.8",
52
+ "@storybook/svelte": "^8.5.8",
53
+ "@storybook/sveltekit": "^8.5.8",
54
+ "@storybook/test": "^8.5.8",
55
+ "@storybook/test-runner": "^0.17.0",
56
+ "@sveltejs/adapter-auto": "^3.0.0",
57
+ "@sveltejs/kit": "^2.0.0",
58
+ "@sveltejs/package": "^2.3.0",
59
+ "@sveltejs/vite-plugin-svelte": "^3.0.0",
60
+ "@types/luxon": "^3.4.2",
61
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
62
+ "@typescript-eslint/parser": "^6.21.0",
63
+ "chromatic": "^11.10.4",
64
+ "eslint": "^8.57.1",
65
+ "eslint-config-prettier": "^9.1.0",
66
+ "eslint-plugin-storybook": "^0.8.0",
67
+ "eslint-plugin-svelte": "^2.44.0",
68
+ "prettier": "^3.3.3",
69
+ "prettier-plugin-svelte": "^3.2.7",
70
+ "react": "^18.3.1",
71
+ "react-dom": "^18.3.1",
72
+ "semantic-release": "^23.1.1",
73
+ "storybook": "^8.5.8",
74
+ "svelte": "^4.2.7",
75
+ "svelte-check": "^3.8.6",
76
+ "svelte2tsx": "^0.6.27",
77
+ "tslib": "^2.7.0",
78
+ "typescript": "^5.0.0",
79
+ "vite": "^5.0.0"
80
+ },
81
+ "volta": {
82
+ "node": "20.11.1",
83
+ "npm": "10.5.0"
84
+ }
85
85
  }