@neumorphism-ui/elements 1.0.0-next.1 → 1.0.0-next.3

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 (183) hide show
  1. package/README.md +12 -1
  2. package/cdn/neu.min.js +176 -51
  3. package/custom-elements.json +2555 -358
  4. package/dist/all.d.ts +8 -0
  5. package/dist/all.js +8 -0
  6. package/dist/checkbox.d.ts +3 -0
  7. package/dist/checkbox.js +4 -0
  8. package/dist/components/avatar/avatar.d.ts +0 -3
  9. package/dist/components/avatar/avatar.def.d.ts +0 -3
  10. package/dist/components/avatar/avatar.def.js +4 -18
  11. package/dist/components/avatar/avatar.docs.d.ts +2 -0
  12. package/dist/components/avatar/avatar.docs.js +22 -0
  13. package/dist/components/avatar/avatar.js +7 -1
  14. package/dist/components/badge/badge.d.ts +0 -2
  15. package/dist/components/badge/badge.def.d.ts +0 -2
  16. package/dist/components/badge/badge.def.js +1 -14
  17. package/dist/components/badge/badge.docs.d.ts +2 -0
  18. package/dist/components/badge/badge.docs.js +17 -0
  19. package/dist/components/button/button.d.ts +0 -2
  20. package/dist/components/button/button.def.d.ts +0 -5
  21. package/dist/components/button/button.def.js +3 -25
  22. package/dist/components/button/button.docs.d.ts +2 -0
  23. package/dist/components/button/button.docs.js +29 -0
  24. package/dist/components/button/button.js +3 -36
  25. package/dist/components/button-group/button-group.d.ts +0 -2
  26. package/dist/components/button-group/button-group.def.d.ts +0 -2
  27. package/dist/components/button-group/button-group.def.js +1 -10
  28. package/dist/components/button-group/button-group.docs.d.ts +2 -0
  29. package/dist/components/button-group/button-group.docs.js +13 -0
  30. package/dist/components/checkbox/checkbox.d.ts +40 -0
  31. package/dist/components/checkbox/checkbox.def.d.ts +27 -0
  32. package/dist/components/checkbox/checkbox.def.js +21 -0
  33. package/dist/components/checkbox/checkbox.docs.d.ts +2 -0
  34. package/dist/components/checkbox/checkbox.docs.js +27 -0
  35. package/dist/components/checkbox/checkbox.js +40 -0
  36. package/dist/components/checkbox/checkbox.styles.d.ts +1 -0
  37. package/dist/components/checkbox/checkbox.styles.js +28 -0
  38. package/dist/components/divider/divider.d.ts +0 -1
  39. package/dist/components/divider/divider.def.d.ts +0 -1
  40. package/dist/components/divider/divider.def.js +0 -9
  41. package/dist/components/divider/divider.docs.d.ts +2 -0
  42. package/dist/components/divider/divider.docs.js +12 -0
  43. package/dist/components/icon/icon.d.ts +0 -3
  44. package/dist/components/icon/icon.def.d.ts +0 -3
  45. package/dist/components/icon/icon.def.js +3 -10
  46. package/dist/components/icon/icon.docs.d.ts +2 -0
  47. package/dist/components/icon/icon.docs.js +13 -0
  48. package/dist/components/icon/system-icons.d.ts +10 -0
  49. package/dist/components/icon/system-icons.js +22 -11
  50. package/dist/components/icon-button/icon-button.d.ts +0 -5
  51. package/dist/components/icon-button/icon-button.def.d.ts +0 -5
  52. package/dist/components/icon-button/icon-button.def.js +3 -17
  53. package/dist/components/icon-button/icon-button.docs.d.ts +2 -0
  54. package/dist/components/icon-button/icon-button.docs.js +26 -0
  55. package/dist/components/number-field/number-field.d.ts +79 -0
  56. package/dist/components/number-field/number-field.def.d.ts +115 -0
  57. package/dist/components/number-field/number-field.def.js +40 -0
  58. package/dist/components/number-field/number-field.docs.d.ts +2 -0
  59. package/dist/components/number-field/number-field.docs.js +45 -0
  60. package/dist/components/number-field/number-field.js +121 -0
  61. package/dist/components/number-field/number-field.styles.d.ts +1 -0
  62. package/dist/components/number-field/number-field.styles.js +15 -0
  63. package/dist/components/option/option-data.d.ts +8 -0
  64. package/dist/components/option/option-data.js +12 -0
  65. package/dist/components/option/option.d.ts +17 -0
  66. package/dist/components/option/option.def.d.ts +8 -0
  67. package/dist/components/option/option.def.js +12 -0
  68. package/dist/components/option/option.docs.d.ts +2 -0
  69. package/dist/components/option/option.docs.js +12 -0
  70. package/dist/components/option/option.js +17 -0
  71. package/dist/components/option/option.styles.d.ts +2 -0
  72. package/dist/components/option/option.styles.js +5 -0
  73. package/dist/components/radio/radio-link.d.ts +11 -0
  74. package/dist/components/radio/radio-link.js +5 -0
  75. package/dist/components/radio/radio.d.ts +27 -0
  76. package/dist/components/radio/radio.def.d.ts +9 -0
  77. package/dist/components/radio/radio.def.js +12 -0
  78. package/dist/components/radio/radio.docs.d.ts +2 -0
  79. package/dist/components/radio/radio.docs.js +18 -0
  80. package/dist/components/radio/radio.js +43 -0
  81. package/dist/components/radio/radio.styles.d.ts +1 -0
  82. package/dist/components/radio/radio.styles.js +21 -0
  83. package/dist/components/radio-group/radio-group.d.ts +76 -0
  84. package/dist/components/radio-group/radio-group.def.d.ts +36 -0
  85. package/dist/components/radio-group/radio-group.def.js +40 -0
  86. package/dist/components/radio-group/radio-group.docs.d.ts +2 -0
  87. package/dist/components/radio-group/radio-group.docs.js +37 -0
  88. package/dist/components/radio-group/radio-group.js +208 -0
  89. package/dist/components/radio-group/radio-group.styles.d.ts +1 -0
  90. package/dist/components/radio-group/radio-group.styles.js +13 -0
  91. package/dist/components/select/select.d.ts +115 -0
  92. package/dist/components/select/select.def.d.ts +34 -0
  93. package/dist/components/select/select.def.js +35 -0
  94. package/dist/components/select/select.docs.d.ts +2 -0
  95. package/dist/components/select/select.docs.js +65 -0
  96. package/dist/components/select/select.js +391 -0
  97. package/dist/components/select/select.styles.d.ts +1 -0
  98. package/dist/components/select/select.styles.js +35 -0
  99. package/dist/components/shared/checkable.d.ts +45 -0
  100. package/dist/components/shared/checkable.js +108 -0
  101. package/dist/components/shared/field.styles.d.ts +1 -0
  102. package/dist/components/shared/field.styles.js +34 -0
  103. package/dist/components/shared/press.d.ts +7 -0
  104. package/dist/components/shared/press.js +42 -0
  105. package/dist/components/shared/step.d.ts +2 -0
  106. package/dist/components/shared/step.js +2 -0
  107. package/dist/components/shared/text-control.d.ts +72 -0
  108. package/dist/components/shared/text-control.js +191 -0
  109. package/dist/components/slider/slider.d.ts +67 -0
  110. package/dist/components/slider/slider.def.d.ts +37 -0
  111. package/dist/components/slider/slider.def.js +54 -0
  112. package/dist/components/slider/slider.docs.d.ts +2 -0
  113. package/dist/components/slider/slider.docs.js +45 -0
  114. package/dist/components/slider/slider.js +170 -0
  115. package/dist/components/slider/slider.styles.d.ts +1 -0
  116. package/dist/components/slider/slider.styles.js +16 -0
  117. package/dist/components/spinner/spinner.d.ts +0 -1
  118. package/dist/components/spinner/spinner.def.d.ts +0 -1
  119. package/dist/components/spinner/spinner.def.js +1 -13
  120. package/dist/components/spinner/spinner.docs.d.ts +2 -0
  121. package/dist/components/spinner/spinner.docs.js +17 -0
  122. package/dist/components/surface/surface.d.ts +0 -4
  123. package/dist/components/surface/surface.def.d.ts +0 -4
  124. package/dist/components/surface/surface.def.js +3 -12
  125. package/dist/components/surface/surface.docs.d.ts +2 -0
  126. package/dist/components/surface/surface.docs.js +15 -0
  127. package/dist/components/switch/switch.d.ts +4 -35
  128. package/dist/components/switch/switch.def.d.ts +0 -5
  129. package/dist/components/switch/switch.def.js +5 -21
  130. package/dist/components/switch/switch.docs.d.ts +2 -0
  131. package/dist/components/switch/switch.docs.js +26 -0
  132. package/dist/components/switch/switch.js +5 -117
  133. package/dist/components/text-field/implicit-submit.d.ts +5 -0
  134. package/dist/components/text-field/implicit-submit.js +8 -3
  135. package/dist/components/text-field/text-field.d.ts +9 -42
  136. package/dist/components/text-field/text-field.def.d.ts +0 -12
  137. package/dist/components/text-field/text-field.def.js +5 -30
  138. package/dist/components/text-field/text-field.docs.d.ts +2 -0
  139. package/dist/components/text-field/text-field.docs.js +45 -0
  140. package/dist/components/text-field/text-field.js +21 -178
  141. package/dist/components/text-field/text-field.styles.d.ts +1 -1
  142. package/dist/components/text-field/text-field.styles.js +2 -35
  143. package/dist/components/textarea/textarea.d.ts +92 -0
  144. package/dist/components/textarea/textarea.def.d.ts +127 -0
  145. package/dist/components/textarea/textarea.def.js +44 -0
  146. package/dist/components/textarea/textarea.docs.d.ts +2 -0
  147. package/dist/components/textarea/textarea.docs.js +40 -0
  148. package/dist/components/textarea/textarea.js +101 -0
  149. package/dist/components/textarea/textarea.styles.d.ts +1 -0
  150. package/dist/components/textarea/textarea.styles.js +9 -0
  151. package/dist/components/theme-docs.d.ts +3 -0
  152. package/dist/components/theme-docs.js +8 -0
  153. package/dist/core/define.d.ts +20 -2
  154. package/dist/core/dom.d.ts +4 -0
  155. package/dist/core/dom.js +7 -0
  156. package/dist/core/form-control.js +6 -1
  157. package/dist/core/neu-element.d.ts +2 -2
  158. package/dist/core/neu-element.js +10 -7
  159. package/dist/core/props.d.ts +13 -1
  160. package/dist/core/props.js +13 -3
  161. package/dist/core/styles.d.ts +0 -2
  162. package/dist/core/styles.js +0 -7
  163. package/dist/core/validation.d.ts +6 -2
  164. package/dist/core/validation.js +15 -8
  165. package/dist/docs.d.ts +3 -0
  166. package/dist/docs.js +41 -0
  167. package/dist/number-field.d.ts +3 -0
  168. package/dist/number-field.js +4 -0
  169. package/dist/option.d.ts +3 -0
  170. package/dist/option.js +4 -0
  171. package/dist/radio-group.d.ts +4 -0
  172. package/dist/radio-group.js +6 -0
  173. package/dist/radio.d.ts +3 -0
  174. package/dist/radio.js +4 -0
  175. package/dist/select.d.ts +3 -0
  176. package/dist/select.js +4 -0
  177. package/dist/slider.d.ts +3 -0
  178. package/dist/slider.js +4 -0
  179. package/dist/ssr.d.ts +10 -6
  180. package/dist/ssr.js +26 -6
  181. package/dist/textarea.d.ts +3 -0
  182. package/dist/textarea.js +4 -0
  183. package/package.json +45 -1
@@ -1,8 +1,6 @@
1
- import type { DocEntry } from './define.js';
2
1
  /**
3
2
  * Re-declares the derived theme values on every host (spec §5.3). Fallbacks are the light
4
3
  * defaults from @neumorphism-ui/tokens so components still look right without the tokens stylesheet;
5
4
  * styles.test.ts keeps the two in sync.
6
5
  */
7
6
  export declare const hostTheme = "\n:host {\n --_neu-bg: var(--neu-bg, #e0e5ec);\n --_neu-accent-c: var(--neu-accent, #6d5dfc);\n --_neu-d: var(--neu-distance, 6px);\n --_neu-k: var(--neu-intensity, 1);\n --_neu-r: var(--neu-radius, 12px);\n --_neu-danger: var(--neu-danger, #e5484d);\n --_neu-dur: var(--neu-duration, 150ms);\n --_neu-sd: var(--neu-shadow-dark, color-mix(in oklab, var(--_neu-bg), black min(100%, calc(var(--_neu-shade, 18%) * var(--_neu-k)))));\n --_neu-sl: var(--neu-shadow-light, color-mix(in oklab, var(--_neu-bg), white min(100%, calc(var(--_neu-light, 100%) * var(--_neu-k)))));\n --_neu-fg: var(--neu-fg, color-mix(in oklab, var(--_neu-bg), var(--_neu-ink, black) var(--_neu-fg-mix, 32%)));\n --_neu-fg-muted: var(--neu-fg-muted, color-mix(in oklab, var(--_neu-bg), var(--_neu-ink, black) var(--_neu-fg-muted-mix, 18%)));\n --_neu-accent-soft: color-mix(in oklab, var(--_neu-accent-c) 25%, var(--_neu-bg));\n --_neu-focus: 0 0 0 3px color-mix(in oklab, var(--_neu-accent-c) 45%, transparent);\n --_neu-raised: var(--_neu-d) var(--_neu-d) calc(var(--_neu-d) * 2) var(--_neu-sd), calc(var(--_neu-d) * -1) calc(var(--_neu-d) * -1) calc(var(--_neu-d) * 2) var(--_neu-sl);\n --_neu-raised-sm: calc(var(--_neu-d) * 0.5) calc(var(--_neu-d) * 0.5) var(--_neu-d) var(--_neu-sd), calc(var(--_neu-d) * -0.5) calc(var(--_neu-d) * -0.5) var(--_neu-d) var(--_neu-sl);\n --_neu-inset: inset var(--_neu-d) var(--_neu-d) calc(var(--_neu-d) * 2) var(--_neu-sd), inset calc(var(--_neu-d) * -1) calc(var(--_neu-d) * -1) calc(var(--_neu-d) * 2) var(--_neu-sl);\n --_neu-inset-sm: inset calc(var(--_neu-d) * 0.5) calc(var(--_neu-d) * 0.5) var(--_neu-d) var(--_neu-sd), inset calc(var(--_neu-d) * -0.5) calc(var(--_neu-d) * -0.5) var(--_neu-d) var(--_neu-sl);\n font-family: var(--neu-font);\n color: var(--_neu-fg);\n -webkit-tap-highlight-color: transparent;\n}\n:host(:not(:defined)) { visibility: inherit !important; min-block-size: auto !important; }\n:host([hidden]) { display: none !important; }\n:host(:focus) { outline: none; }\n*, *::before, *::after { box-sizing: border-box; }\n";
8
- export declare const themeCssProperties: readonly DocEntry[];
@@ -31,10 +31,3 @@ export const hostTheme = `
31
31
  :host(:focus) { outline: none; }
32
32
  *, *::before, *::after { box-sizing: border-box; }
33
33
  `;
34
- export const themeCssProperties = [
35
- { name: '--neu-bg', description: 'Surface colour; shadows and text are derived from it.' },
36
- { name: '--neu-accent', description: 'Accent colour.' },
37
- { name: '--neu-distance', description: 'Shadow distance for the md size.' },
38
- { name: '--neu-intensity', description: 'Shadow strength multiplier.' },
39
- { name: '--neu-radius', description: 'Corner radius for the md size.' },
40
- ];
@@ -1,4 +1,8 @@
1
- /** The browser's own, localised "please check this box" message, borrowed from a native checkbox. */
2
- export declare function requiredCheckboxMessage(): string;
1
+ /**
2
+ * The browser's own, localised "value missing" message, borrowed once from a required native
3
+ * control: an input of type `kind` ("checkbox", "radio") or, for "select", a select. `fallback`
4
+ * covers a browser that reports none.
5
+ */
6
+ export declare function requiredMessage(kind: 'checkbox' | 'radio' | 'select', fallback: string): string;
3
7
  /** Copies a native input's validity so the host can report the same errors. */
4
8
  export declare function copyValidity(validity: ValidityState): ValidityStateFlags;
@@ -1,13 +1,20 @@
1
- let checkboxMessage;
2
- /** The browser's own, localised "please check this box" message, borrowed from a native checkbox. */
3
- export function requiredCheckboxMessage() {
4
- if (checkboxMessage === undefined) {
5
- const probe = document.createElement('input');
6
- probe.type = 'checkbox';
1
+ const missing = new Map();
2
+ /**
3
+ * The browser's own, localised "value missing" message, borrowed once from a required native
4
+ * control: an input of type `kind` ("checkbox", "radio") or, for "select", a select. `fallback`
5
+ * covers a browser that reports none.
6
+ */
7
+ export function requiredMessage(kind, fallback) {
8
+ let message = missing.get(kind);
9
+ if (message === undefined) {
10
+ const probe = kind === 'select'
11
+ ? document.createElement('select')
12
+ : Object.assign(document.createElement('input'), { type: kind });
7
13
  probe.required = true;
8
- checkboxMessage = probe.validationMessage || 'Please check this box if you want to proceed.';
14
+ message = probe.validationMessage || fallback;
15
+ missing.set(kind, message);
9
16
  }
10
- return checkboxMessage;
17
+ return message;
11
18
  }
12
19
  /** Copies a native input's validity so the host can report the same errors. */
13
20
  export function copyValidity(validity) {
package/dist/docs.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import type { ComponentDocs } from './core/define.js';
2
+ /** The documentation of every component by tag, for tools. DOM-free; never part of the runtime bundles. */
3
+ export declare const componentDocs: ReadonlyMap<string, ComponentDocs>;
package/dist/docs.js ADDED
@@ -0,0 +1,41 @@
1
+ import { avatarDocs } from './components/avatar/avatar.docs.js';
2
+ import { badgeDocs } from './components/badge/badge.docs.js';
3
+ import { buttonDocs } from './components/button/button.docs.js';
4
+ import { buttonGroupDocs } from './components/button-group/button-group.docs.js';
5
+ import { checkboxDocs } from './components/checkbox/checkbox.docs.js';
6
+ import { dividerDocs } from './components/divider/divider.docs.js';
7
+ import { iconDocs } from './components/icon/icon.docs.js';
8
+ import { iconButtonDocs } from './components/icon-button/icon-button.docs.js';
9
+ import { numberFieldDocs } from './components/number-field/number-field.docs.js';
10
+ import { optionDocs } from './components/option/option.docs.js';
11
+ import { radioDocs } from './components/radio/radio.docs.js';
12
+ import { radioGroupDocs } from './components/radio-group/radio-group.docs.js';
13
+ import { selectDocs } from './components/select/select.docs.js';
14
+ import { sliderDocs } from './components/slider/slider.docs.js';
15
+ import { spinnerDocs } from './components/spinner/spinner.docs.js';
16
+ import { surfaceDocs } from './components/surface/surface.docs.js';
17
+ import { switchDocs } from './components/switch/switch.docs.js';
18
+ import { textFieldDocs } from './components/text-field/text-field.docs.js';
19
+ import { textareaDocs } from './components/textarea/textarea.docs.js';
20
+ /** The documentation of every component by tag, for tools. DOM-free; never part of the runtime bundles. */
21
+ export const componentDocs = new Map([
22
+ ['neu-avatar', avatarDocs],
23
+ ['neu-badge', badgeDocs],
24
+ ['neu-button', buttonDocs],
25
+ ['neu-button-group', buttonGroupDocs],
26
+ ['neu-checkbox', checkboxDocs],
27
+ ['neu-divider', dividerDocs],
28
+ ['neu-icon', iconDocs],
29
+ ['neu-icon-button', iconButtonDocs],
30
+ ['neu-number-field', numberFieldDocs],
31
+ ['neu-option', optionDocs],
32
+ ['neu-radio', radioDocs],
33
+ ['neu-radio-group', radioGroupDocs],
34
+ ['neu-select', selectDocs],
35
+ ['neu-slider', sliderDocs],
36
+ ['neu-spinner', spinnerDocs],
37
+ ['neu-surface', surfaceDocs],
38
+ ['neu-switch', switchDocs],
39
+ ['neu-text-field', textFieldDocs],
40
+ ['neu-textarea', textareaDocs],
41
+ ]);
@@ -0,0 +1,3 @@
1
+ import { NeuNumberField } from './components/number-field/number-field.js';
2
+ export { NeuNumberField };
3
+ export { numberFieldDef } from './components/number-field/number-field.def.js';
@@ -0,0 +1,4 @@
1
+ import { NeuNumberField } from './components/number-field/number-field.js';
2
+ NeuNumberField.define();
3
+ export { NeuNumberField };
4
+ export { numberFieldDef } from './components/number-field/number-field.def.js';
@@ -0,0 +1,3 @@
1
+ import { NeuOption } from './components/option/option.js';
2
+ export { NeuOption };
3
+ export { optionDef } from './components/option/option.def.js';
package/dist/option.js ADDED
@@ -0,0 +1,4 @@
1
+ import { NeuOption } from './components/option/option.js';
2
+ NeuOption.define();
3
+ export { NeuOption };
4
+ export { optionDef } from './components/option/option.def.js';
@@ -0,0 +1,4 @@
1
+ import './radio.js';
2
+ import { NeuRadioGroup } from './components/radio-group/radio-group.js';
3
+ export { NeuRadioGroup };
4
+ export { radioGroupDef } from './components/radio-group/radio-group.def.js';
@@ -0,0 +1,6 @@
1
+ // A group is unusable without its radios (tokens hide undefined neu-radio), so define both.
2
+ import './radio.js';
3
+ import { NeuRadioGroup } from './components/radio-group/radio-group.js';
4
+ NeuRadioGroup.define();
5
+ export { NeuRadioGroup };
6
+ export { radioGroupDef } from './components/radio-group/radio-group.def.js';
@@ -0,0 +1,3 @@
1
+ import { NeuRadio } from './components/radio/radio.js';
2
+ export { NeuRadio };
3
+ export { radioDef } from './components/radio/radio.def.js';
package/dist/radio.js ADDED
@@ -0,0 +1,4 @@
1
+ import { NeuRadio } from './components/radio/radio.js';
2
+ NeuRadio.define();
3
+ export { NeuRadio };
4
+ export { radioDef } from './components/radio/radio.def.js';
@@ -0,0 +1,3 @@
1
+ import { NeuSelect } from './components/select/select.js';
2
+ export { NeuSelect };
3
+ export { selectDef } from './components/select/select.def.js';
package/dist/select.js ADDED
@@ -0,0 +1,4 @@
1
+ import { NeuSelect } from './components/select/select.js';
2
+ NeuSelect.define();
3
+ export { NeuSelect };
4
+ export { selectDef } from './components/select/select.def.js';
@@ -0,0 +1,3 @@
1
+ import { NeuSlider } from './components/slider/slider.js';
2
+ export { NeuSlider };
3
+ export { sliderDef } from './components/slider/slider.def.js';
package/dist/slider.js ADDED
@@ -0,0 +1,4 @@
1
+ import { NeuSlider } from './components/slider/slider.js';
2
+ NeuSlider.define();
3
+ export { NeuSlider };
4
+ export { sliderDef } from './components/slider/slider.def.js';
package/dist/ssr.d.ts CHANGED
@@ -1,11 +1,15 @@
1
- import type { ComponentDef } from './core/define.js';
2
- export type { ComponentDef, ComponentDocs, DocEntry, FormDef } from './core/define.js';
1
+ import type { ComponentDef, TemplateContext } from './core/define.js';
2
+ export type { ComponentDef, ComponentDocs, DocEntry, FormDef, OptionData, TemplateContext, } from './core/define.js';
3
3
  export { formDefaultProp } from './core/define.js';
4
+ export { optionLabel } from './components/option/option-data.js';
4
5
  export type { InferProps, PropDecl, PropsSchema, PropValue } from './core/props.js';
5
- export { attributeName, coerceProperty, parseAttribute, parseProps, serializeAttribute, } from './core/props.js';
6
+ export { attributeName, coerceProperty, parseAttribute, parseProps, reflects, serializeAttribute, } from './core/props.js';
6
7
  /** Every component definition by tag. DOM-free: safe to import in Node. */
7
8
  export declare const definitions: ReadonlyMap<string, ComponentDef>;
8
9
  /** Inner HTML of a declarative shadow root: inline styles, then the template. */
9
- export declare function renderShadowContents(def: ComponentDef, attrs: Readonly<Record<string, string>>): string;
10
- /** The `<template shadowrootmode>` for one element, or '' for tags this library does not own. */
11
- export declare function renderDSD(tag: string, attrs: Readonly<Record<string, string>>): string;
10
+ export declare function renderShadowContents(def: ComponentDef, attrs: Readonly<Record<string, string>>, ctx?: TemplateContext): string;
11
+ /**
12
+ * The `<template shadowrootmode>` for one element, or '' for tags this library does not own.
13
+ * `ctx` carries what the attributes cannot, such as the options of a select (spec §8.2).
14
+ */
15
+ export declare function renderDSD(tag: string, attrs: Readonly<Record<string, string>>, ctx?: TemplateContext): string;
package/dist/ssr.js CHANGED
@@ -2,40 +2,60 @@ import { avatarDef } from './components/avatar/avatar.def.js';
2
2
  import { badgeDef } from './components/badge/badge.def.js';
3
3
  import { buttonDef } from './components/button/button.def.js';
4
4
  import { buttonGroupDef } from './components/button-group/button-group.def.js';
5
+ import { checkboxDef } from './components/checkbox/checkbox.def.js';
5
6
  import { dividerDef } from './components/divider/divider.def.js';
6
7
  import { iconDef } from './components/icon/icon.def.js';
7
8
  import { iconButtonDef } from './components/icon-button/icon-button.def.js';
9
+ import { numberFieldDef } from './components/number-field/number-field.def.js';
10
+ import { optionDef } from './components/option/option.def.js';
11
+ import { radioDef } from './components/radio/radio.def.js';
12
+ import { radioGroupDef } from './components/radio-group/radio-group.def.js';
13
+ import { selectDef } from './components/select/select.def.js';
14
+ import { sliderDef } from './components/slider/slider.def.js';
8
15
  import { spinnerDef } from './components/spinner/spinner.def.js';
9
16
  import { surfaceDef } from './components/surface/surface.def.js';
10
17
  import { switchDef } from './components/switch/switch.def.js';
11
18
  import { textFieldDef } from './components/text-field/text-field.def.js';
19
+ import { textareaDef } from './components/textarea/textarea.def.js';
12
20
  import { parseProps } from './core/props.js';
13
21
  export { formDefaultProp } from './core/define.js';
14
- export { attributeName, coerceProperty, parseAttribute, parseProps, serializeAttribute, } from './core/props.js';
22
+ export { optionLabel } from './components/option/option-data.js';
23
+ export { attributeName, coerceProperty, parseAttribute, parseProps, reflects, serializeAttribute, } from './core/props.js';
15
24
  /** Every component definition by tag. DOM-free: safe to import in Node. */
16
25
  export const definitions = /* @__PURE__ */ new Map([
17
26
  [avatarDef.tag, avatarDef],
18
27
  [badgeDef.tag, badgeDef],
19
28
  [buttonDef.tag, buttonDef],
20
29
  [buttonGroupDef.tag, buttonGroupDef],
30
+ [checkboxDef.tag, checkboxDef],
21
31
  [dividerDef.tag, dividerDef],
22
32
  [iconDef.tag, iconDef],
23
33
  [iconButtonDef.tag, iconButtonDef],
34
+ [numberFieldDef.tag, numberFieldDef],
35
+ [optionDef.tag, optionDef],
36
+ [radioDef.tag, radioDef],
37
+ [radioGroupDef.tag, radioGroupDef],
38
+ [selectDef.tag, selectDef],
39
+ [sliderDef.tag, sliderDef],
24
40
  [spinnerDef.tag, spinnerDef],
25
41
  [surfaceDef.tag, surfaceDef],
26
42
  [switchDef.tag, switchDef],
27
43
  [textFieldDef.tag, textFieldDef],
44
+ [textareaDef.tag, textareaDef],
28
45
  ]);
29
46
  /** Inner HTML of a declarative shadow root: inline styles, then the template. */
30
- export function renderShadowContents(def, attrs) {
47
+ export function renderShadowContents(def, attrs, ctx) {
31
48
  const props = parseProps(def.props, (name) => (Object.hasOwn(attrs, name) ? attrs[name] : null));
32
- return `<style data-neu-ssr>${def.styles}</style>${def.template(props).value}`;
49
+ return `<style data-neu-ssr>${def.styles}</style>${def.template(props, ctx).value}`;
33
50
  }
34
- /** The `<template shadowrootmode>` for one element, or '' for tags this library does not own. */
35
- export function renderDSD(tag, attrs) {
51
+ /**
52
+ * The `<template shadowrootmode>` for one element, or '' for tags this library does not own.
53
+ * `ctx` carries what the attributes cannot, such as the options of a select (spec §8.2).
54
+ */
55
+ export function renderDSD(tag, attrs, ctx) {
36
56
  const def = definitions.get(tag.toLowerCase());
37
57
  if (!def)
38
58
  return '';
39
59
  const delegates = def.delegatesFocus ? ' shadowrootdelegatesfocus' : '';
40
- return `<template shadowrootmode="open"${delegates}>${renderShadowContents(def, attrs)}</template>`;
60
+ return `<template shadowrootmode="open"${delegates}>${renderShadowContents(def, attrs, ctx)}</template>`;
41
61
  }
@@ -0,0 +1,3 @@
1
+ import { NeuTextarea } from './components/textarea/textarea.js';
2
+ export { NeuTextarea };
3
+ export { textareaDef } from './components/textarea/textarea.def.js';
@@ -0,0 +1,4 @@
1
+ import { NeuTextarea } from './components/textarea/textarea.js';
2
+ NeuTextarea.define();
3
+ export { NeuTextarea };
4
+ export { textareaDef } from './components/textarea/textarea.def.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neumorphism-ui/elements",
3
- "version": "1.0.0-next.1",
3
+ "version": "1.0.0-next.3",
4
4
  "description": "Neumorphism UI web components",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -32,6 +32,10 @@
32
32
  "types": "./dist/button-group.d.ts",
33
33
  "default": "./dist/button-group.js"
34
34
  },
35
+ "./checkbox.js": {
36
+ "types": "./dist/checkbox.d.ts",
37
+ "default": "./dist/checkbox.js"
38
+ },
35
39
  "./icon-button.js": {
36
40
  "types": "./dist/icon-button.d.ts",
37
41
  "default": "./dist/icon-button.js"
@@ -48,6 +52,30 @@
48
52
  "types": "./dist/icons.d.ts",
49
53
  "default": "./dist/icons.js"
50
54
  },
55
+ "./number-field.js": {
56
+ "types": "./dist/number-field.d.ts",
57
+ "default": "./dist/number-field.js"
58
+ },
59
+ "./option.js": {
60
+ "types": "./dist/option.d.ts",
61
+ "default": "./dist/option.js"
62
+ },
63
+ "./radio.js": {
64
+ "types": "./dist/radio.d.ts",
65
+ "default": "./dist/radio.js"
66
+ },
67
+ "./radio-group.js": {
68
+ "types": "./dist/radio-group.d.ts",
69
+ "default": "./dist/radio-group.js"
70
+ },
71
+ "./select.js": {
72
+ "types": "./dist/select.d.ts",
73
+ "default": "./dist/select.js"
74
+ },
75
+ "./slider.js": {
76
+ "types": "./dist/slider.d.ts",
77
+ "default": "./dist/slider.js"
78
+ },
51
79
  "./spinner.js": {
52
80
  "types": "./dist/spinner.d.ts",
53
81
  "default": "./dist/spinner.js"
@@ -60,6 +88,10 @@
60
88
  "types": "./dist/switch.d.ts",
61
89
  "default": "./dist/switch.js"
62
90
  },
91
+ "./textarea.js": {
92
+ "types": "./dist/textarea.d.ts",
93
+ "default": "./dist/textarea.js"
94
+ },
63
95
  "./text-field.js": {
64
96
  "types": "./dist/text-field.d.ts",
65
97
  "default": "./dist/text-field.js"
@@ -68,6 +100,10 @@
68
100
  "types": "./dist/all.d.ts",
69
101
  "default": "./dist/all.js"
70
102
  },
103
+ "./docs.js": {
104
+ "types": "./dist/docs.d.ts",
105
+ "default": "./dist/docs.js"
106
+ },
71
107
  "./ssr.js": {
72
108
  "types": "./dist/ssr.d.ts",
73
109
  "default": "./dist/ssr.js"
@@ -81,13 +117,21 @@
81
117
  "./dist/badge.js",
82
118
  "./dist/button.js",
83
119
  "./dist/button-group.js",
120
+ "./dist/checkbox.js",
84
121
  "./dist/divider.js",
85
122
  "./dist/icon.js",
86
123
  "./dist/icon-button.js",
124
+ "./dist/number-field.js",
125
+ "./dist/option.js",
126
+ "./dist/radio.js",
127
+ "./dist/radio-group.js",
128
+ "./dist/select.js",
129
+ "./dist/slider.js",
87
130
  "./dist/spinner.js",
88
131
  "./dist/surface.js",
89
132
  "./dist/switch.js",
90
133
  "./dist/text-field.js",
134
+ "./dist/textarea.js",
91
135
  "./dist/all.js",
92
136
  "./cdn/neu.min.js"
93
137
  ],