@mhmo91/schmancy 0.9.15 → 0.9.17

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 (105) hide show
  1. package/custom-elements.json +83 -35
  2. package/dist/agent/schmancy.agent.js +297 -40
  3. package/dist/agent/schmancy.agent.js.map +1 -1
  4. package/dist/agent/schmancy.manifest.json +342 -19
  5. package/dist/autocomplete-CgWUCUU-.js.map +1 -1
  6. package/dist/autocomplete-EM0jE7X2.cjs.map +1 -1
  7. package/dist/button.cjs.map +1 -1
  8. package/dist/button.js.map +1 -1
  9. package/dist/card-BslSqOsf.cjs.map +1 -1
  10. package/dist/card-CEdgK9nb.js.map +1 -1
  11. package/dist/checkbox-Br84TiCs.js.map +1 -1
  12. package/dist/checkbox-DtcFMgZL.cjs.map +1 -1
  13. package/dist/chips-BNYOweGm.js.map +1 -1
  14. package/dist/chips-DoCu5YQb.cjs.map +1 -1
  15. package/dist/details-B8p62xmR.cjs.map +1 -1
  16. package/dist/details-CCW52lzz.js.map +1 -1
  17. package/dist/divider-CbEWg3G_.js.map +1 -1
  18. package/dist/divider-JyyFw_3J.cjs.map +1 -1
  19. package/dist/expand-BmwIPNjq.cjs.map +1 -1
  20. package/dist/expand-bFa_qVDT.js.map +1 -1
  21. package/dist/extra-BUgyMgjl.cjs.map +1 -1
  22. package/dist/extra-HwbaUnCD.js.map +1 -1
  23. package/dist/form-rCZqoAoK.js.map +1 -1
  24. package/dist/form-wI58M85H.cjs.map +1 -1
  25. package/dist/handover/agent-runtime-followups.md +1 -1
  26. package/dist/handover/agent-runtime-v1.md +3 -3
  27. package/dist/input-BGNZlfL8.cjs.map +1 -1
  28. package/dist/input-Bc3bVISm.js.map +1 -1
  29. package/dist/input-chip-CiG61y-N.js.map +1 -1
  30. package/dist/input-chip-p24lkYtY.cjs.map +1 -1
  31. package/dist/page.cjs.map +1 -1
  32. package/dist/page.js.map +1 -1
  33. package/dist/radio-group-B72sYGnS.js.map +1 -1
  34. package/dist/radio-group-B7DuNxUq.cjs.map +1 -1
  35. package/dist/scroll-CdmXRXh2.js.map +1 -1
  36. package/dist/scroll-V1rAZ9fK.cjs.map +1 -1
  37. package/dist/select-DFxoBgEf.cjs.map +1 -1
  38. package/dist/select-wFDKDLQI.js.map +1 -1
  39. package/dist/surface-0XM4DBaT.js.map +1 -1
  40. package/dist/surface-B6DA01kL.cjs.map +1 -1
  41. package/dist/switch.cjs.map +1 -1
  42. package/dist/switch.js.map +1 -1
  43. package/dist/textarea-B2544vx9.cjs.map +1 -1
  44. package/dist/textarea-CS-KdSLz.js.map +1 -1
  45. package/dist/theme-Cq_c9IO3.js.map +1 -1
  46. package/dist/theme-DU5yXaV-.cjs.map +1 -1
  47. package/dist/tree.cjs.map +1 -1
  48. package/dist/tree.js.map +1 -1
  49. package/package.json +1 -1
  50. package/src/autocomplete/autocomplete.ts +12 -1
  51. package/src/button/button.ts +6 -1
  52. package/src/button/icon-button.ts +7 -1
  53. package/src/card/actions.ts +9 -0
  54. package/src/card/card.ts +18 -0
  55. package/src/card/content.ts +9 -0
  56. package/src/card/media.ts +6 -0
  57. package/src/checkbox/checkbox.ts +7 -1
  58. package/src/chips/chips.ts +14 -0
  59. package/src/chips/input-chip.ts +6 -6
  60. package/src/details/details.ts +12 -0
  61. package/src/divider/divider.ts +11 -0
  62. package/src/expand/expand-root.component.ts +12 -0
  63. package/src/expand/expand.component.ts +14 -0
  64. package/src/extra/countries/countries.ts +10 -0
  65. package/src/extra/timezone/timezone.ts +8 -1
  66. package/src/form/form.ts +9 -2
  67. package/src/input/input.ts +11 -4
  68. package/src/layout/scroll/scroll.ts +5 -1
  69. package/src/page/page.ts +8 -11
  70. package/src/radio-group/radio-button.ts +10 -1
  71. package/src/radio-group/radio-group.ts +18 -0
  72. package/src/select/select.ts +12 -1
  73. package/src/surface/surface.ts +4 -10
  74. package/src/switch/switch.ts +7 -4
  75. package/src/textarea/textarea.ts +9 -1
  76. package/src/theme/theme.component.ts +10 -15
  77. package/src/tree/tree.ts +12 -0
  78. package/types/src/autocomplete/autocomplete.d.ts +12 -1
  79. package/types/src/button/button.d.ts +6 -1
  80. package/types/src/button/icon-button.d.ts +7 -1
  81. package/types/src/card/actions.d.ts +9 -0
  82. package/types/src/card/card.d.ts +18 -0
  83. package/types/src/card/content.d.ts +9 -0
  84. package/types/src/card/media.d.ts +6 -0
  85. package/types/src/checkbox/checkbox.d.ts +7 -1
  86. package/types/src/chips/chips.d.ts +14 -0
  87. package/types/src/chips/input-chip.d.ts +6 -6
  88. package/types/src/details/details.d.ts +12 -0
  89. package/types/src/divider/divider.d.ts +11 -0
  90. package/types/src/expand/expand-root.component.d.ts +12 -0
  91. package/types/src/expand/expand.component.d.ts +14 -0
  92. package/types/src/extra/countries/countries.d.ts +10 -0
  93. package/types/src/extra/timezone/timezone.d.ts +8 -1
  94. package/types/src/form/form.d.ts +9 -2
  95. package/types/src/input/input.d.ts +11 -4
  96. package/types/src/layout/scroll/scroll.d.ts +5 -1
  97. package/types/src/page/page.d.ts +8 -11
  98. package/types/src/radio-group/radio-button.d.ts +10 -1
  99. package/types/src/radio-group/radio-group.d.ts +18 -0
  100. package/types/src/select/select.d.ts +12 -1
  101. package/types/src/surface/surface.d.ts +4 -10
  102. package/types/src/switch/switch.d.ts +7 -4
  103. package/types/src/textarea/textarea.d.ts +9 -1
  104. package/types/src/theme/theme.component.d.ts +10 -15
  105. package/types/src/tree/tree.d.ts +12 -0
@@ -217,7 +217,13 @@
217
217
  "kind": "class",
218
218
  "name": "SchmancyAutocomplete",
219
219
  "tagName": "schmancy-autocomplete",
220
- "description": "Autocomplete input component with filtering and multi-select support.",
220
+ "description": "Combobox with type-ahead filtering over a list of `<schmancy-option>` children. Single or multi-select. Form-associated.",
221
+ "summary": "Use when users need to pick from a known list of options but the list is too long for a plain select dropdown. Prefer schmancy-select for short static lists.",
222
+ "platformPrimitive": {
223
+ "tag": "combobox",
224
+ "mode": "change",
225
+ "note": "Composed of a schmancy-input + a floating listbox populated from `<schmancy-option>` children. Multi-select renders selections as schmancy-input-chip chips. Degrades to a datalist-backed native input if the tag never registers."
226
+ },
221
227
  "attributes": [
222
228
  {
223
229
  "name": "required",
@@ -317,6 +323,15 @@
317
323
  },
318
324
  "default": "''"
319
325
  }
326
+ ],
327
+ "events": [
328
+ {
329
+ "name": "change",
330
+ "description": "`SchmancyAutocompleteChangeEvent` with `{ value }` (single) or `{ value, values }` (multi)."
331
+ }
332
+ ],
333
+ "examples": [
334
+ "<schmancy-autocomplete name=\"country\" label=\"Country\" placeholder=\"Start typing…\">\n <schmancy-option value=\"US\">United States</schmancy-option>\n <schmancy-option value=\"CA\">Canada</schmancy-option>\n <schmancy-option value=\"GB\">United Kingdom</schmancy-option>\n</schmancy-autocomplete>"
320
335
  ]
321
336
  }
322
337
  ]
@@ -631,7 +646,13 @@
631
646
  "kind": "class",
632
647
  "name": "SchmancyButton",
633
648
  "tagName": "schmancy-button",
634
- "description": "A button component.",
649
+ "description": "Material Design button — primary interactive surface for triggering actions or navigation.",
650
+ "summary": "Trigger actions or navigate. Form-associated; participates in native form submission.",
651
+ "platformPrimitive": {
652
+ "tag": "button",
653
+ "mode": "click",
654
+ "note": "Schmancy-skinned native `<button type=\"submit\">`. When `href` is set, degrades to `<a href=\"…\">`. Falls back to plain `<button>` styled with Tailwind if the tag never registers."
655
+ },
635
656
  "attributes": [
636
657
  {
637
658
  "name": "variant",
@@ -741,6 +762,9 @@
741
762
  "description": "The underlying native `<button>` (or `<a>` when `href` is set)."
742
763
  }
743
764
  ],
765
+ "examples": [
766
+ "<schmancy-button variant=\"filled\" @click=${() => save()}>Save</schmancy-button>\n<schmancy-button variant=\"outlined\" href=\"/next\">Continue</schmancy-button>"
767
+ ],
744
768
  "contexts": [
745
769
  {
746
770
  "name": "SchmancyButtonSizeContext",
@@ -758,7 +782,13 @@
758
782
  "kind": "class",
759
783
  "name": "SchmnacyIconButton",
760
784
  "tagName": "schmancy-icon-button",
761
- "description": "An icon button component.",
785
+ "description": "Icon-only button for toolbar actions, close affordances, or overflow menus.",
786
+ "summary": "Compact round/square button wrapping a single icon glyph. Form-associated like schmancy-button.",
787
+ "platformPrimitive": {
788
+ "tag": "button",
789
+ "mode": "click",
790
+ "note": "Schmancy-skinned native `<button>` (or `<a>` when `href` is set). aria-label is required for a11y because there's no text content."
791
+ },
762
792
  "attributes": [
763
793
  {
764
794
  "name": "size",
@@ -859,6 +889,9 @@
859
889
  "name": "base",
860
890
  "description": "The underlying native `<button>` (or `<a>` when `href` is set)."
861
891
  }
892
+ ],
893
+ "examples": [
894
+ "<schmancy-icon-button aria-label=\"Close\" @click=${() => close()}>\n <schmancy-icon>close</schmancy-icon>\n</schmancy-icon-button>"
862
895
  ]
863
896
  }
864
897
  ]
@@ -871,11 +904,21 @@
871
904
  "kind": "class",
872
905
  "name": "SchmancyCardAction",
873
906
  "tagName": "schmancy-card-action",
907
+ "description": "Action row of a schmancy-card — holds the card's buttons / links (typically aligned bottom-right).",
908
+ "summary": "Always nested inside schmancy-card. Holds the primary + secondary CTAs for the card.",
909
+ "platformPrimitive": {
910
+ "tag": "div",
911
+ "mode": "-",
912
+ "note": "Styled flex container. Degrades to a plain div if the tag never registers."
913
+ },
874
914
  "slots": [
875
915
  {
876
916
  "name": "",
877
917
  "description": "The content of the action"
878
918
  }
919
+ ],
920
+ "examples": [
921
+ "<schmancy-card-action>\n <schmancy-button variant=\"text\">Cancel</schmancy-button>\n <schmancy-button variant=\"filled\">Save</schmancy-button>\n</schmancy-card-action>"
879
922
  ]
880
923
  }
881
924
  ]
@@ -888,6 +931,13 @@
888
931
  "kind": "class",
889
932
  "name": "SchmancyCard",
890
933
  "tagName": "schmancy-card",
934
+ "description": "Material Design card — a surface-level container for grouping related content with media / content / actions slots.",
935
+ "summary": "Use for discrete pieces of content that appear in a list (a product, a note, a message). Combine with schmancy-card-media / schmancy-card-content / schmancy-card-action children.",
936
+ "platformPrimitive": {
937
+ "tag": "div",
938
+ "mode": "-",
939
+ "note": "Styled `<div>`; becomes an `<a>` when `href` is set so the whole card is a single interactive surface. Degrades to a plain div/a if the tag never registers."
940
+ },
891
941
  "attributes": [
892
942
  {
893
943
  "name": "type",
@@ -956,6 +1006,9 @@
956
1006
  "default": "''",
957
1007
  "description": "ARIA label for accessibility."
958
1008
  }
1009
+ ],
1010
+ "examples": [
1011
+ "<schmancy-card type=\"elevated\" href=\"/items/42\">\n <schmancy-card-media src=\"/thumb.jpg\" alt=\"Thumbnail\"></schmancy-card-media>\n <schmancy-card-content>\n <h3>Title</h3>\n <p>One-line description of the card's content.</p>\n </schmancy-card-content>\n <schmancy-card-action>\n <schmancy-button variant=\"text\">Open</schmancy-button>\n </schmancy-card-action>\n</schmancy-card>"
959
1012
  ]
960
1013
  }
961
1014
  ]
@@ -967,7 +1020,17 @@
967
1020
  {
968
1021
  "kind": "class",
969
1022
  "name": "SchmancyCardContent",
970
- "tagName": "schmancy-card-content"
1023
+ "tagName": "schmancy-card-content",
1024
+ "description": "Content region of a schmancy-card — holds the card's headline, supporting text, and inline controls.",
1025
+ "summary": "Always nested inside schmancy-card. The padded content block between the media and action rows.",
1026
+ "platformPrimitive": {
1027
+ "tag": "div",
1028
+ "mode": "-",
1029
+ "note": "Styled `<div>` with padding. Degrades to a plain div if the tag never registers."
1030
+ },
1031
+ "examples": [
1032
+ "<schmancy-card-content>\n <h3>Card title</h3>\n <p>Supporting text that describes the card's subject.</p>\n</schmancy-card-content>"
1033
+ ]
971
1034
  }
972
1035
  ]
973
1036
  },
@@ -979,6 +1042,13 @@
979
1042
  "kind": "class",
980
1043
  "name": "SchmancyCardMedia",
981
1044
  "tagName": "schmancy-card-media",
1045
+ "description": "Media region of a schmancy-card — the image / thumbnail at the top of the card.",
1046
+ "summary": "Always nested inside schmancy-card. Pass `src` + `alt` props or slot an `<img>` / `<video>` for custom media.",
1047
+ "platformPrimitive": {
1048
+ "tag": "img",
1049
+ "mode": "-",
1050
+ "note": "Renders an `<img>` (or wraps a slotted media element). Degrades to a styled `<img>` if the tag never registers."
1051
+ },
982
1052
  "attributes": [
983
1053
  {
984
1054
  "name": "src",
@@ -1008,6 +1078,9 @@
1008
1078
  },
1009
1079
  "default": "''"
1010
1080
  }
1081
+ ],
1082
+ "examples": [
1083
+ "<schmancy-card-media src=\"/thumb.jpg\" alt=\"Product photo\"></schmancy-card-media>"
1011
1084
  ]
1012
1085
  }
1013
1086
  ]
@@ -1222,6 +1295,13 @@
1222
1295
  "kind": "class",
1223
1296
  "name": "SchmancyCheckboxElement",
1224
1297
  "tagName": "schmancy-checkbox",
1298
+ "description": "Binary checkbox for multi-select or boolean form fields. Wraps Material Web's `<md-checkbox>`; form-associated.",
1299
+ "summary": "Use for \"select many from a list\" or any boolean that's part of a form submission. Prefer schmancy-switch for immediate-effect toggles.",
1300
+ "platformPrimitive": {
1301
+ "tag": "checkbox",
1302
+ "mode": "change",
1303
+ "note": "Wraps `<md-checkbox>` from `@material/web`. Degrades to styled native `<input type=\"checkbox\">` if the tag never registers."
1304
+ },
1225
1305
  "attributes": [
1226
1306
  {
1227
1307
  "name": "value",
@@ -1282,7 +1362,7 @@
1282
1362
  "events": [
1283
1363
  {
1284
1364
  "name": "valueChange",
1285
- "description": "Event fired when the checkbox value changes."
1365
+ "description": "`CustomEvent<{ value: boolean }>` when the checkbox is toggled."
1286
1366
  }
1287
1367
  ],
1288
1368
  "slots": [
@@ -1290,6 +1370,9 @@
1290
1370
  "name": "",
1291
1371
  "description": "The label for the checkbox."
1292
1372
  }
1373
+ ],
1374
+ "examples": [
1375
+ "<schmancy-checkbox name=\"tos\" required>I accept the terms</schmancy-checkbox>"
1293
1376
  ]
1294
1377
  }
1295
1378
  ]
@@ -1364,6 +1447,13 @@
1364
1447
  "kind": "class",
1365
1448
  "name": "SchmancyChips",
1366
1449
  "tagName": "schmancy-chips",
1450
+ "description": "Filter-chip group — container for selectable `<schmancy-chip>` children. Single or multi-select.",
1451
+ "summary": "Use for filtering or choosing from 2–8 mutually-visible options (\"Status: active / paused / archived\"). Prefer schmancy-select when the list gets long or vertical.",
1452
+ "platformPrimitive": {
1453
+ "tag": "chip-group",
1454
+ "mode": "change",
1455
+ "note": "No direct native equivalent. Degrades to a styled schmancy-select with similar semantics if the tag never registers."
1456
+ },
1367
1457
  "attributes": [
1368
1458
  {
1369
1459
  "name": "wrap",
@@ -1391,6 +1481,15 @@
1391
1481
  ],
1392
1482
  "default": "'start'"
1393
1483
  }
1484
+ ],
1485
+ "events": [
1486
+ {
1487
+ "name": "change",
1488
+ "description": "`CustomEvent<{ value: string }>` (single) or `{ values: string[] }` (multi)."
1489
+ }
1490
+ ],
1491
+ "examples": [
1492
+ "<schmancy-chips multi @change=${(e) => this.filters = e.detail.values}>\n <schmancy-chip value=\"active\">Active</schmancy-chip>\n <schmancy-chip value=\"paused\">Paused</schmancy-chip>\n <schmancy-chip value=\"archived\">Archived</schmancy-chip>\n</schmancy-chips>"
1394
1493
  ]
1395
1494
  }
1396
1495
  ]
@@ -1403,7 +1502,13 @@
1403
1502
  "kind": "class",
1404
1503
  "name": "SchmancyInputChip",
1405
1504
  "tagName": "schmancy-input-chip",
1406
- "description": "Input chip component - represents user-provided information that can be removed. IMPORTANT: Per Material Design 3 specification, input chips do NOT have selected state. They represent discrete pieces of user input (like entered tags, selections from lists, etc.) that can only be removed, not toggled on/off. Use cases: - Displaying selected recipients in an email - Showing applied filters that can be removed - Tags or keywords entered by the user - Selected items from a multi-select dropdown",
1505
+ "description": "Input chip displays user-provided information (tags, recipients, filters) that can be removed but not toggled. IMPORTANT: Per Material Design 3 specification, input chips do NOT have selected state. They represent discrete pieces of user input (like entered tags, selections from lists, etc.) that can only be removed, not toggled on/off. Use cases: - Displaying selected recipients in an email - Showing applied filters that can be removed - Tags or keywords entered by the user - Selected items from a multi-select dropdown",
1506
+ "summary": "Removable pill that represents a single user input value. No selected state — use schmancy-chip (filter chip) for toggleable options.",
1507
+ "platformPrimitive": {
1508
+ "tag": "chip",
1509
+ "mode": "remove",
1510
+ "note": "No native equivalent. Composed of a labeled pill + close button. Degrades to a styled `<span>` with a trailing close `<button>` if the tag never registers."
1511
+ },
1407
1512
  "attributes": [
1408
1513
  {
1409
1514
  "name": "value",
@@ -2138,6 +2243,13 @@
2138
2243
  "kind": "class",
2139
2244
  "name": "SchmancyDetails",
2140
2245
  "tagName": "schmancy-details",
2246
+ "description": "Expandable disclosure panel — a styled `<details>` / `<summary>` pair with animated expand + overlay options.",
2247
+ "summary": "Use for progressive-disclosure content: FAQs, collapsible settings sections, accordion-style lists. Prefer schmancy-expand for full-page accordions where only one section can be open at a time.",
2248
+ "platformPrimitive": {
2249
+ "tag": "details",
2250
+ "mode": "toggle",
2251
+ "note": "Wraps native `<details>`/`<summary>`. Degrades to the native element if the tag never registers — same keyboard accessibility, just no animation."
2252
+ },
2141
2253
  "attributes": [
2142
2254
  {
2143
2255
  "name": "summary",
@@ -2199,6 +2311,15 @@
2199
2311
  },
2200
2312
  "default": "'p-3'"
2201
2313
  }
2314
+ ],
2315
+ "events": [
2316
+ {
2317
+ "name": "toggle",
2318
+ "description": "When the open state changes (bubbles from the native `<details>`)."
2319
+ }
2320
+ ],
2321
+ "examples": [
2322
+ "<schmancy-details summary=\"Shipping details\">\n <p>Order ships in 2 business days.</p>\n</schmancy-details>"
2202
2323
  ]
2203
2324
  }
2204
2325
  ]
@@ -2341,6 +2462,13 @@
2341
2462
  "kind": "class",
2342
2463
  "name": "SchmancyDivider",
2343
2464
  "tagName": "schmancy-divider",
2465
+ "description": "Thin horizontal (or vertical) separator rule between sections of content.",
2466
+ "summary": "Semantic separator between groups — list items, menu sections, content blocks. Uses outline theme token.",
2467
+ "platformPrimitive": {
2468
+ "tag": "hr",
2469
+ "mode": "-",
2470
+ "note": "Styled horizontal rule. Degrades to a native `<hr>` if the tag never registers."
2471
+ },
2344
2472
  "attributes": [
2345
2473
  {
2346
2474
  "name": "outline",
@@ -2372,6 +2500,9 @@
2372
2500
  ],
2373
2501
  "default": "'start'"
2374
2502
  }
2503
+ ],
2504
+ "examples": [
2505
+ "<schmancy-list-item>First</schmancy-list-item>\n<schmancy-divider></schmancy-divider>\n<schmancy-list-item>Second</schmancy-list-item>"
2375
2506
  ]
2376
2507
  }
2377
2508
  ]
@@ -2511,6 +2642,13 @@
2511
2642
  "kind": "class",
2512
2643
  "name": "SchmancyExpandRoot",
2513
2644
  "tagName": "schmancy-expand-root",
2645
+ "description": "Container for schmancy-expand children — coordinates mutual-exclusion so only one child is open at a time. Also renders the portal panel that the active child expands into.",
2646
+ "summary": "Always wrap a group of schmancy-expand children. Without a root, each schmancy-expand behaves independently (which is usually not what you want — prefer schmancy-details for that).",
2647
+ "platformPrimitive": {
2648
+ "tag": "div",
2649
+ "mode": "-",
2650
+ "note": "Coordinating wrapper. Degrades to a plain div if the tag never registers — children fall back to independent `<details>` behavior."
2651
+ },
2514
2652
  "attributes": [
2515
2653
  {
2516
2654
  "name": "type",
@@ -2543,6 +2681,9 @@
2543
2681
  ],
2544
2682
  "default": "'solid'"
2545
2683
  }
2684
+ ],
2685
+ "examples": [
2686
+ "<schmancy-expand-root>\n <schmancy-expand summary=\"Step 1\">…</schmancy-expand>\n <schmancy-expand summary=\"Step 2\">…</schmancy-expand>\n</schmancy-expand-root>"
2546
2687
  ]
2547
2688
  }
2548
2689
  ]
@@ -2555,6 +2696,13 @@
2555
2696
  "kind": "class",
2556
2697
  "name": "SchmancyExpand",
2557
2698
  "tagName": "schmancy-expand",
2699
+ "description": "Accordion-style section — expands on click, coordinates with siblings via schmancy-expand-root to close any sibling when a new one opens. Only one schmancy-expand can be open at a time within the same root.",
2700
+ "summary": "Use for grouped progressive-disclosure where only one section should be open at a time. Prefer schmancy-details when sections should be independent.",
2701
+ "platformPrimitive": {
2702
+ "tag": "details",
2703
+ "mode": "toggle",
2704
+ "note": "Schmancy-skinned accordion section. Degrades to `<details>` if the tag never registers — loses mutual-exclusion behavior but stays functional."
2705
+ },
2558
2706
  "attributes": [
2559
2707
  {
2560
2708
  "name": "summary",
@@ -2612,6 +2760,15 @@
2612
2760
  },
2613
2761
  "default": "false"
2614
2762
  }
2763
+ ],
2764
+ "events": [
2765
+ {
2766
+ "name": "toggle",
2767
+ "description": "When the open state changes."
2768
+ }
2769
+ ],
2770
+ "examples": [
2771
+ "<schmancy-expand-root>\n <schmancy-expand summary=\"Billing\">Billing form…</schmancy-expand>\n <schmancy-expand summary=\"Shipping\">Shipping form…</schmancy-expand>\n <schmancy-expand summary=\"Review\">Order review…</schmancy-expand>\n</schmancy-expand-root>"
2615
2772
  ]
2616
2773
  }
2617
2774
  ]
@@ -2635,7 +2792,13 @@
2635
2792
  "kind": "class",
2636
2793
  "name": "SchmancyForm",
2637
2794
  "tagName": "schmancy-form",
2638
- "description": "A thin ergonomic wrapper around a native `<form>` element. Its children are reparented into a `<form>` element in light DOM on connection, so: - Form-associated custom elements (FACE) resolve their `internals.form` correctly via native DOM ancestry. - `new FormData(form)` collects values from every FACE + native control without any manual walking. - `form.reset()` triggers `formResetCallback()` on every FACE. - `form.reportValidity()` runs native validation UI. - `<button type=\"submit\">` and `<schmancy-button type=\"submit\">` both submit the form via the native submitter pipeline. This component exists only to translate the native `submit` / `reset` events into the Schmancy event shape (`detail: FormData`). All heavy lifting is the platform's.",
2795
+ "description": "Ergonomic wrapper around a native `<form>`. Children are reparented into a light-DOM `<form>` on connection so form-associated custom elements resolve `internals.form` via native DOM ancestry. - Form-associated custom elements (FACE) resolve their `internals.form` correctly via native DOM ancestry. - `new FormData(form)` collects values from every FACE + native control without any manual walking. - `form.reset()` triggers `formResetCallback()` on every FACE. - `form.reportValidity()` runs native validation UI. - `<button type=\"submit\">` and `<schmancy-button type=\"submit\">` both submit the form via the native submitter pipeline. This component exists only to translate the native `submit` / `reset` events into the Schmancy event shape (`detail: FormData`). All heavy lifting is the platform's.",
2796
+ "summary": "Always wrap form-associated schmancy components in schmancy-form (or a native `<form>`) so `new FormData(form)` just works.",
2797
+ "platformPrimitive": {
2798
+ "tag": "form",
2799
+ "mode": "submit",
2800
+ "note": "Light-DOM native `<form>` element. Degrades to a `<form>` if the tag never registers — same semantics, just no CustomEvent translation."
2801
+ },
2639
2802
  "events": [
2640
2803
  {
2641
2804
  "name": "submit",
@@ -2645,6 +2808,9 @@
2645
2808
  "name": "reset",
2646
2809
  "description": "Emitted after the underlying form resets."
2647
2810
  }
2811
+ ],
2812
+ "examples": [
2813
+ "<schmancy-form @submit=${(e) => console.log(Object.fromEntries(e.detail))}>\n <schmancy-input name=\"email\" type=\"email\" required></schmancy-input>\n <schmancy-input name=\"password\" type=\"password\" required></schmancy-input>\n <schmancy-button type=\"submit\" variant=\"filled\">Sign in</schmancy-button>\n</schmancy-form>"
2648
2814
  ]
2649
2815
  }
2650
2816
  ]
@@ -2825,7 +2991,13 @@
2825
2991
  "kind": "class",
2826
2992
  "name": "SchmancyInput",
2827
2993
  "tagName": "schmancy-input",
2828
- "description": "Enhanced version of the SchmancyInput component with improved form integration and compatibility with legacy API. This component uses the native form association API and maintains parity with native input behaviors while providing a stylish, accessible interface.",
2994
+ "description": "Single-line text input the primary form-text primitive. Form-associated via ElementInternals, so it participates in native `<form>` submission, validation, and reset without additional wiring.",
2995
+ "summary": "Text input with Material Design styling, native form integration, and RxJS-debounced input/change/enter events.",
2996
+ "platformPrimitive": {
2997
+ "tag": "input",
2998
+ "mode": "change",
2999
+ "note": "Schmancy-skinned native `<input>`. Degrades to `<input class=\"…\">` styled via Tailwind if the tag never registers."
3000
+ },
2829
3001
  "attributes": [
2830
3002
  {
2831
3003
  "name": "value",
@@ -2994,6 +3166,23 @@
2994
3166
  },
2995
3167
  "description": "For datalist support"
2996
3168
  }
3169
+ ],
3170
+ "events": [
3171
+ {
3172
+ "name": "input",
3173
+ "description": "`CustomEvent<{value: string}>` on every keystroke."
3174
+ },
3175
+ {
3176
+ "name": "change",
3177
+ "description": "`CustomEvent<{value: string}>` on blur/change."
3178
+ },
3179
+ {
3180
+ "name": "enter",
3181
+ "description": "`CustomEvent<{value: string}>` when user presses Enter."
3182
+ }
3183
+ ],
3184
+ "examples": [
3185
+ "<schmancy-form @submit=${onSubmit}>\n <schmancy-input name=\"email\" type=\"email\" label=\"Email\" required></schmancy-input>\n</schmancy-form>"
2997
3186
  ]
2998
3187
  },
2999
3188
  {
@@ -4589,7 +4778,13 @@
4589
4778
  "kind": "class",
4590
4779
  "name": "SchmancyPage",
4591
4780
  "tagName": "schmancy-page",
4592
- "description": "Native mobile-like page container. Prevents double-tap zoom, pull-to-refresh, rubber-banding. Automatically fills remaining viewport height.",
4781
+ "description": "Mobile-first page container fills remaining viewport height, suppresses double-tap zoom / pull-to-refresh / rubber-banding. Lays children in a CSS grid whose row template is `rows`.",
4782
+ "summary": "The root of any app view — wraps header / main / footer children in a full-viewport grid. Use rows=\"auto_1fr_auto\" to make the middle child scroll while header/footer stay pinned.",
4783
+ "platformPrimitive": {
4784
+ "tag": "div",
4785
+ "mode": "-",
4786
+ "note": "Full-height CSS-grid container. Degrades to a plain div if the tag never registers — children still flow vertically but without the height fill and gesture suppression."
4787
+ },
4593
4788
  "attributes": [
4594
4789
  {
4595
4790
  "name": "rows",
@@ -4615,7 +4810,7 @@
4615
4810
  }
4616
4811
  ],
4617
4812
  "examples": [
4618
- "html`\n <schmancy-page rows=\"1fr_2fr_auto\">\n <header>App Bar</header>\n <main>Scrollable content</main>\n <footer>Navigation</footer>\n </schmancy-page>\n`"
4813
+ "<schmancy-page rows=\"auto_1fr_auto\">\n <schmancy-nav-drawer-appbar>Title</schmancy-nav-drawer-appbar>\n <main>Scrollable content</main>\n <schmancy-navigation-bar></schmancy-navigation-bar>\n</schmancy-page>"
4619
4814
  ]
4620
4815
  }
4621
4816
  ]
@@ -4716,7 +4911,13 @@
4716
4911
  "kind": "class",
4717
4912
  "name": "RadioButton",
4718
4913
  "tagName": "schmancy-radio-button",
4719
- "description": "Radio button component for use within radio groups.",
4914
+ "description": "Single radio button always rendered as a child of `<schmancy-radio-group>`, never standalone.",
4915
+ "summary": "Low-level primitive. Use schmancy-radio-group and pass `.options` for the common path; only instantiate schmancy-radio-button directly when you need per-button custom rendering.",
4916
+ "platformPrimitive": {
4917
+ "tag": "radio",
4918
+ "mode": "change",
4919
+ "note": "Schmancy-skinned `<input type=\"radio\">` semantics. Degrades to native radio if the tag never registers."
4920
+ },
4720
4921
  "attributes": [
4721
4922
  {
4722
4923
  "name": "value",
@@ -4746,6 +4947,9 @@
4746
4947
  },
4747
4948
  "default": "''"
4748
4949
  }
4950
+ ],
4951
+ "examples": [
4952
+ "<schmancy-radio-group name=\"plan\">\n <schmancy-radio-button value=\"free\">Free</schmancy-radio-button>\n <schmancy-radio-button value=\"pro\" checked>Pro</schmancy-radio-button>\n</schmancy-radio-group>"
4749
4953
  ]
4750
4954
  }
4751
4955
  ]
@@ -4758,6 +4962,13 @@
4758
4962
  "kind": "class",
4759
4963
  "name": "RadioGroup",
4760
4964
  "tagName": "schmancy-radio-group",
4965
+ "description": "Radio-button group — single-select from a static list of mutually-exclusive options. Form-associated.",
4966
+ "summary": "Use for 2–5 mutually-exclusive options where all should stay visible (\"Shipping: standard / express / overnight\"). Prefer schmancy-select when the list grows.",
4967
+ "platformPrimitive": {
4968
+ "tag": "radiogroup",
4969
+ "mode": "change",
4970
+ "note": "Renders schmancy-radio-button children. Degrades to a fieldset with native `<input type=\"radio\" name=\"…\">` siblings if the tag never registers."
4971
+ },
4761
4972
  "attributes": [
4762
4973
  {
4763
4974
  "name": "label",
@@ -4794,6 +5005,15 @@
4794
5005
  },
4795
5006
  "default": "false"
4796
5007
  }
5008
+ ],
5009
+ "events": [
5010
+ {
5011
+ "name": "change",
5012
+ "description": "`SchmancyRadioGroupChangeEvent` with the selected `value`."
5013
+ }
5014
+ ],
5015
+ "examples": [
5016
+ "<schmancy-radio-group\n name=\"shipping\"\n label=\"Shipping\"\n .options=${[\n { label: 'Standard (5 days)', value: 'standard' },\n { label: 'Express (2 days)', value: 'express' },\n { label: 'Overnight', value: 'overnight' },\n ]}\n></schmancy-radio-group>"
4797
5017
  ]
4798
5018
  }
4799
5019
  ]
@@ -4866,7 +5086,13 @@
4866
5086
  "kind": "class",
4867
5087
  "name": "SchmancySelect",
4868
5088
  "tagName": "schmancy-select",
4869
- "description": "Select dropdown component with single and multi-select support.",
5089
+ "description": "Dropdown selector single or multi-select from a list of `<schmancy-option>` children. Form-associated.",
5090
+ "summary": "Material Design dropdown with type-to-filter, keyboard nav, single or multi-select. Options are declared as `<schmancy-option>` children; value / values props sync with selection.",
5091
+ "platformPrimitive": {
5092
+ "tag": "select",
5093
+ "mode": "change",
5094
+ "note": "Floating-UI-positioned listbox. Degrades to native `<select>` styled via Tailwind if the tag never registers, though multi-select UX is lost."
5095
+ },
4870
5096
  "attributes": [
4871
5097
  {
4872
5098
  "name": "name",
@@ -4950,6 +5176,15 @@
4950
5176
  },
4951
5177
  "default": "''"
4952
5178
  }
5179
+ ],
5180
+ "events": [
5181
+ {
5182
+ "name": "change",
5183
+ "description": "`SchmancySelectChangeEvent` with `{ value }` (single) or `{ value: string[] }` (multi)."
5184
+ }
5185
+ ],
5186
+ "examples": [
5187
+ "<schmancy-select name=\"priority\" label=\"Priority\" value=\"medium\">\n <schmancy-option value=\"low\">Low</schmancy-option>\n <schmancy-option value=\"medium\">Medium</schmancy-option>\n <schmancy-option value=\"high\">High</schmancy-option>\n</schmancy-select>"
4953
5188
  ]
4954
5189
  }
4955
5190
  ]
@@ -5340,7 +5575,13 @@
5340
5575
  "kind": "class",
5341
5576
  "name": "SchmancySurface",
5342
5577
  "tagName": "schmancy-surface",
5343
- "description": "`<schmancy-surface>` component This component renders a styled container that adapts its dimensions based on the `fill` property. It supports various rounding options, elevation levels, and applies background and text color classes based on the specified surface variant. Additionally, when the `scroller` property is true, the component enables internal scrolling by applying overflow and scroll-behavior styles. SurfaceMixin automatically provides surfaceStyles CSS.",
5578
+ "description": "Themed container the root surface primitive. Sets background, text color, rounding, elevation, and (optionally) internal scroll. Provides a `SchmancySurfaceTypeContext` so descendants can adapt to the enclosing surface variant.",
5579
+ "summary": "Wrap a region of a page when you need it to pick up theme tokens (background + on-color + elevation). Nest surfaces to express Material Design's hierarchical color stacking.",
5580
+ "platformPrimitive": {
5581
+ "tag": "div",
5582
+ "mode": "-",
5583
+ "note": "Styled `<div>` with theme-driven background/color/elevation. Degrades to a plain `<div>` if the tag never registers — text stays readable, just loses theming."
5584
+ },
5344
5585
  "attributes": [
5345
5586
  {
5346
5587
  "name": "type",
@@ -5401,7 +5642,13 @@
5401
5642
  "kind": "class",
5402
5643
  "name": "SchmancySwitch",
5403
5644
  "tagName": "schmancy-switch",
5404
- "description": "Binary on/off control. Form-associated, keyboard-accessible, semantically a switch (ARIA role=\"switch\"). Distinct from `schmancy-checkbox`: a switch represents an immediate state change, a checkbox represents a selection in a form to be submitted.",
5645
+ "description": "Binary on/off control with immediate effect. Form-associated, keyboard-accessible, semantically a switch (ARIA role=\"switch\"). Distinct from `schmancy-checkbox`: a switch represents an immediate state change, a checkbox represents a selection in a form to be submitted.",
5646
+ "summary": "Use when flipping the control takes effect right away (e.g. \"Dark mode\", \"Enable notifications\"). Prefer schmancy-checkbox for form submissions.",
5647
+ "platformPrimitive": {
5648
+ "tag": "switch",
5649
+ "mode": "change",
5650
+ "note": "Accessible native `<button role=\"switch\" aria-checked>` under the hood. No native HTML element exists; falls back to a styled checkbox if the tag never registers."
5651
+ },
5405
5652
  "attributes": [
5406
5653
  {
5407
5654
  "name": "checked",
@@ -5461,6 +5708,9 @@
5461
5708
  "name": "thumb",
5462
5709
  "description": "The moving thumb."
5463
5710
  }
5711
+ ],
5712
+ "examples": [
5713
+ "<schmancy-switch ?checked=${this.darkMode} @change=${(e) => this.darkMode = e.detail.value}>\n Dark mode\n</schmancy-switch>"
5464
5714
  ]
5465
5715
  }
5466
5716
  ]
@@ -5653,7 +5903,13 @@
5653
5903
  "kind": "class",
5654
5904
  "name": "SchmancyTextarea",
5655
5905
  "tagName": "schmancy-textarea",
5656
- "description": "Textarea component with auto-resize and form integration.",
5906
+ "description": "Multi-line text input with auto-resize and form integration. Form-associated.",
5907
+ "summary": "Textarea for freeform text — notes, descriptions, messages. Auto-grows with content up to a maxlength.",
5908
+ "platformPrimitive": {
5909
+ "tag": "textarea",
5910
+ "mode": "change",
5911
+ "note": "Schmancy-skinned native `<textarea>`. Degrades to styled native `<textarea>` if the tag never registers."
5912
+ },
5657
5913
  "attributes": [
5658
5914
  {
5659
5915
  "name": "label",
@@ -5832,6 +6088,19 @@
5832
6088
  },
5833
6089
  "default": "false"
5834
6090
  }
6091
+ ],
6092
+ "events": [
6093
+ {
6094
+ "name": "input",
6095
+ "description": "On every keystroke."
6096
+ },
6097
+ {
6098
+ "name": "change",
6099
+ "description": "On blur."
6100
+ }
6101
+ ],
6102
+ "examples": [
6103
+ "<schmancy-textarea name=\"description\" label=\"Description\" rows=\"4\" maxlength=\"500\"></schmancy-textarea>"
5835
6104
  ]
5836
6105
  }
5837
6106
  ]
@@ -5894,7 +6163,13 @@
5894
6163
  "kind": "class",
5895
6164
  "name": "SchmancyThemeComponent",
5896
6165
  "tagName": "schmancy-theme",
5897
- "description": "SchmancyThemeComponent - Provides theming capabilities for Schmancy components. This component manages color schemes, primary colors, and theme distribution throughout the component tree. It can be used at the root level or nested to provide different themes to different parts of the application.",
6166
+ "description": "Theme provider generates a Material 3 palette from a seed color, resolves light/dark scheme, and publishes the token set to descendants as CSS custom properties (var(--schmancy-sys-color-…)).",
6167
+ "summary": "Always wrap your app root in a `<schmancy-theme root scheme=\"auto\" color=\"#…\">`. Nest additional `<schmancy-theme>` blocks to override theming for a subtree.",
6168
+ "platformPrimitive": {
6169
+ "tag": "div",
6170
+ "mode": "-",
6171
+ "note": "Styled `<div>` that publishes theme tokens via inline `--schmancy-sys-color-*` custom properties. Degrades to a plain div if the tag never registers — children lose theming and fall back to browser defaults."
6172
+ },
5898
6173
  "attributes": [
5899
6174
  {
5900
6175
  "name": "color",
@@ -5949,7 +6224,8 @@
5949
6224
  }
5950
6225
  ],
5951
6226
  "examples": [
5952
- "<!-- Root theme provider -->\n<schmancy-theme color=\"#6200ee\" scheme=\"auto\" root>\n <your-app></your-app>\n</schmancy-theme>\n\n<!-- Nested theme for specific section -->\n<schmancy-theme color=\"#2196f3\" scheme=\"dark\">\n <div class=\"dark-section\">\n <!-- Components here will use blue dark theme -->\n </div>\n</schmancy-theme>"
6227
+ "<!-- Root theme provider -->\n<schmancy-theme root scheme=\"auto\" color=\"#6200ee\">\n <your-app></your-app>\n</schmancy-theme>",
6228
+ "<!-- Nested theme for a specific section -->\n<schmancy-theme scheme=\"dark\" color=\"#2196f3\">\n <schmancy-surface fill=\"all\">\n <!-- Components here use the blue dark theme -->\n </schmancy-surface>\n</schmancy-theme>"
5953
6229
  ],
5954
6230
  "contexts": [
5955
6231
  {
@@ -6005,6 +6281,13 @@
6005
6281
  "kind": "class",
6006
6282
  "name": "SchmancyTree",
6007
6283
  "tagName": "schmancy-tree",
6284
+ "description": "Expandable tree node — a recursive disclosure widget. One root slot, one default slot for child nodes. Each node can itself contain schmancy-tree children.",
6285
+ "summary": "Use for hierarchical navigation / file-explorer layouts. Each level is a schmancy-tree with a `root` slot (the parent label) and default slot (the children, which may be more schmancy-trees).",
6286
+ "platformPrimitive": {
6287
+ "tag": "details",
6288
+ "mode": "toggle",
6289
+ "note": "Recursive `<details>`-like disclosure. Degrades to a plain nested list if the tag never registers — loses expand/collapse but stays navigable."
6290
+ },
6008
6291
  "attributes": [
6009
6292
  {
6010
6293
  "name": "open",
@@ -6024,6 +6307,9 @@
6024
6307
  "name": "",
6025
6308
  "description": "The children of the tree"
6026
6309
  }
6310
+ ],
6311
+ "examples": [
6312
+ "<schmancy-tree>\n <schmancy-list-item slot=\"root\">src/</schmancy-list-item>\n <schmancy-tree>\n <schmancy-list-item slot=\"root\">components/</schmancy-list-item>\n <schmancy-list-item>button.ts</schmancy-list-item>\n </schmancy-tree>\n</schmancy-tree>"
6027
6313
  ]
6028
6314
  }
6029
6315
  ]
@@ -6393,6 +6679,13 @@
6393
6679
  "kind": "class",
6394
6680
  "name": "SchmancyCountriesSelect",
6395
6681
  "tagName": "schmancy-select-countries",
6682
+ "description": "Country picker — type-ahead autocomplete over the ISO 3166-1 country list. Form-associated.",
6683
+ "summary": "Drop-in replacement for schmancy-autocomplete when the options are specifically \"every country\". Pre-seeds the list from countries.data.",
6684
+ "platformPrimitive": {
6685
+ "tag": "combobox",
6686
+ "mode": "change",
6687
+ "note": "Composes schmancy-autocomplete with a static options list. Value is the 2-letter ISO code."
6688
+ },
6396
6689
  "attributes": [
6397
6690
  {
6398
6691
  "name": "value",
@@ -6435,6 +6728,15 @@
6435
6728
  },
6436
6729
  "default": "''"
6437
6730
  }
6731
+ ],
6732
+ "events": [
6733
+ {
6734
+ "name": "change",
6735
+ "description": "`SchmancyAutocompleteChangeEvent` with `{ value: string }` (the ISO code)."
6736
+ }
6737
+ ],
6738
+ "examples": [
6739
+ "<schmancy-select-countries name=\"country\" label=\"Shipping country\" required></schmancy-select-countries>"
6438
6740
  ]
6439
6741
  }
6440
6742
  ]
@@ -6447,7 +6749,13 @@
6447
6749
  "kind": "class",
6448
6750
  "name": "SchmancyTimezonesSelect",
6449
6751
  "tagName": "schmancy-select-timezones",
6450
- "description": "Timezone selector component with autocomplete filtering.",
6752
+ "description": "Timezone picker type-ahead autocomplete over the IANA tz database. Form-associated.",
6753
+ "summary": "Drop-in replacement for schmancy-autocomplete when the options are IANA timezone names. Value is the IANA identifier (\"America/Los_Angeles\").",
6754
+ "platformPrimitive": {
6755
+ "tag": "combobox",
6756
+ "mode": "change",
6757
+ "note": "Composes schmancy-autocomplete with a static IANA timezones list."
6758
+ },
6451
6759
  "attributes": [
6452
6760
  {
6453
6761
  "name": "value",
@@ -6490,6 +6798,15 @@
6490
6798
  },
6491
6799
  "default": "''"
6492
6800
  }
6801
+ ],
6802
+ "events": [
6803
+ {
6804
+ "name": "change",
6805
+ "description": "`SchmancyAutocompleteChangeEvent` with `{ value: string }` (the IANA tz name)."
6806
+ }
6807
+ ],
6808
+ "examples": [
6809
+ "<schmancy-select-timezones name=\"tz\" label=\"Timezone\" value=\"America/New_York\"></schmancy-select-timezones>"
6493
6810
  ]
6494
6811
  }
6495
6812
  ]
@@ -6690,7 +7007,13 @@
6690
7007
  "kind": "class",
6691
7008
  "name": "SchmancyScroll",
6692
7009
  "tagName": "schmancy-scroll",
6693
- "description": "A custom scrollable container with enhanced features.",
7010
+ "description": "Scrollable container with debounced scroll events, horizontal/vertical direction, optional hidden scrollbar, and programmatic scrollTo via command events or refs.",
7011
+ "summary": "Use anywhere you'd reach for `overflow: auto` but also need debounced scroll events (for sticky headers, scroll spies, virtualization triggers) or the ability to drive scroll from elsewhere in the app by dispatching a schmancy-scroll-command event.",
7012
+ "platformPrimitive": {
7013
+ "tag": "div",
7014
+ "mode": "-",
7015
+ "note": "Styled scrollable `<div>`. Degrades to a plain scrollable div if the tag never registers — loses the debounced scroll event and the command-bus integration."
7016
+ },
6694
7017
  "attributes": [
6695
7018
  {
6696
7019
  "name": "hide",