ds-one 0.2.5-alpha.17 → 0.2.5-alpha.19

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 (199) hide show
  1. package/DS1/0-face/device.ts +130 -0
  2. package/DS1/0-face/scaling.ts +152 -0
  3. package/DS1/1-root/one.css +48 -18
  4. package/DS1/2-core/ds-banner.ts +3 -77
  5. package/DS1/2-core/ds-button.ts +3 -67
  6. package/DS1/2-core/ds-card.ts +137 -0
  7. package/DS1/2-core/ds-cycle.ts +3 -22
  8. package/DS1/2-core/ds-date.ts +3 -9
  9. package/DS1/2-core/ds-gap.ts +3 -75
  10. package/DS1/2-core/ds-icon.ts +3 -33
  11. package/DS1/2-core/ds-input.ts +306 -1
  12. package/DS1/2-core/ds-pagedots.ts +52 -0
  13. package/DS1/2-core/ds-text.ts +3 -29
  14. package/DS1/2-core/ds-tooltip.ts +3 -49
  15. package/DS1/2-core/styles/ds-banner.css +77 -0
  16. package/DS1/2-core/styles/ds-button.css +67 -0
  17. package/DS1/2-core/styles/ds-cycle.css +21 -0
  18. package/DS1/2-core/styles/ds-date.css +9 -0
  19. package/DS1/2-core/styles/ds-gap.css +93 -0
  20. package/DS1/2-core/styles/ds-icon.css +30 -0
  21. package/DS1/2-core/styles/ds-input.css +46 -0
  22. package/DS1/2-core/styles/ds-pagedots.css +27 -0
  23. package/DS1/2-core/styles/ds-text.css +29 -0
  24. package/DS1/2-core/styles/ds-tooltip.css +49 -0
  25. package/DS1/3-unit/ds-accordion.ts +3 -46
  26. package/DS1/3-unit/ds-form.ts +304 -0
  27. package/DS1/3-unit/ds-list.ts +5 -14
  28. package/DS1/3-unit/ds-row.ts +3 -19
  29. package/DS1/3-unit/ds-table.ts +3 -85
  30. package/DS1/3-unit/styles/ds-accordion.css +46 -0
  31. package/DS1/3-unit/styles/ds-list.css +9 -0
  32. package/DS1/3-unit/styles/ds-row.css +19 -0
  33. package/DS1/3-unit/styles/ds-table.css +80 -0
  34. package/DS1/4-page/ds-container.ts +3 -35
  35. package/DS1/4-page/ds-grid.ts +3 -56
  36. package/DS1/4-page/ds-layout.ts +528 -50
  37. package/DS1/4-page/styles/ds-container.css +35 -0
  38. package/DS1/4-page/styles/ds-grid.css +56 -0
  39. package/DS1/4-page/styles/ds-layout.css +251 -0
  40. package/DS1/index.ts +7 -2
  41. package/DS1/vite-env.d.ts +9 -0
  42. package/DS1/x-icon/2x.svg +4 -0
  43. package/DS1/x-icon/2xdots.svg +18 -0
  44. package/DS1/x-icon/2xgrid.svg +6 -0
  45. package/DS1/x-icon/2xlines.svg +6 -0
  46. package/DS1/x-icon/4x4.svg +18 -0
  47. package/DS1/x-icon/apple.svg +4 -0
  48. package/DS1/x-icon/avatar.svg +4 -0
  49. package/DS1/x-icon/big.svg +4 -0
  50. package/DS1/x-icon/blank.svg +3 -0
  51. package/DS1/x-icon/check.svg +3 -0
  52. package/DS1/x-icon/close.svg +3 -0
  53. package/DS1/x-icon/collapse.svg +3 -0
  54. package/DS1/x-icon/color.svg +4 -0
  55. package/DS1/x-icon/column.svg +5 -0
  56. package/DS1/x-icon/default.svg +3 -0
  57. package/DS1/x-icon/delete.svg +5 -0
  58. package/DS1/x-icon/dictate.svg +6 -0
  59. package/DS1/x-icon/do.svg +3 -0
  60. package/DS1/x-icon/down.svg +3 -0
  61. package/DS1/x-icon/duplicate.svg +4 -0
  62. package/DS1/x-icon/gallery.svg +5 -0
  63. package/DS1/x-icon/google.svg +6 -0
  64. package/DS1/x-icon/head.svg +5 -0
  65. package/DS1/x-icon/home.svg +3 -0
  66. package/DS1/x-icon/icon.svg +4 -0
  67. package/DS1/x-icon/in.svg +4 -0
  68. package/DS1/x-icon/lock.svg +5 -0
  69. package/DS1/x-icon/loop.svg +5 -0
  70. package/DS1/x-icon/mic.svg +5 -0
  71. package/DS1/x-icon/minimize.svg +3 -0
  72. package/DS1/x-icon/more.svg +5 -0
  73. package/DS1/x-icon/neutral.svg +6 -0
  74. package/DS1/x-icon/note.svg +6 -0
  75. package/DS1/x-icon/page.svg +4 -0
  76. package/DS1/x-icon/plus.svg +3 -0
  77. package/DS1/x-icon/rewind.svg +4 -0
  78. package/DS1/x-icon/row.svg +5 -0
  79. package/DS1/x-icon/sdown.svg +3 -0
  80. package/DS1/x-icon/search.svg +4 -0
  81. package/DS1/x-icon/see.svg +4 -0
  82. package/DS1/x-icon/ship.svg +5 -0
  83. package/DS1/x-icon/star.svg +3 -0
  84. package/DS1/x-icon/status.svg +4 -0
  85. package/DS1/x-icon/sup.svg +3 -0
  86. package/DS1/x-icon/title.svg +3 -0
  87. package/DS1/x-icon/undo.svg +3 -0
  88. package/DS1/x-icon/ungroup.svg +4 -0
  89. package/DS1/x-icon/unhead.svg +3 -0
  90. package/DS1/x-icon/unicon.svg +3 -0
  91. package/DS1/x-icon/unlock.svg +5 -0
  92. package/DS1/x-icon/unmic.svg +6 -0
  93. package/DS1/x-icon/unsee.svg +5 -0
  94. package/DS1/x-icon/unstar.svg +3 -0
  95. package/DS1/x-icon/untitle.svg +3 -0
  96. package/DS1/x-icon/up.svg +3 -0
  97. package/README.md +2 -2
  98. package/dist/0-face/device.d.ts +5 -0
  99. package/dist/0-face/device.d.ts.map +1 -1
  100. package/dist/0-face/device.js +105 -0
  101. package/dist/0-face/scaling.d.ts +48 -0
  102. package/dist/0-face/scaling.d.ts.map +1 -0
  103. package/dist/0-face/scaling.js +114 -0
  104. package/dist/2-core/ds-banner.d.ts.map +1 -1
  105. package/dist/2-core/ds-banner.js +3 -77
  106. package/dist/2-core/ds-button.d.ts.map +1 -1
  107. package/dist/2-core/ds-button.js +3 -67
  108. package/dist/2-core/ds-card.d.ts +39 -0
  109. package/dist/2-core/ds-card.d.ts.map +1 -0
  110. package/dist/2-core/ds-card.js +119 -0
  111. package/dist/2-core/ds-cycle.d.ts.map +1 -1
  112. package/dist/2-core/ds-cycle.js +3 -22
  113. package/dist/2-core/ds-date.d.ts.map +1 -1
  114. package/dist/2-core/ds-date.js +3 -9
  115. package/dist/2-core/ds-gap.d.ts.map +1 -1
  116. package/dist/2-core/ds-gap.js +3 -75
  117. package/dist/2-core/ds-icon.d.ts.map +1 -1
  118. package/dist/2-core/ds-icon.js +3 -33
  119. package/dist/2-core/ds-input.d.ts +127 -0
  120. package/dist/2-core/ds-input.d.ts.map +1 -1
  121. package/dist/2-core/ds-input.js +252 -1
  122. package/dist/2-core/ds-pagedots.d.ts +32 -0
  123. package/dist/2-core/ds-pagedots.d.ts.map +1 -0
  124. package/dist/2-core/ds-pagedots.js +36 -0
  125. package/dist/2-core/ds-text.d.ts.map +1 -1
  126. package/dist/2-core/ds-text.js +3 -29
  127. package/dist/2-core/ds-tooltip.d.ts.map +1 -1
  128. package/dist/2-core/ds-tooltip.js +3 -49
  129. package/dist/2-core/styles/ds-banner.css +77 -0
  130. package/dist/2-core/styles/ds-button.css +67 -0
  131. package/dist/2-core/styles/ds-cycle.css +21 -0
  132. package/dist/2-core/styles/ds-date.css +9 -0
  133. package/dist/2-core/styles/ds-gap.css +93 -0
  134. package/dist/2-core/styles/ds-icon.css +30 -0
  135. package/dist/2-core/styles/ds-input.css +46 -0
  136. package/dist/2-core/styles/ds-pagedots.css +26 -0
  137. package/dist/2-core/styles/ds-text.css +29 -0
  138. package/dist/2-core/styles/ds-tooltip.css +49 -0
  139. package/dist/3-unit/ds-accordion.d.ts.map +1 -1
  140. package/dist/3-unit/ds-accordion.js +3 -46
  141. package/dist/3-unit/ds-form.d.ts +70 -0
  142. package/dist/3-unit/ds-form.d.ts.map +1 -0
  143. package/dist/3-unit/ds-form.js +232 -0
  144. package/dist/3-unit/ds-list.d.ts.map +1 -1
  145. package/dist/3-unit/ds-list.js +5 -11
  146. package/dist/3-unit/ds-row.d.ts.map +1 -1
  147. package/dist/3-unit/ds-row.js +3 -19
  148. package/dist/3-unit/ds-table.d.ts.map +1 -1
  149. package/dist/3-unit/ds-table.js +3 -85
  150. package/dist/3-unit/styles/ds-accordion.css +46 -0
  151. package/dist/3-unit/styles/ds-list.css +9 -0
  152. package/dist/3-unit/styles/ds-row.css +19 -0
  153. package/dist/3-unit/styles/ds-table.css +80 -0
  154. package/dist/4-page/ds-container.d.ts.map +1 -1
  155. package/dist/4-page/ds-container.js +3 -35
  156. package/dist/4-page/ds-grid.d.ts.map +1 -1
  157. package/dist/4-page/ds-grid.js +3 -56
  158. package/dist/4-page/ds-layout.d.ts +1 -1
  159. package/dist/4-page/ds-layout.d.ts.map +1 -1
  160. package/dist/4-page/ds-layout.js +528 -50
  161. package/dist/4-page/styles/ds-container.css +35 -0
  162. package/dist/4-page/styles/ds-grid.css +56 -0
  163. package/dist/4-page/styles/ds-layout.css +251 -0
  164. package/dist/ds-one.bundle.css +700 -0
  165. package/dist/ds-one.bundle.css.map +7 -0
  166. package/dist/ds-one.bundle.js +1370 -535
  167. package/dist/ds-one.bundle.js.map +4 -4
  168. package/dist/ds-one.bundle.min.css +2 -0
  169. package/dist/ds-one.bundle.min.css.map +7 -0
  170. package/dist/ds-one.bundle.min.js +783 -527
  171. package/dist/ds-one.bundle.min.js.map +4 -4
  172. package/dist/index.d.ts +7 -2
  173. package/dist/index.d.ts.map +1 -1
  174. package/dist/index.js +7 -2
  175. package/package.json +1 -1
  176. package/dist/3-unit/doublenav-v1.d.ts +0 -51
  177. package/dist/3-unit/doublenav-v1.d.ts.map +0 -1
  178. package/dist/3-unit/doublenav-v1.js +0 -88
  179. package/dist/3-unit/ds-portfolio-doublenav.d.ts +0 -51
  180. package/dist/3-unit/ds-portfolio-doublenav.d.ts.map +0 -1
  181. package/dist/3-unit/ds-portfolio-doublenav.js +0 -88
  182. package/dist/3-unit/ds-portfolio-panel.d.ts +0 -11
  183. package/dist/3-unit/ds-portfolio-panel.d.ts.map +0 -1
  184. package/dist/3-unit/ds-portfolio-panel.js +0 -16
  185. package/dist/3-unit/ds-portfolio-singlenav.d.ts +0 -32
  186. package/dist/3-unit/ds-portfolio-singlenav.d.ts.map +0 -1
  187. package/dist/3-unit/ds-portfolio-singlenav.js +0 -62
  188. package/dist/3-unit/list-v1.d.ts +0 -11
  189. package/dist/3-unit/list-v1.d.ts.map +0 -1
  190. package/dist/3-unit/list-v1.js +0 -15
  191. package/dist/3-unit/panel-v1.d.ts +0 -11
  192. package/dist/3-unit/panel-v1.d.ts.map +0 -1
  193. package/dist/3-unit/panel-v1.js +0 -16
  194. package/dist/3-unit/row-v1.d.ts +0 -25
  195. package/dist/3-unit/row-v1.d.ts.map +0 -1
  196. package/dist/3-unit/row-v1.js +0 -32
  197. package/dist/3-unit/singlenav-v1.d.ts +0 -32
  198. package/dist/3-unit/singlenav-v1.d.ts.map +0 -1
  199. package/dist/3-unit/singlenav-v1.js +0 -62
@@ -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,26 @@
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
+
@@ -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
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"ds-accordion.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-accordion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAC5C,OAAO,mBAAmB,CAAC;AAC3B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,UAAU,CAAC;AAElB;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,UAAU;IACvC,MAAM,CAAC,UAAU;;;;;;;;;;;;;MAIf;IAEM,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;;IAStB,MAAM,CAAC,MAAM,0BA4CX;IAEF,MAAM;CA4BP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,SAAS,CAAC;KAC3B;CACF"}
1
+ {"version":3,"file":"ds-accordion.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-accordion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmB,MAAM,KAAK,CAAC;AAClD,OAAO,mBAAmB,CAAC;AAC3B,OAAO,mBAAmB,CAAC;AAC3B,OAAO,UAAU,CAAC;AAGlB;;;;;GAKG;AACH,qBAAa,SAAU,SAAQ,UAAU;IACvC,MAAM,CAAC,UAAU;;;;;;;;;;;;;MAIf;IAEM,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,OAAO,CAAC;;IAStB,MAAM,CAAC,MAAM,0BAAqB;IAElC,MAAM;CA4BP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,SAAS,CAAC;KAC3B;CACF"}
@@ -1,7 +1,8 @@
1
- import { LitElement, html, css } from "lit";
1
+ import { LitElement, html, unsafeCSS } from "lit";
2
2
  import "../2-core/ds-text";
3
3
  import "../2-core/ds-icon";
4
4
  import "./ds-row";
5
+ import styles from "./styles/ds-accordion.css?inline";
5
6
  /**
6
7
  * Native accordion using <details>/<summary> (no JS toggle logic).
7
8
  *
@@ -49,49 +50,5 @@ Accordion.properties = {
49
50
  detailsKey: { type: String, attribute: "details-key" },
50
51
  open: { type: Boolean, reflect: true },
51
52
  };
52
- Accordion.styles = css `
53
- :host {
54
- display: block;
55
- width: calc(240px * var(--sf));
56
- color: var(--text-color-primary);
57
- }
58
-
59
- details {
60
- width: 100%;
61
- }
62
-
63
- summary {
64
- cursor: pointer;
65
- user-select: none;
66
- list-style: none;
67
- outline: none;
68
- }
69
-
70
- summary::-webkit-details-marker {
71
- display: none;
72
- }
73
-
74
- .summaryRow {
75
- width: 100%;
76
- }
77
-
78
- ds-icon.chevron {
79
- transform: rotate(0deg);
80
- transition: transform 140ms ease;
81
- }
82
-
83
- details[open] ds-icon.chevron {
84
- transform: rotate(180deg);
85
- }
86
-
87
- .detailsBody {
88
- padding-top: calc(var(--half) * var(--sf));
89
- }
90
-
91
- .detailsText {
92
- display: block;
93
- white-space: normal;
94
- text-align: left;
95
- }
96
- `;
53
+ Accordion.styles = unsafeCSS(styles);
97
54
  customElements.define("ds-accordion", Accordion);
@@ -0,0 +1,70 @@
1
+ import { LitElement } from "lit";
2
+ export interface FormData {
3
+ [key: string]: string | number | boolean | null;
4
+ }
5
+ export interface FormValidationResult {
6
+ valid: boolean;
7
+ errors: {
8
+ [key: string]: string;
9
+ };
10
+ }
11
+ export declare class Form extends LitElement {
12
+ static properties: {
13
+ action: {
14
+ type: StringConstructor;
15
+ };
16
+ method: {
17
+ type: StringConstructor;
18
+ };
19
+ name: {
20
+ type: StringConstructor;
21
+ };
22
+ novalidate: {
23
+ type: BooleanConstructor;
24
+ reflect: boolean;
25
+ };
26
+ autocomplete: {
27
+ type: StringConstructor;
28
+ };
29
+ _isSubmitting: {
30
+ type: BooleanConstructor;
31
+ state: boolean;
32
+ };
33
+ };
34
+ action: string;
35
+ method: "get" | "post";
36
+ name: string;
37
+ novalidate: boolean;
38
+ autocomplete: "on" | "off";
39
+ _isSubmitting: boolean;
40
+ constructor();
41
+ static styles: import("lit").CSSResult;
42
+ /**
43
+ * Get all form data as an object
44
+ */
45
+ getFormData(): FormData;
46
+ private _collectFormData;
47
+ /**
48
+ * Validate the form
49
+ */
50
+ validate(): FormValidationResult;
51
+ private _validateElement;
52
+ /**
53
+ * Reset the form
54
+ */
55
+ reset(): void;
56
+ private _resetElement;
57
+ /**
58
+ * Submit the form
59
+ */
60
+ submit(): Promise<void>;
61
+ private _handleSubmit;
62
+ private _handleKeydown;
63
+ render(): import("lit-html").TemplateResult<1>;
64
+ }
65
+ declare global {
66
+ interface HTMLElementTagNameMap {
67
+ "ds-form": Form;
68
+ }
69
+ }
70
+ //# sourceMappingURL=ds-form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ds-form.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-form.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,MAAM,WAAW,QAAQ;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAC;CACnC;AAED,qBAAa,IAAK,SAAQ,UAAU;IAClC,MAAM,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;MAOf;IAEM,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,IAAI,GAAG,KAAK,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;;IAY/B,MAAM,CAAC,MAAM,0BAqBX;IAEF;;OAEG;IACH,WAAW,IAAI,QAAQ;IAYvB,OAAO,CAAC,gBAAgB;IA8BxB;;OAEG;IACH,QAAQ,IAAI,oBAAoB;IAoBhC,OAAO,CAAC,gBAAgB;IAmCxB;;OAEG;IACH,KAAK,IAAI,IAAI;IAWb,OAAO,CAAC,aAAa;IA0BrB;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAsD7B,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,cAAc;IAWtB,MAAM;CAeP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,IAAI,CAAC;KACjB;CACF"}
@@ -0,0 +1,232 @@
1
+ // ds-form.ts
2
+ // Form component for handling form submissions and validation
3
+ import { LitElement, html, css } from "lit";
4
+ export class Form extends LitElement {
5
+ constructor() {
6
+ super();
7
+ this.action = "";
8
+ this.method = "post";
9
+ this.name = "";
10
+ this.novalidate = false;
11
+ this.autocomplete = "on";
12
+ this._isSubmitting = false;
13
+ }
14
+ /**
15
+ * Get all form data as an object
16
+ */
17
+ getFormData() {
18
+ const data = {};
19
+ const slot = this.shadowRoot?.querySelector("slot");
20
+ const elements = slot?.assignedElements({ flatten: true }) || [];
21
+ for (const element of elements) {
22
+ this._collectFormData(element, data);
23
+ }
24
+ return data;
25
+ }
26
+ _collectFormData(element, data) {
27
+ // Check if element has name and value properties
28
+ const name = element.getAttribute("name") || element.name;
29
+ if (name) {
30
+ const value = element.value;
31
+ if (value !== undefined) {
32
+ // Handle checkboxes and radio buttons
33
+ if (element instanceof HTMLInputElement &&
34
+ (element.type === "checkbox" || element.type === "radio")) {
35
+ if (element.type === "checkbox") {
36
+ data[name] = element.checked;
37
+ }
38
+ else if (element.type === "radio" && element.checked) {
39
+ data[name] = value;
40
+ }
41
+ }
42
+ else {
43
+ data[name] = value;
44
+ }
45
+ }
46
+ }
47
+ // Recursively check children
48
+ const children = element.shadowRoot?.querySelectorAll("*") || element.querySelectorAll("*");
49
+ children.forEach((child) => {
50
+ this._collectFormData(child, data);
51
+ });
52
+ }
53
+ /**
54
+ * Validate the form
55
+ */
56
+ validate() {
57
+ const result = {
58
+ valid: true,
59
+ errors: {},
60
+ };
61
+ if (this.novalidate) {
62
+ return result;
63
+ }
64
+ const slot = this.shadowRoot?.querySelector("slot");
65
+ const elements = slot?.assignedElements({ flatten: true }) || [];
66
+ for (const element of elements) {
67
+ this._validateElement(element, result);
68
+ }
69
+ return result;
70
+ }
71
+ _validateElement(element, result) {
72
+ const name = element.getAttribute("name") || element.name;
73
+ // Check for custom validation on ds-input elements
74
+ if (element.tagName.toLowerCase() === "ds-input") {
75
+ const input = element;
76
+ if (input.required && !input.value) {
77
+ result.valid = false;
78
+ result.errors[name || "unknown"] = "This field is required";
79
+ }
80
+ }
81
+ // Check native form elements
82
+ if (element instanceof HTMLInputElement ||
83
+ element instanceof HTMLTextAreaElement ||
84
+ element instanceof HTMLSelectElement) {
85
+ if (!element.checkValidity()) {
86
+ result.valid = false;
87
+ result.errors[name || "unknown"] = element.validationMessage;
88
+ }
89
+ }
90
+ // Recursively check children
91
+ const children = element.shadowRoot?.querySelectorAll("*") || element.querySelectorAll("*");
92
+ children.forEach((child) => {
93
+ this._validateElement(child, result);
94
+ });
95
+ }
96
+ /**
97
+ * Reset the form
98
+ */
99
+ reset() {
100
+ const slot = this.shadowRoot?.querySelector("slot");
101
+ const elements = slot?.assignedElements({ flatten: true }) || [];
102
+ for (const element of elements) {
103
+ this._resetElement(element);
104
+ }
105
+ this.dispatchEvent(new CustomEvent("form-reset", { bubbles: true }));
106
+ }
107
+ _resetElement(element) {
108
+ if (element instanceof HTMLInputElement ||
109
+ element instanceof HTMLTextAreaElement ||
110
+ element instanceof HTMLSelectElement) {
111
+ if (element instanceof HTMLInputElement && element.type === "checkbox") {
112
+ element.checked = false;
113
+ }
114
+ else {
115
+ element.value = "";
116
+ }
117
+ }
118
+ // Handle ds-input elements
119
+ if (element.tagName.toLowerCase() === "ds-input") {
120
+ element.value = "";
121
+ }
122
+ // Recursively reset children
123
+ const children = element.shadowRoot?.querySelectorAll("*") || element.querySelectorAll("*");
124
+ children.forEach((child) => {
125
+ this._resetElement(child);
126
+ });
127
+ }
128
+ /**
129
+ * Submit the form
130
+ */
131
+ async submit() {
132
+ if (this._isSubmitting)
133
+ return;
134
+ const validationResult = this.validate();
135
+ if (!validationResult.valid) {
136
+ this.dispatchEvent(new CustomEvent("form-invalid", {
137
+ detail: validationResult.errors,
138
+ bubbles: true,
139
+ }));
140
+ return;
141
+ }
142
+ this._isSubmitting = true;
143
+ const formData = this.getFormData();
144
+ this.dispatchEvent(new CustomEvent("form-submit", {
145
+ detail: { data: formData },
146
+ bubbles: true,
147
+ }));
148
+ // If action is provided, submit to the server
149
+ if (this.action) {
150
+ try {
151
+ const response = await fetch(this.action, {
152
+ method: this.method.toUpperCase(),
153
+ headers: {
154
+ "Content-Type": "application/json",
155
+ },
156
+ body: JSON.stringify(formData),
157
+ });
158
+ this.dispatchEvent(new CustomEvent("form-response", {
159
+ detail: { response, data: formData },
160
+ bubbles: true,
161
+ }));
162
+ }
163
+ catch (error) {
164
+ this.dispatchEvent(new CustomEvent("form-error", {
165
+ detail: { error, data: formData },
166
+ bubbles: true,
167
+ }));
168
+ }
169
+ }
170
+ this._isSubmitting = false;
171
+ }
172
+ _handleSubmit(e) {
173
+ e.preventDefault();
174
+ this.submit();
175
+ }
176
+ _handleKeydown(e) {
177
+ if (e.key === "Enter" && !e.shiftKey) {
178
+ const target = e.target;
179
+ // Don't submit if in a textarea
180
+ if (target.tagName.toLowerCase() !== "textarea") {
181
+ e.preventDefault();
182
+ this.submit();
183
+ }
184
+ }
185
+ }
186
+ render() {
187
+ return html `
188
+ <form
189
+ .action=${this.action}
190
+ .method=${this.method}
191
+ .name=${this.name}
192
+ ?novalidate=${this.novalidate}
193
+ autocomplete=${this.autocomplete}
194
+ @submit=${this._handleSubmit}
195
+ @keydown=${this._handleKeydown}
196
+ >
197
+ <slot></slot>
198
+ </form>
199
+ `;
200
+ }
201
+ }
202
+ Form.properties = {
203
+ action: { type: String },
204
+ method: { type: String },
205
+ name: { type: String },
206
+ novalidate: { type: Boolean, reflect: true },
207
+ autocomplete: { type: String },
208
+ _isSubmitting: { type: Boolean, state: true },
209
+ };
210
+ Form.styles = css `
211
+ :host {
212
+ display: block;
213
+ width: 100%;
214
+ }
215
+
216
+ form {
217
+ display: flex;
218
+ flex-direction: column;
219
+ gap: calc(var(--05) * var(--sf, 1));
220
+ width: 100%;
221
+ }
222
+
223
+ ::slotted(*) {
224
+ width: 100%;
225
+ }
226
+
227
+ :host([disabled]) {
228
+ opacity: 0.6;
229
+ pointer-events: none;
230
+ }
231
+ `;
232
+ customElements.define("ds-form", Form);
@@ -1 +1 @@
1
- {"version":3,"file":"ds-list.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-list.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,qBAAa,IAAK,SAAQ,UAAU;IAClC,MAAM,CAAC,MAAM,0BAOX;IAEF,MAAM;CAGP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,IAAI,CAAC;KACjB;CACF"}
1
+ {"version":3,"file":"ds-list.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-list.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAmB,MAAM,KAAK,CAAC;AAGlD,qBAAa,IAAK,SAAQ,UAAU;IAClC,MAAM,CAAC,MAAM,0BAAqB;IAElC,MAAM;CAGP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,SAAS,EAAE,IAAI,CAAC;KACjB;CACF"}
@@ -1,18 +1,12 @@
1
- // ds-banner.ts
1
+ // ds-list.ts
2
2
  // Unit component that
3
- // can be used to show a list of items consiting of compoentnts from core
4
- import { LitElement, html, css } from "lit";
3
+ // can be used to show a list of items consisting of components from core
4
+ import { LitElement, html, unsafeCSS } from "lit";
5
+ import styles from "./styles/ds-list.css?inline";
5
6
  export class List extends LitElement {
6
7
  render() {
7
8
  return html `<slot></slot>`;
8
9
  }
9
10
  }
10
- List.styles = css `
11
- :host {
12
- display: flex;
13
- flex-direction: column;
14
- gap: 0;
15
- width: 100%;
16
- }
17
- `;
11
+ List.styles = unsafeCSS(styles);
18
12
  customElements.define("ds-list", List);
@@ -1 +1 @@
1
- {"version":3,"file":"ds-row.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-row.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,UAAU,GAAG,IAAI,CAAC;KAC5D;IACD,IAAI,cAAc,EAAE,qBAAqB,CAAC;CAC3C;AAED,qBAAa,GAAI,SAAQ,UAAU;IACjC,MAAM,CAAC,UAAU;;;;;MAEf;IAEM,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;;IAOlC,MAAM,CAAC,MAAM,0BAiBX;IAEF,MAAM;CAGP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,QAAQ,EAAE,GAAG,CAAC;KACf;CACF"}
1
+ {"version":3,"file":"ds-row.d.ts","sourceRoot":"","sources":["../../DS1/3-unit/ds-row.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmB,MAAM,KAAK,CAAC;AAGlD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,UAAU,GAAG,IAAI,CAAC;KAC5D;IACD,IAAI,cAAc,EAAE,qBAAqB,CAAC;CAC3C;AAED,qBAAa,GAAI,SAAQ,UAAU;IACjC,MAAM,CAAC,UAAU;;;;;MAEf;IAEM,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;;IAOlC,MAAM,CAAC,MAAM,0BAAqB;IAElC,MAAM;CAGP;AAID,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,QAAQ,EAAE,GAAG,CAAC;KACf;CACF"}