ds-one 0.2.5-alpha.8 → 0.3.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/DS1/0-face/device.ts +138 -0
  2. package/DS1/0-face/i18n.ts +36 -89
  3. package/DS1/0-face/scaling.ts +152 -0
  4. package/DS1/1-root/fonts/Iosevka-Regular.woff2 +0 -0
  5. package/DS1/1-root/one.css +124 -77
  6. package/DS1/2-core/ds-banner.ts +120 -1
  7. package/DS1/2-core/ds-button.ts +16 -96
  8. package/DS1/2-core/ds-card.ts +137 -0
  9. package/DS1/2-core/ds-cycle.ts +82 -184
  10. package/DS1/2-core/ds-date.ts +3 -10
  11. package/DS1/2-core/ds-gap.ts +38 -0
  12. package/DS1/2-core/ds-icon.ts +6 -35
  13. package/DS1/2-core/ds-input.ts +306 -1
  14. package/DS1/2-core/ds-pagedots.ts +52 -0
  15. package/DS1/2-core/ds-text.ts +55 -28
  16. package/DS1/2-core/ds-tooltip.ts +14 -66
  17. package/DS1/2-core/styles/ds-banner.css +77 -0
  18. package/DS1/2-core/styles/ds-button.css +67 -0
  19. package/DS1/2-core/styles/ds-cycle.css +21 -0
  20. package/DS1/2-core/styles/ds-date.css +9 -0
  21. package/DS1/2-core/styles/ds-gap.css +93 -0
  22. package/DS1/2-core/styles/ds-icon.css +30 -0
  23. package/DS1/2-core/styles/ds-input.css +46 -0
  24. package/DS1/2-core/styles/ds-pagedots.css +31 -0
  25. package/DS1/2-core/styles/ds-text.css +29 -0
  26. package/DS1/2-core/styles/ds-tooltip.css +49 -0
  27. package/DS1/3-unit/ds-accordion.ts +95 -0
  28. package/DS1/3-unit/ds-form.ts +304 -0
  29. package/DS1/3-unit/ds-list.ts +5 -14
  30. package/DS1/3-unit/ds-row.ts +3 -19
  31. package/DS1/3-unit/ds-table.ts +3 -86
  32. package/DS1/3-unit/styles/ds-accordion.css +46 -0
  33. package/DS1/3-unit/styles/ds-list.css +9 -0
  34. package/DS1/3-unit/styles/ds-row.css +19 -0
  35. package/DS1/3-unit/styles/ds-table.css +80 -0
  36. package/DS1/4-page/ds-container.ts +28 -0
  37. package/DS1/4-page/ds-grid.ts +37 -50
  38. package/DS1/4-page/ds-layout.ts +652 -163
  39. package/DS1/4-page/styles/ds-container.css +35 -0
  40. package/DS1/4-page/styles/ds-grid.css +56 -0
  41. package/DS1/4-page/styles/ds-layout.css +246 -0
  42. package/DS1/index.ts +9 -1
  43. package/DS1/vite-env.d.ts +13 -0
  44. package/DS1/x-icon/2x.svg +4 -0
  45. package/DS1/x-icon/2xdots.svg +18 -0
  46. package/DS1/x-icon/2xgrid.svg +6 -0
  47. package/DS1/x-icon/2xlines.svg +6 -0
  48. package/DS1/x-icon/4x4.svg +18 -0
  49. package/DS1/x-icon/apple.svg +4 -0
  50. package/DS1/x-icon/avatar.svg +4 -0
  51. package/DS1/x-icon/big.svg +4 -0
  52. package/DS1/x-icon/blank.svg +3 -0
  53. package/DS1/x-icon/check.svg +3 -0
  54. package/DS1/x-icon/close.svg +3 -0
  55. package/DS1/x-icon/collapse.svg +3 -0
  56. package/DS1/x-icon/color.svg +4 -0
  57. package/DS1/x-icon/column.svg +5 -0
  58. package/DS1/x-icon/default.svg +3 -0
  59. package/DS1/x-icon/delete.svg +5 -0
  60. package/DS1/x-icon/dictate.svg +6 -0
  61. package/DS1/x-icon/do.svg +3 -0
  62. package/DS1/x-icon/down.svg +3 -0
  63. package/DS1/x-icon/duplicate.svg +4 -0
  64. package/DS1/x-icon/gallery.svg +5 -0
  65. package/DS1/x-icon/google.svg +6 -0
  66. package/DS1/x-icon/head.svg +5 -0
  67. package/DS1/x-icon/home.svg +3 -0
  68. package/DS1/x-icon/icon.svg +4 -0
  69. package/DS1/x-icon/in.svg +4 -0
  70. package/DS1/x-icon/lock.svg +5 -0
  71. package/DS1/x-icon/loop.svg +5 -0
  72. package/DS1/x-icon/mic.svg +5 -0
  73. package/DS1/x-icon/minimize.svg +3 -0
  74. package/DS1/x-icon/more.svg +5 -0
  75. package/DS1/x-icon/neutral.svg +6 -0
  76. package/DS1/x-icon/note.svg +6 -0
  77. package/DS1/x-icon/page.svg +4 -0
  78. package/DS1/x-icon/plus.svg +3 -0
  79. package/DS1/x-icon/rewind.svg +4 -0
  80. package/DS1/x-icon/row.svg +5 -0
  81. package/DS1/x-icon/sdown.svg +3 -0
  82. package/DS1/x-icon/search.svg +4 -0
  83. package/DS1/x-icon/see.svg +4 -0
  84. package/DS1/x-icon/ship.svg +5 -0
  85. package/DS1/x-icon/star.svg +3 -0
  86. package/DS1/x-icon/status.svg +4 -0
  87. package/DS1/x-icon/sup.svg +3 -0
  88. package/DS1/x-icon/title.svg +3 -0
  89. package/DS1/x-icon/undo.svg +3 -0
  90. package/DS1/x-icon/ungroup.svg +4 -0
  91. package/DS1/x-icon/unhead.svg +3 -0
  92. package/DS1/x-icon/unicon.svg +3 -0
  93. package/DS1/x-icon/unlock.svg +5 -0
  94. package/DS1/x-icon/unmic.svg +6 -0
  95. package/DS1/x-icon/unsee.svg +5 -0
  96. package/DS1/x-icon/unstar.svg +3 -0
  97. package/DS1/x-icon/untitle.svg +3 -0
  98. package/DS1/x-icon/up.svg +3 -0
  99. package/LICENSE +1 -1
  100. package/README.md +4 -4
  101. package/dist/0-face/device.d.ts +5 -0
  102. package/dist/0-face/device.d.ts.map +1 -1
  103. package/dist/0-face/device.js +111 -0
  104. package/dist/0-face/i18n.d.ts +0 -2
  105. package/dist/0-face/i18n.d.ts.map +1 -1
  106. package/dist/0-face/i18n.js +36 -73
  107. package/dist/0-face/scaling.d.ts +48 -0
  108. package/dist/0-face/scaling.d.ts.map +1 -0
  109. package/dist/0-face/scaling.js +114 -0
  110. package/dist/2-core/ds-banner.d.ts +67 -0
  111. package/dist/2-core/ds-banner.d.ts.map +1 -1
  112. package/dist/2-core/ds-banner.js +97 -1
  113. package/dist/2-core/ds-button.d.ts +4 -20
  114. package/dist/2-core/ds-button.d.ts.map +1 -1
  115. package/dist/2-core/ds-button.js +14 -88
  116. package/dist/2-core/ds-card.d.ts +39 -0
  117. package/dist/2-core/ds-card.d.ts.map +1 -0
  118. package/dist/2-core/ds-card.js +119 -0
  119. package/dist/2-core/ds-cycle.d.ts +1 -5
  120. package/dist/2-core/ds-cycle.d.ts.map +1 -1
  121. package/dist/2-core/ds-cycle.js +79 -166
  122. package/dist/2-core/ds-date.d.ts.map +1 -1
  123. package/dist/2-core/ds-date.js +3 -9
  124. package/dist/2-core/ds-gap.d.ts +28 -0
  125. package/dist/2-core/ds-gap.d.ts.map +1 -0
  126. package/dist/2-core/ds-gap.js +25 -0
  127. package/dist/2-core/ds-icon.d.ts.map +1 -1
  128. package/dist/2-core/ds-icon.js +6 -35
  129. package/dist/2-core/ds-input.d.ts +127 -0
  130. package/dist/2-core/ds-input.d.ts.map +1 -1
  131. package/dist/2-core/ds-input.js +252 -1
  132. package/dist/2-core/ds-pagedots.d.ts +32 -0
  133. package/dist/2-core/ds-pagedots.d.ts.map +1 -0
  134. package/dist/2-core/ds-pagedots.js +36 -0
  135. package/dist/2-core/ds-text.d.ts +5 -3
  136. package/dist/2-core/ds-text.d.ts.map +1 -1
  137. package/dist/2-core/ds-text.js +49 -27
  138. package/dist/2-core/ds-tooltip.d.ts +3 -3
  139. package/dist/2-core/ds-tooltip.d.ts.map +1 -1
  140. package/dist/2-core/ds-tooltip.js +13 -65
  141. package/dist/2-core/styles/ds-banner.css +77 -0
  142. package/dist/2-core/styles/ds-button.css +67 -0
  143. package/dist/2-core/styles/ds-cycle.css +21 -0
  144. package/dist/2-core/styles/ds-date.css +9 -0
  145. package/dist/2-core/styles/ds-gap.css +93 -0
  146. package/dist/2-core/styles/ds-icon.css +30 -0
  147. package/dist/2-core/styles/ds-input.css +46 -0
  148. package/dist/2-core/styles/ds-pagedots.css +26 -0
  149. package/dist/2-core/styles/ds-text.css +29 -0
  150. package/dist/2-core/styles/ds-tooltip.css +49 -0
  151. package/dist/3-unit/ds-accordion.d.ts +47 -0
  152. package/dist/3-unit/ds-accordion.d.ts.map +1 -0
  153. package/dist/3-unit/ds-accordion.js +75 -0
  154. package/dist/3-unit/ds-form.d.ts +70 -0
  155. package/dist/3-unit/ds-form.d.ts.map +1 -0
  156. package/dist/3-unit/ds-form.js +232 -0
  157. package/dist/3-unit/ds-list.d.ts.map +1 -1
  158. package/dist/3-unit/ds-list.js +5 -11
  159. package/dist/3-unit/ds-row.d.ts.map +1 -1
  160. package/dist/3-unit/ds-row.js +3 -19
  161. package/dist/3-unit/ds-table.d.ts.map +1 -1
  162. package/dist/3-unit/ds-table.js +3 -86
  163. package/dist/3-unit/styles/ds-accordion.css +46 -0
  164. package/dist/3-unit/styles/ds-list.css +9 -0
  165. package/dist/3-unit/styles/ds-row.css +19 -0
  166. package/dist/3-unit/styles/ds-table.css +80 -0
  167. package/dist/{3-unit/row-v1.d.ts → 4-page/ds-container.d.ts} +3 -11
  168. package/dist/4-page/ds-container.d.ts.map +1 -0
  169. package/dist/4-page/ds-container.js +11 -0
  170. package/dist/4-page/ds-grid.d.ts +5 -0
  171. package/dist/4-page/ds-grid.d.ts.map +1 -1
  172. package/dist/4-page/ds-grid.js +38 -56
  173. package/dist/4-page/ds-layout.d.ts +3 -3
  174. package/dist/4-page/ds-layout.d.ts.map +1 -1
  175. package/dist/4-page/ds-layout.js +651 -162
  176. package/dist/4-page/styles/ds-container.css +35 -0
  177. package/dist/4-page/styles/ds-grid.css +56 -0
  178. package/dist/4-page/styles/ds-layout.css +251 -0
  179. package/dist/ds-one.bundle.css +700 -0
  180. package/dist/ds-one.bundle.css.map +7 -0
  181. package/dist/ds-one.bundle.js +2728 -1597
  182. package/dist/ds-one.bundle.js.map +1 -7
  183. package/dist/ds-one.bundle.min.css +2 -0
  184. package/dist/ds-one.bundle.min.css.map +7 -0
  185. package/dist/ds-one.bundle.min.js +3850 -546
  186. package/dist/ds-one.bundle.min.js.map +1 -7
  187. package/dist/index.d.ts +9 -1
  188. package/dist/index.d.ts.map +1 -1
  189. package/dist/index.js +9 -1
  190. package/package.json +4 -3
  191. package/dist/3-unit/doublenav-v1.d.ts +0 -51
  192. package/dist/3-unit/doublenav-v1.d.ts.map +0 -1
  193. package/dist/3-unit/doublenav-v1.js +0 -88
  194. package/dist/3-unit/ds-portfolio-doublenav.d.ts +0 -51
  195. package/dist/3-unit/ds-portfolio-doublenav.d.ts.map +0 -1
  196. package/dist/3-unit/ds-portfolio-doublenav.js +0 -88
  197. package/dist/3-unit/ds-portfolio-panel.d.ts +0 -11
  198. package/dist/3-unit/ds-portfolio-panel.d.ts.map +0 -1
  199. package/dist/3-unit/ds-portfolio-panel.js +0 -16
  200. package/dist/3-unit/ds-portfolio-singlenav.d.ts +0 -32
  201. package/dist/3-unit/ds-portfolio-singlenav.d.ts.map +0 -1
  202. package/dist/3-unit/ds-portfolio-singlenav.js +0 -62
  203. package/dist/3-unit/list-v1.d.ts +0 -11
  204. package/dist/3-unit/list-v1.d.ts.map +0 -1
  205. package/dist/3-unit/list-v1.js +0 -15
  206. package/dist/3-unit/panel-v1.d.ts +0 -11
  207. package/dist/3-unit/panel-v1.d.ts.map +0 -1
  208. package/dist/3-unit/panel-v1.js +0 -16
  209. package/dist/3-unit/row-v1.d.ts.map +0 -1
  210. package/dist/3-unit/row-v1.js +0 -32
  211. package/dist/3-unit/singlenav-v1.d.ts +0 -32
  212. package/dist/3-unit/singlenav-v1.d.ts.map +0 -1
  213. package/dist/3-unit/singlenav-v1.js +0 -62
@@ -0,0 +1,67 @@
1
+ /* ds-button.css */
2
+ /* Core button component styles */
3
+
4
+ button {
5
+ max-height: calc(var(--08) * var(--sf));
6
+ display: inline-flex;
7
+ align-items: center;
8
+ justify-content: center;
9
+ border: none;
10
+ cursor: pointer;
11
+ padding: 0 calc(0.5px * var(--sf));
12
+ color: var(--button-text-color);
13
+ font-family: var(--typeface-regular);
14
+ }
15
+
16
+ button.title {
17
+ background-color: var(--button-background-color-secondary);
18
+ color: var(--button-text-color);
19
+ }
20
+
21
+ button.primary {
22
+ background-color: var(--accent-color);
23
+ color: var(--button-text-color);
24
+ text-decoration-line: none;
25
+ font-family: var(--typeface-regular);
26
+ }
27
+
28
+ button.secondary {
29
+ background-color: var(--button-background-color-secondary);
30
+ color: var(--button-text-color);
31
+ font-family: var(--typeface-regular);
32
+ }
33
+
34
+ button.text {
35
+ background-color: transparent;
36
+ color: var(--button-color, var(--button-text-color));
37
+ font-family: var(--typeface-regular);
38
+ padding: 0;
39
+ text-decoration: none;
40
+ }
41
+
42
+ button.text:hover {
43
+ opacity: 0.8;
44
+ text-decoration: none;
45
+ }
46
+
47
+ button[bold] {
48
+ font-weight: var(--type-weight-bold);
49
+ font-family: var(--typeface-medium);
50
+ }
51
+
52
+ button[no-background] {
53
+ background-color: transparent;
54
+ max-height: var(--1);
55
+ padding: 0;
56
+ color: var(--button-color, var(--button-text-color-secondary));
57
+ }
58
+
59
+ button[no-background][bold] {
60
+ font-weight: var(--type-weight-bold);
61
+ font-family: var(--typeface-medium);
62
+ color: var(--button-color, var(--button-text-color-secondary));
63
+ }
64
+
65
+ .loading {
66
+ opacity: 0.7;
67
+ }
@@ -0,0 +1,21 @@
1
+ /* ds-cycle.css */
2
+ /* Cycle component styles for cycling through options */
3
+
4
+ :host {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ }
8
+
9
+ .cycle {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ gap: var(--025);
13
+ }
14
+
15
+ .color-preview {
16
+ width: var(--05);
17
+ height: var(--05);
18
+ border-radius: 999px;
19
+ border: 1px solid color-mix(in srgb, var(--text-color-primary) 20%, transparent);
20
+ flex: 0 0 auto;
21
+ }
@@ -0,0 +1,9 @@
1
+ /* ds-date.css */
2
+ /* Date component styles for displaying the current year */
3
+
4
+ :host {
5
+ display: inline;
6
+ font-family: var(--typeface-regular, var(--typeface-regular-regular));
7
+ font-size: inherit;
8
+ color: inherit;
9
+ }
@@ -0,0 +1,93 @@
1
+ /* ds-gap.css */
2
+ /* Full-width vertical spacer styles */
3
+
4
+ :host {
5
+ display: block;
6
+ width: 100%;
7
+ /* Default if no attribute is provided */
8
+ --gap-size: var(--unit);
9
+ height: var(--gap-size);
10
+ flex: 0 0 auto;
11
+ }
12
+
13
+ /* Semantic sizing tokens (from DS1/1-root/one.css) */
14
+ :host([tenth]) {
15
+ --gap-size: var(--tenth);
16
+ }
17
+
18
+ :host([quarter]) {
19
+ --gap-size: var(--quarter);
20
+ }
21
+
22
+ :host([half]) {
23
+ --gap-size: var(--half);
24
+ }
25
+
26
+ :host([eight-tenth]) {
27
+ --gap-size: var(--eight-tenth);
28
+ }
29
+
30
+ :host([unit]) {
31
+ --gap-size: var(--unit);
32
+ }
33
+
34
+ :host([double]) {
35
+ --gap-size: var(--double);
36
+ }
37
+
38
+ :host([triple]) {
39
+ --gap-size: var(--triple);
40
+ }
41
+
42
+ :host([quad]) {
43
+ --gap-size: var(--quad);
44
+ }
45
+
46
+ :host([oct]) {
47
+ --gap-size: var(--oct);
48
+ }
49
+
50
+ :host([dozen]) {
51
+ --gap-size: var(--dozen);
52
+ }
53
+
54
+ /* Raw scale sizing (size="...") */
55
+ :host([size="01"]) {
56
+ --gap-size: var(--01);
57
+ }
58
+
59
+ :host([size="025"]) {
60
+ --gap-size: var(--025);
61
+ }
62
+
63
+ :host([size="05"]) {
64
+ --gap-size: var(--05);
65
+ }
66
+
67
+ :host([size="08"]) {
68
+ --gap-size: var(--08);
69
+ }
70
+
71
+ :host([size="1"]) {
72
+ --gap-size: var(--1);
73
+ }
74
+
75
+ :host([size="2"]) {
76
+ --gap-size: var(--2);
77
+ }
78
+
79
+ :host([size="3"]) {
80
+ --gap-size: var(--3);
81
+ }
82
+
83
+ :host([size="4"]) {
84
+ --gap-size: var(--4);
85
+ }
86
+
87
+ :host([size="8"]) {
88
+ --gap-size: var(--8);
89
+ }
90
+
91
+ :host([size="12"]) {
92
+ --gap-size: var(--12);
93
+ }
@@ -0,0 +1,30 @@
1
+ /* ds-icon.css */
2
+ /* Icon component styles */
3
+
4
+ :host {
5
+ display: inline-flex;
6
+ justify-content: center;
7
+ align-items: center;
8
+ width: calc(16px * var(--sf));
9
+ height: calc(16px * var(--sf));
10
+ /* Notes style color variable for future implementation */
11
+ --notes-style-color: #ffb6b9;
12
+ }
13
+
14
+ svg {
15
+ width: 100%;
16
+ height: 100%;
17
+ fill: var(--icon-color, currentColor);
18
+ }
19
+
20
+ path {
21
+ fill: var(--icon-color, currentColor);
22
+ }
23
+
24
+ .icon-container {
25
+ display: flex;
26
+ justify-content: center;
27
+ align-items: center;
28
+ width: calc(16px * var(--sf));
29
+ height: calc(16px * var(--sf));
30
+ }
@@ -0,0 +1,46 @@
1
+ /* ds-input.css */
2
+ /* Input component styles */
3
+
4
+ :host {
5
+ display: block;
6
+ width: 100%;
7
+ }
8
+
9
+ input {
10
+ background: var(--base-light-grey, #e8e8e8);
11
+ border: none;
12
+ padding: 0 calc(2px * var(--sf, 1));
13
+ border-radius: 4px;
14
+ font-size: var(--type-size-default);
15
+ font-family: var(
16
+ --typeface-regular,
17
+ -apple-system,
18
+ BlinkMacSystemFont,
19
+ "Segoe UI",
20
+ Roboto,
21
+ sans-serif
22
+ );
23
+ color: var(--base-darker-grey, #797979);
24
+ line-height: calc(20px * var(--sf, 1));
25
+ letter-spacing: calc(-0.4px * var(--sf, 1));
26
+ opacity: 0.5;
27
+ height: calc(28px * var(--sf, 1));
28
+ width: 100%;
29
+ box-sizing: border-box;
30
+ }
31
+
32
+ input:focus {
33
+ outline: none;
34
+ opacity: 1;
35
+ color: var(--base-slate, #1e1e1e);
36
+ }
37
+
38
+ input::placeholder {
39
+ color: var(--base-darker-grey, #797979);
40
+ opacity: 0.5;
41
+ }
42
+
43
+ input:disabled {
44
+ cursor: not-allowed;
45
+ opacity: 0.5;
46
+ }
@@ -0,0 +1,31 @@
1
+ /* ds-pagedots.css */
2
+ /* Page dots indicator component styles for carousels and pagination */
3
+
4
+ :host {
5
+ display: flex;
6
+ gap: calc(11.2px * var(--sf, 1));
7
+ justify-content: center;
8
+ align-items: center;
9
+ height: calc(28px * var(--sf, 1));
10
+ }
11
+
12
+ .dot {
13
+ width: calc(2.8px * var(--sf, 1));
14
+ height: calc(2.8px * var(--sf, 1));
15
+ border-radius: 50%;
16
+ background: white;
17
+ border: calc(0.7px * var(--sf, 1)) solid #696969;
18
+ transition: background 0.2s ease, border 0.2s ease;
19
+ }
20
+
21
+ .dot.active {
22
+ background: #666;
23
+ border: none;
24
+ }
25
+
26
+
27
+
28
+
29
+
30
+
31
+
@@ -0,0 +1,29 @@
1
+ /* ds-text.css */
2
+ /* Text component styles for displaying translations */
3
+
4
+ :host {
5
+ display: inline;
6
+ font-family: var(--typeface-regular);
7
+ font-size: var(--type-size-default);
8
+ font-weight: var(--type-weight-default);
9
+ line-height: calc(var(--type-lineheight-default) * var(--sf));
10
+ letter-spacing: calc(var(--type-letterspacing-default) * var(--sf));
11
+ text-align: var(--text-align-default);
12
+ text-transform: var(--text-transform-default);
13
+ text-decoration: var(--text-decoration-default);
14
+ }
15
+
16
+ :host([data-language="ja"]) {
17
+ font-family: var(--typeface-regular-jp);
18
+ }
19
+
20
+ :host([data-language="zh"]),
21
+ :host([data-language="zh-hant"]) {
22
+ font-family: var(--typeface-regular-zh-hant);
23
+ font-weight: 800;
24
+ }
25
+
26
+ :host([data-language="zh-hans"]) {
27
+ font-family: var(--typeface-regular-zh-hans);
28
+ font-weight: 800;
29
+ }
@@ -0,0 +1,49 @@
1
+ /* ds-tooltip.css */
2
+ /* Tooltip component styles */
3
+
4
+ :host {
5
+ position: relative;
6
+ display: inline-block;
7
+ }
8
+
9
+ .slot-wrapper {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ }
13
+
14
+ .bubble {
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ position: absolute;
19
+ left: 50%;
20
+ bottom: 100%;
21
+ transform: translate(-50%, calc(-2px * var(--sf)));
22
+ z-index: 1000;
23
+ pointer-events: none;
24
+ height: calc(var(--08) * var(--sf));
25
+ opacity: 0;
26
+ transition:
27
+ opacity 120ms ease,
28
+ transform 120ms ease;
29
+ background-color: light-dark(var(--black), var(--white));
30
+ color: light-dark(var(--white), var(--black));
31
+ border-radius: 0;
32
+ font-size: var(--type-size-default);
33
+ padding: 0px calc(1px * var(--sf));
34
+ font-family: var(
35
+ --typeface-regular,
36
+ -apple-system,
37
+ BlinkMacSystemFont,
38
+ "Segoe UI",
39
+ Roboto,
40
+ sans-serif
41
+ );
42
+ font-weight: 500;
43
+ white-space: nowrap;
44
+ min-width: max-content;
45
+ }
46
+
47
+ .bubble.visible {
48
+ opacity: 1;
49
+ }
@@ -0,0 +1,95 @@
1
+ import { LitElement, html, unsafeCSS } from "lit";
2
+ import "../2-core/ds-text";
3
+ import "../2-core/ds-icon";
4
+ import "./ds-row";
5
+ import styles from "./styles/ds-accordion.css?inline";
6
+
7
+ /**
8
+ * Native accordion using <details>/<summary> (no JS toggle logic).
9
+ *
10
+ * Usage (with translation text):
11
+ * <ds-accordion summary="How it began" details="Designed in Hokkaido"></ds-accordion>
12
+ *
13
+ * Usage (with slotted details content):
14
+ * <ds-accordion summary="How it began">
15
+ * <div slot="details">Rich HTML content here</div>
16
+ * </ds-accordion>
17
+ */
18
+ export class Accordion extends LitElement {
19
+ static properties = {
20
+ summary: { type: String },
21
+ details: { type: String },
22
+ open: { type: Boolean, reflect: true },
23
+ _hasSlottedContent: { type: Boolean, state: true },
24
+ };
25
+
26
+ declare summary: string;
27
+ declare details: string;
28
+ declare open: boolean;
29
+ declare _hasSlottedContent: boolean;
30
+
31
+ constructor() {
32
+ super();
33
+ this.summary = "";
34
+ this.details = "";
35
+ this.open = false;
36
+ this._hasSlottedContent = false;
37
+ }
38
+
39
+ static styles = unsafeCSS(styles);
40
+
41
+ private _handleSlotChange(e: Event) {
42
+ const slot = e.target as HTMLSlotElement;
43
+ const assignedNodes = slot.assignedNodes({ flatten: true });
44
+ // Filter out empty text nodes (whitespace only)
45
+ const hasContent = assignedNodes.some(
46
+ (node) =>
47
+ node.nodeType === Node.ELEMENT_NODE ||
48
+ (node.nodeType === Node.TEXT_NODE && node.textContent?.trim())
49
+ );
50
+ this._hasSlottedContent = hasContent;
51
+ }
52
+
53
+ render() {
54
+ return html`
55
+ <details ?open=${this.open}>
56
+ <summary>
57
+ <ds-row class="summaryRow" type="centered">
58
+ <ds-text .text=${this.summary}></ds-text>
59
+ <ds-icon class="chevron" aria-hidden="true">
60
+ <svg
61
+ viewBox="0 0 10.157 8.219"
62
+ xmlns="http://www.w3.org/2000/svg"
63
+ aria-hidden="true"
64
+ focusable="false"
65
+ >
66
+ <path
67
+ d="M5.078 8.219L0 3.141L1.414 1.727L5.078 5.391L8.743 1.727L10.157 3.141L5.078 8.219Z"
68
+ fill="currentColor"
69
+ />
70
+ </svg>
71
+ </ds-icon>
72
+ </ds-row>
73
+ </summary>
74
+
75
+ <div class="detailsBody">
76
+ <slot name="details" @slotchange=${this._handleSlotChange}></slot>
77
+ ${!this._hasSlottedContent
78
+ ? html`<ds-text
79
+ class="detailsText"
80
+ .text=${this.details}
81
+ ></ds-text>`
82
+ : ""}
83
+ </div>
84
+ </details>
85
+ `;
86
+ }
87
+ }
88
+
89
+ customElements.define("ds-accordion", Accordion);
90
+
91
+ declare global {
92
+ interface HTMLElementTagNameMap {
93
+ "ds-accordion": Accordion;
94
+ }
95
+ }