@f-ewald/components 1.2.1 → 1.3.0

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 (57) hide show
  1. package/README.md +15 -2
  2. package/custom-elements.json +1019 -93
  3. package/dist/action-bar.d.ts +24 -0
  4. package/dist/action-bar.d.ts.map +1 -0
  5. package/dist/action-bar.js +67 -0
  6. package/dist/action-bar.js.map +1 -0
  7. package/dist/app-shell.d.ts +86 -0
  8. package/dist/app-shell.d.ts.map +1 -0
  9. package/dist/app-shell.js +460 -0
  10. package/dist/app-shell.js.map +1 -0
  11. package/dist/app-sidebar.d.ts +44 -0
  12. package/dist/app-sidebar.d.ts.map +1 -0
  13. package/dist/app-sidebar.js +211 -0
  14. package/dist/app-sidebar.js.map +1 -0
  15. package/dist/form-actions.d.ts +27 -0
  16. package/dist/form-actions.d.ts.map +1 -0
  17. package/dist/form-actions.js +65 -0
  18. package/dist/form-actions.js.map +1 -0
  19. package/dist/index.d.ts +8 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +8 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/mcp-server.js +82 -5
  24. package/dist/mcp-server.js.map +1 -1
  25. package/dist/page-header.d.ts +27 -0
  26. package/dist/page-header.d.ts.map +1 -0
  27. package/dist/page-header.js +106 -0
  28. package/dist/page-header.js.map +1 -0
  29. package/dist/pagination-nav.d.ts +34 -0
  30. package/dist/pagination-nav.d.ts.map +1 -0
  31. package/dist/pagination-nav.js +144 -0
  32. package/dist/pagination-nav.js.map +1 -0
  33. package/dist/timeline-container.d.ts +22 -0
  34. package/dist/timeline-container.d.ts.map +1 -0
  35. package/dist/timeline-container.js +42 -0
  36. package/dist/timeline-container.js.map +1 -0
  37. package/dist/timeline-entry.d.ts +31 -0
  38. package/dist/timeline-entry.d.ts.map +1 -0
  39. package/dist/timeline-entry.js +170 -0
  40. package/dist/timeline-entry.js.map +1 -0
  41. package/docs/action-bar.md +41 -0
  42. package/docs/app-shell.md +85 -0
  43. package/docs/app-sidebar.md +69 -0
  44. package/docs/design-language.md +74 -1
  45. package/docs/form-actions.md +43 -0
  46. package/docs/layouts/detail-only.md +52 -0
  47. package/docs/layouts/form-page.md +52 -0
  48. package/docs/layouts/list-detail.md +52 -0
  49. package/docs/layouts/list-only.md +50 -0
  50. package/docs/layouts/record-detail.md +88 -0
  51. package/docs/mcp-evaluation.md +21 -0
  52. package/docs/page-header.md +47 -0
  53. package/docs/pagination-nav.md +54 -0
  54. package/docs/timeline-container.md +44 -0
  55. package/docs/timeline-entry.md +52 -0
  56. package/llms.txt +229 -0
  57. package/package.json +1 -1
@@ -2,6 +2,52 @@
2
2
  "schemaVersion": "1.0.0",
3
3
  "readme": "",
4
4
  "modules": [
5
+ {
6
+ "kind": "javascript-module",
7
+ "path": "src/action-bar.ts",
8
+ "declarations": [
9
+ {
10
+ "kind": "class",
11
+ "description": "Toolbar that sits directly above a list or table: a left cluster for\nsearch and filters and a right cluster for record actions (create, delete,\nbulk actions). It's a presentational layout container only — drop any\ncontrols (`autocomplete-input`, `multi-select`, `ui-button`, …) into the\n`start` and `end` slots; the bar owns none of their behavior and adds no\nsearch field of its own. The two clusters wrap onto separate rows when the\nbar is too narrow.",
12
+ "name": "ActionBar",
13
+ "slots": [
14
+ {
15
+ "description": "Left cluster: search and filter controls.",
16
+ "name": "start"
17
+ },
18
+ {
19
+ "description": "Right cluster: record actions (create, delete, …).",
20
+ "name": "end"
21
+ }
22
+ ],
23
+ "members": [],
24
+ "superclass": {
25
+ "name": "LitElement",
26
+ "package": "lit"
27
+ },
28
+ "tagName": "action-bar",
29
+ "customElement": true
30
+ }
31
+ ],
32
+ "exports": [
33
+ {
34
+ "kind": "js",
35
+ "name": "ActionBar",
36
+ "declaration": {
37
+ "name": "ActionBar",
38
+ "module": "src/action-bar.ts"
39
+ }
40
+ },
41
+ {
42
+ "kind": "custom-element-definition",
43
+ "name": "action-bar",
44
+ "declaration": {
45
+ "name": "ActionBar",
46
+ "module": "src/action-bar.ts"
47
+ }
48
+ }
49
+ ]
50
+ },
5
51
  {
6
52
  "kind": "javascript-module",
7
53
  "path": "src/address-autocomplete.ts",
@@ -784,78 +830,487 @@
784
830
  "privacy": "private",
785
831
  "parameters": [
786
832
  {
787
- "name": "context",
833
+ "name": "context",
834
+ "type": {
835
+ "text": "CanvasRenderingContext2D | null"
836
+ }
837
+ }
838
+ ]
839
+ },
840
+ {
841
+ "kind": "method",
842
+ "name": "resetParticle",
843
+ "privacy": "private",
844
+ "return": {
845
+ "type": {
846
+ "text": "Particle"
847
+ }
848
+ },
849
+ "parameters": [
850
+ {
851
+ "name": "particle",
852
+ "type": {
853
+ "text": "Particle"
854
+ }
855
+ },
856
+ {
857
+ "name": "width",
858
+ "type": {
859
+ "text": "number"
860
+ }
861
+ },
862
+ {
863
+ "name": "height",
864
+ "type": {
865
+ "text": "number"
866
+ }
867
+ }
868
+ ]
869
+ }
870
+ ],
871
+ "attributes": [
872
+ {
873
+ "name": "duration",
874
+ "type": {
875
+ "text": "number"
876
+ },
877
+ "default": "6000",
878
+ "description": "How long the confetti streams before stopping, in ms.",
879
+ "fieldName": "duration"
880
+ }
881
+ ],
882
+ "superclass": {
883
+ "name": "LitElement",
884
+ "package": "lit"
885
+ },
886
+ "tagName": "animate-confetti",
887
+ "customElement": true
888
+ }
889
+ ],
890
+ "exports": [
891
+ {
892
+ "kind": "js",
893
+ "name": "AnimateConfetti",
894
+ "declaration": {
895
+ "name": "AnimateConfetti",
896
+ "module": "src/animate-confetti.ts"
897
+ }
898
+ },
899
+ {
900
+ "kind": "custom-element-definition",
901
+ "name": "animate-confetti",
902
+ "declaration": {
903
+ "name": "AnimateConfetti",
904
+ "module": "src/animate-confetti.ts"
905
+ }
906
+ }
907
+ ]
908
+ },
909
+ {
910
+ "kind": "javascript-module",
911
+ "path": "src/app-shell.ts",
912
+ "declarations": [
913
+ {
914
+ "kind": "class",
915
+ "description": "The dashboard page shell: a slot-based CSS-grid backbone that arranges a\nfull-height sidebar, a top bar, the main content, an optional right-hand\ndetail column, and an optional footer. It owns the responsive behavior so\nconsumers don't re-implement it — above the shared 48rem breakpoint the\nsidebar collapses to an icon rail and the detail region is an inline column;\nat or below it the sidebar becomes an off-canvas drawer and the detail region\nan overlay, both dismissed by a scrim or Escape.\n\nWidths are tunable per instance via `--component-sidebar-width` (16rem),\n`--component-sidebar-rail-width` (3.5rem), and `--component-topbar-height`\n(3rem); the detail column reuses the 20rem/25rem panel widths. The main\ncontent area is white by default — override it with\n`--component-main-background`. Give the shell a height (e.g. `height: 100vh`)\nso the sidebar and main can size and scroll.\n\nThe built-in top-bar button toggles the sidebar, and so does pressing `[`\nanywhere on the page (ignored while typing in a text field or with a\nmodifier held). Hovering or keyboard-focusing the toggle reveals a tooltip\nnaming the action and its `[` shortcut — the shortcut is not shown as\npermanent chrome.",
916
+ "name": "AppShell",
917
+ "slots": [
918
+ {
919
+ "description": "Main content area.",
920
+ "name": ""
921
+ },
922
+ {
923
+ "description": "Full-height navigation (typically `app-sidebar`).",
924
+ "name": "sidebar"
925
+ },
926
+ {
927
+ "description": "Top bar content, right of the built-in toggle.",
928
+ "name": "topbar"
929
+ },
930
+ {
931
+ "description": "Optional right-hand detail; shown when `detail-open` is set.",
932
+ "name": "detail"
933
+ },
934
+ {
935
+ "description": "Optional footer beneath the main content.",
936
+ "name": "footer"
937
+ }
938
+ ],
939
+ "members": [
940
+ {
941
+ "kind": "field",
942
+ "name": "sidebarCollapsed",
943
+ "type": {
944
+ "text": "boolean"
945
+ },
946
+ "default": "false",
947
+ "description": "Collapses the sidebar to an icon rail on desktop.",
948
+ "attribute": "sidebar-collapsed",
949
+ "reflects": true
950
+ },
951
+ {
952
+ "kind": "field",
953
+ "name": "detailOpen",
954
+ "type": {
955
+ "text": "boolean"
956
+ },
957
+ "default": "false",
958
+ "description": "Shows the right-hand detail region (inline column, or overlay on mobile).",
959
+ "attribute": "detail-open",
960
+ "reflects": true
961
+ },
962
+ {
963
+ "kind": "field",
964
+ "name": "detailWidth",
965
+ "type": {
966
+ "text": "\"compact\" | \"comfortable\""
967
+ },
968
+ "default": "\"compact\"",
969
+ "description": "Detail width: `compact` (20rem) or `comfortable` (25rem).",
970
+ "attribute": "detail-width"
971
+ },
972
+ {
973
+ "kind": "field",
974
+ "name": "_mobile",
975
+ "type": {
976
+ "text": "boolean"
977
+ },
978
+ "privacy": "private",
979
+ "default": "false",
980
+ "description": "Whether the viewport is at/below the 48rem breakpoint."
981
+ },
982
+ {
983
+ "kind": "field",
984
+ "name": "_mobileNavOpen",
985
+ "type": {
986
+ "text": "boolean"
987
+ },
988
+ "privacy": "private",
989
+ "default": "false",
990
+ "description": "Whether the mobile off-canvas nav drawer is open."
991
+ },
992
+ {
993
+ "kind": "field",
994
+ "name": "_hasFooter",
995
+ "type": {
996
+ "text": "boolean"
997
+ },
998
+ "privacy": "private",
999
+ "default": "false",
1000
+ "description": "Whether the footer slot has assigned content."
1001
+ },
1002
+ {
1003
+ "kind": "field",
1004
+ "name": "_mediaQuery",
1005
+ "type": {
1006
+ "text": "MediaQueryList | null"
1007
+ },
1008
+ "privacy": "private",
1009
+ "default": "null"
1010
+ },
1011
+ {
1012
+ "kind": "field",
1013
+ "name": "_previousFocus",
1014
+ "type": {
1015
+ "text": "HTMLElement | null"
1016
+ },
1017
+ "privacy": "private",
1018
+ "default": "null"
1019
+ },
1020
+ {
1021
+ "kind": "field",
1022
+ "name": "_onMediaChange",
1023
+ "privacy": "private",
1024
+ "description": "Tracks the breakpoint and closes the mobile drawer when returning to desktop."
1025
+ },
1026
+ {
1027
+ "kind": "field",
1028
+ "name": "_onKeydown",
1029
+ "privacy": "private",
1030
+ "description": "Handles the `[` sidebar shortcut and Escape dismissal of mobile overlays."
1031
+ },
1032
+ {
1033
+ "kind": "method",
1034
+ "name": "_isEditableTarget",
1035
+ "privacy": "private",
1036
+ "return": {
1037
+ "type": {
1038
+ "text": "boolean"
1039
+ }
1040
+ },
1041
+ "parameters": [
1042
+ {
1043
+ "name": "event",
1044
+ "type": {
1045
+ "text": "KeyboardEvent"
1046
+ }
1047
+ }
1048
+ ],
1049
+ "description": "Whether the keydown originated in a text field, so the shortcut defers to typing."
1050
+ },
1051
+ {
1052
+ "kind": "method",
1053
+ "name": "_toggleSidebar",
1054
+ "privacy": "private",
1055
+ "return": {
1056
+ "type": {
1057
+ "text": "void"
1058
+ }
1059
+ },
1060
+ "description": "Toggles the rail (desktop) or the off-canvas drawer (mobile) and announces it."
1061
+ },
1062
+ {
1063
+ "kind": "method",
1064
+ "name": "_closeDetail",
1065
+ "privacy": "private",
1066
+ "return": {
1067
+ "type": {
1068
+ "text": "void"
1069
+ }
1070
+ },
1071
+ "description": "Closes the detail overlay and notifies the consumer that owns `detail-open`."
1072
+ },
1073
+ {
1074
+ "kind": "method",
1075
+ "name": "_onScrim",
1076
+ "privacy": "private",
1077
+ "return": {
1078
+ "type": {
1079
+ "text": "void"
1080
+ }
1081
+ },
1082
+ "description": "Scrim click dismisses whichever overlay is open."
1083
+ },
1084
+ {
1085
+ "kind": "method",
1086
+ "name": "_syncSidebar",
1087
+ "privacy": "private",
1088
+ "return": {
1089
+ "type": {
1090
+ "text": "void"
1091
+ }
1092
+ },
1093
+ "description": "Mirrors the shell's rail state onto the slotted sidebar so it hides labels\nwhen collapsed on desktop, and always shows them in the mobile drawer."
1094
+ },
1095
+ {
1096
+ "kind": "method",
1097
+ "name": "_onFooterSlotChange",
1098
+ "privacy": "private",
1099
+ "return": {
1100
+ "type": {
1101
+ "text": "void"
1102
+ }
1103
+ },
1104
+ "parameters": [
1105
+ {
1106
+ "name": "event",
1107
+ "type": {
1108
+ "text": "Event"
1109
+ }
1110
+ }
1111
+ ],
1112
+ "description": "Collapses the footer row when nothing is slotted into it."
1113
+ }
1114
+ ],
1115
+ "events": [
1116
+ {
1117
+ "name": "sidebar-toggle",
1118
+ "type": {
1119
+ "text": "CustomEvent"
1120
+ },
1121
+ "description": "The built-in toggle changed the sidebar state."
1122
+ },
1123
+ {
1124
+ "name": "detail-close",
1125
+ "type": {
1126
+ "text": "CustomEvent"
1127
+ },
1128
+ "description": "The scrim or Escape dismissed the mobile detail overlay."
1129
+ }
1130
+ ],
1131
+ "attributes": [
1132
+ {
1133
+ "name": "sidebar-collapsed",
1134
+ "type": {
1135
+ "text": "boolean"
1136
+ },
1137
+ "default": "false",
1138
+ "description": "Collapses the sidebar to an icon rail on desktop.",
1139
+ "fieldName": "sidebarCollapsed"
1140
+ },
1141
+ {
1142
+ "name": "detail-open",
1143
+ "type": {
1144
+ "text": "boolean"
1145
+ },
1146
+ "default": "false",
1147
+ "description": "Shows the right-hand detail region (inline column, or overlay on mobile).",
1148
+ "fieldName": "detailOpen"
1149
+ },
1150
+ {
1151
+ "name": "detail-width",
1152
+ "type": {
1153
+ "text": "\"compact\" | \"comfortable\""
1154
+ },
1155
+ "default": "\"compact\"",
1156
+ "description": "Detail width: `compact` (20rem) or `comfortable` (25rem).",
1157
+ "fieldName": "detailWidth"
1158
+ }
1159
+ ],
1160
+ "superclass": {
1161
+ "name": "LitElement",
1162
+ "package": "lit"
1163
+ },
1164
+ "tagName": "app-shell",
1165
+ "customElement": true
1166
+ }
1167
+ ],
1168
+ "exports": [
1169
+ {
1170
+ "kind": "js",
1171
+ "name": "AppShell",
1172
+ "declaration": {
1173
+ "name": "AppShell",
1174
+ "module": "src/app-shell.ts"
1175
+ }
1176
+ },
1177
+ {
1178
+ "kind": "custom-element-definition",
1179
+ "name": "app-shell",
1180
+ "declaration": {
1181
+ "name": "AppShell",
1182
+ "module": "src/app-shell.ts"
1183
+ }
1184
+ }
1185
+ ]
1186
+ },
1187
+ {
1188
+ "kind": "javascript-module",
1189
+ "path": "src/app-sidebar.ts",
1190
+ "declarations": [
1191
+ {
1192
+ "kind": "class",
1193
+ "description": "Collapsible navigation sidebar for the `app-shell` sidebar slot. It is\ndeliberately presentational and router-agnostic: the consumer supplies the\nnav items as plain `<a>`/`<button>` elements (each an icon followed by a\nlabel), optional `<p>` group headings, and marks the active item with\n`aria-current=\"page\"`. The sidebar styles them, tracks hover/active/focus,\nand — in collapsed \"rail\" mode — centers the icons and hides the labels.\n\nRail mode is driven by the `collapsed` attribute (the parent `app-shell`\ntoggles it). Labels are hidden by the inherited `--app-sidebar-label` custom\nproperty, so each label element should read it, e.g.\n`<span style=\"display: var(--app-sidebar-label, inline)\">Reports</span>`;\nkeep an `aria-label` on the item so its accessible name survives collapse.\nThe sidebar fills the width and height of its container — `app-shell` owns\nthe actual rail/expanded width.",
1194
+ "name": "AppSidebar",
1195
+ "slots": [
1196
+ {
1197
+ "description": "Navigation items: `<a>`/`<button>` links and optional `<p>` headings.",
1198
+ "name": ""
1199
+ },
1200
+ {
1201
+ "description": "Optional brand pinned to the top: a small logo plus a name. Wrap the name in a `--app-sidebar-label` element so rail mode shows only the logo, centered in line with the nav icons.",
1202
+ "name": "header"
1203
+ },
1204
+ {
1205
+ "description": "Optional account/settings area pinned to the bottom.",
1206
+ "name": "footer"
1207
+ }
1208
+ ],
1209
+ "members": [
1210
+ {
1211
+ "kind": "field",
1212
+ "name": "collapsed",
1213
+ "type": {
1214
+ "text": "boolean"
1215
+ },
1216
+ "default": "false",
1217
+ "description": "Collapses the sidebar to an icon rail (centers icons, hides labels).",
1218
+ "attribute": "collapsed",
1219
+ "reflects": true
1220
+ },
1221
+ {
1222
+ "kind": "field",
1223
+ "name": "_hasHeader",
1224
+ "type": {
1225
+ "text": "boolean"
1226
+ },
1227
+ "privacy": "private",
1228
+ "default": "false",
1229
+ "description": "Whether the header slot has assigned content."
1230
+ },
1231
+ {
1232
+ "kind": "field",
1233
+ "name": "_hasFooter",
1234
+ "type": {
1235
+ "text": "boolean"
1236
+ },
1237
+ "privacy": "private",
1238
+ "default": "false",
1239
+ "description": "Whether the footer slot has assigned content."
1240
+ },
1241
+ {
1242
+ "kind": "method",
1243
+ "name": "_onHeaderSlotChange",
1244
+ "privacy": "private",
1245
+ "return": {
1246
+ "type": {
1247
+ "text": "void"
1248
+ }
1249
+ },
1250
+ "parameters": [
1251
+ {
1252
+ "name": "event",
788
1253
  "type": {
789
- "text": "CanvasRenderingContext2D | null"
1254
+ "text": "Event"
790
1255
  }
791
1256
  }
792
- ]
1257
+ ],
1258
+ "description": "Collapses the header row when nothing is slotted into it."
793
1259
  },
794
1260
  {
795
1261
  "kind": "method",
796
- "name": "resetParticle",
1262
+ "name": "_onFooterSlotChange",
797
1263
  "privacy": "private",
798
1264
  "return": {
799
1265
  "type": {
800
- "text": "Particle"
1266
+ "text": "void"
801
1267
  }
802
1268
  },
803
1269
  "parameters": [
804
1270
  {
805
- "name": "particle",
806
- "type": {
807
- "text": "Particle"
808
- }
809
- },
810
- {
811
- "name": "width",
812
- "type": {
813
- "text": "number"
814
- }
815
- },
816
- {
817
- "name": "height",
1271
+ "name": "event",
818
1272
  "type": {
819
- "text": "number"
1273
+ "text": "Event"
820
1274
  }
821
1275
  }
822
- ]
1276
+ ],
1277
+ "description": "Collapses the footer row when nothing is slotted into it."
823
1278
  }
824
1279
  ],
825
1280
  "attributes": [
826
1281
  {
827
- "name": "duration",
1282
+ "name": "collapsed",
828
1283
  "type": {
829
- "text": "number"
1284
+ "text": "boolean"
830
1285
  },
831
- "default": "6000",
832
- "description": "How long the confetti streams before stopping, in ms.",
833
- "fieldName": "duration"
1286
+ "default": "false",
1287
+ "description": "Collapses the sidebar to an icon rail (centers icons, hides labels).",
1288
+ "fieldName": "collapsed"
834
1289
  }
835
1290
  ],
836
1291
  "superclass": {
837
1292
  "name": "LitElement",
838
1293
  "package": "lit"
839
1294
  },
840
- "tagName": "animate-confetti",
1295
+ "tagName": "app-sidebar",
841
1296
  "customElement": true
842
1297
  }
843
1298
  ],
844
1299
  "exports": [
845
1300
  {
846
1301
  "kind": "js",
847
- "name": "AnimateConfetti",
1302
+ "name": "AppSidebar",
848
1303
  "declaration": {
849
- "name": "AnimateConfetti",
850
- "module": "src/animate-confetti.ts"
1304
+ "name": "AppSidebar",
1305
+ "module": "src/app-sidebar.ts"
851
1306
  }
852
1307
  },
853
1308
  {
854
1309
  "kind": "custom-element-definition",
855
- "name": "animate-confetti",
1310
+ "name": "app-sidebar",
856
1311
  "declaration": {
857
- "name": "AnimateConfetti",
858
- "module": "src/animate-confetti.ts"
1312
+ "name": "AppSidebar",
1313
+ "module": "src/app-sidebar.ts"
859
1314
  }
860
1315
  }
861
1316
  ]
@@ -3479,6 +3934,56 @@
3479
3934
  }
3480
3935
  ]
3481
3936
  },
3937
+ {
3938
+ "kind": "javascript-module",
3939
+ "path": "src/form-actions.ts",
3940
+ "declarations": [
3941
+ {
3942
+ "kind": "class",
3943
+ "description": "Form footer button bar with a fixed action order for internal apps: the\nprimary (submit) button is always rightmost, the secondary (cancel) button\nsits to its immediate left, and an optional tertiary/destructive action is\npinned to the far left. The order is enforced by the component regardless of\nthe source order the buttons are authored in, so every form in a product\nreads the same way.\n\nPurely presentational: it lays out whatever controls (usually `ui-button`)\nare slotted and never intercepts their clicks, `type=\"submit\"`, or events.",
3944
+ "name": "FormActions",
3945
+ "slots": [
3946
+ {
3947
+ "description": "Optional far-left action (e.g. a destructive \"Delete\").",
3948
+ "name": "start"
3949
+ },
3950
+ {
3951
+ "description": "The secondary/cancel action, placed left of primary.",
3952
+ "name": "secondary"
3953
+ },
3954
+ {
3955
+ "description": "The primary/submit action, always rightmost.",
3956
+ "name": "primary"
3957
+ }
3958
+ ],
3959
+ "members": [],
3960
+ "superclass": {
3961
+ "name": "LitElement",
3962
+ "package": "lit"
3963
+ },
3964
+ "tagName": "form-actions",
3965
+ "customElement": true
3966
+ }
3967
+ ],
3968
+ "exports": [
3969
+ {
3970
+ "kind": "js",
3971
+ "name": "FormActions",
3972
+ "declaration": {
3973
+ "name": "FormActions",
3974
+ "module": "src/form-actions.ts"
3975
+ }
3976
+ },
3977
+ {
3978
+ "kind": "custom-element-definition",
3979
+ "name": "form-actions",
3980
+ "declaration": {
3981
+ "name": "FormActions",
3982
+ "module": "src/form-actions.ts"
3983
+ }
3984
+ }
3985
+ ]
3986
+ },
3482
3987
  {
3483
3988
  "kind": "javascript-module",
3484
3989
  "path": "src/form-select.ts",
@@ -5679,6 +6184,86 @@
5679
6184
  "module": "./frame-box.js"
5680
6185
  }
5681
6186
  },
6187
+ {
6188
+ "kind": "js",
6189
+ "name": "AppShell",
6190
+ "declaration": {
6191
+ "name": "AppShell",
6192
+ "module": "./app-shell.js"
6193
+ }
6194
+ },
6195
+ {
6196
+ "kind": "js",
6197
+ "name": "SidebarToggleDetail",
6198
+ "declaration": {
6199
+ "name": "SidebarToggleDetail",
6200
+ "module": "./app-shell.js"
6201
+ }
6202
+ },
6203
+ {
6204
+ "kind": "js",
6205
+ "name": "AppSidebar",
6206
+ "declaration": {
6207
+ "name": "AppSidebar",
6208
+ "module": "./app-sidebar.js"
6209
+ }
6210
+ },
6211
+ {
6212
+ "kind": "js",
6213
+ "name": "ActionBar",
6214
+ "declaration": {
6215
+ "name": "ActionBar",
6216
+ "module": "./action-bar.js"
6217
+ }
6218
+ },
6219
+ {
6220
+ "kind": "js",
6221
+ "name": "PageHeader",
6222
+ "declaration": {
6223
+ "name": "PageHeader",
6224
+ "module": "./page-header.js"
6225
+ }
6226
+ },
6227
+ {
6228
+ "kind": "js",
6229
+ "name": "PaginationNav",
6230
+ "declaration": {
6231
+ "name": "PaginationNav",
6232
+ "module": "./pagination-nav.js"
6233
+ }
6234
+ },
6235
+ {
6236
+ "kind": "js",
6237
+ "name": "PageChangeDetail",
6238
+ "declaration": {
6239
+ "name": "PageChangeDetail",
6240
+ "module": "./pagination-nav.js"
6241
+ }
6242
+ },
6243
+ {
6244
+ "kind": "js",
6245
+ "name": "FormActions",
6246
+ "declaration": {
6247
+ "name": "FormActions",
6248
+ "module": "./form-actions.js"
6249
+ }
6250
+ },
6251
+ {
6252
+ "kind": "js",
6253
+ "name": "TimelineContainer",
6254
+ "declaration": {
6255
+ "name": "TimelineContainer",
6256
+ "module": "./timeline-container.js"
6257
+ }
6258
+ },
6259
+ {
6260
+ "kind": "js",
6261
+ "name": "TimelineEntry",
6262
+ "declaration": {
6263
+ "name": "TimelineEntry",
6264
+ "module": "./timeline-entry.js"
6265
+ }
6266
+ },
5682
6267
  {
5683
6268
  "kind": "js",
5684
6269
  "name": "CalendarEntry",
@@ -8109,121 +8694,323 @@
8109
8694
  "description": "Fired with `{ values: string[] }` (a copied array) when a value is added or removed through the UI. Programmatic `values` assignments do not fire it."
8110
8695
  }
8111
8696
  ],
8112
- "attributes": [
8697
+ "attributes": [
8698
+ {
8699
+ "name": "name",
8700
+ "type": {
8701
+ "text": "string"
8702
+ },
8703
+ "default": "\"\"",
8704
+ "description": "Form control name; each selected value submits under it.",
8705
+ "fieldName": "name"
8706
+ },
8707
+ {
8708
+ "name": "label",
8709
+ "type": {
8710
+ "text": "string"
8711
+ },
8712
+ "default": "\"\"",
8713
+ "description": "Accessible label applied to the trigger.",
8714
+ "fieldName": "label"
8715
+ },
8716
+ {
8717
+ "name": "placeholder",
8718
+ "type": {
8719
+ "text": "string"
8720
+ },
8721
+ "default": "\"Select options\"",
8722
+ "description": "Text shown on the trigger when nothing is selected.",
8723
+ "fieldName": "placeholder"
8724
+ },
8725
+ {
8726
+ "name": "disabled",
8727
+ "type": {
8728
+ "text": "boolean"
8729
+ },
8730
+ "default": "false",
8731
+ "description": "Disables the whole control, preventing the popover from opening.",
8732
+ "fieldName": "disabled"
8733
+ },
8734
+ {
8735
+ "name": "required",
8736
+ "type": {
8737
+ "text": "boolean"
8738
+ },
8739
+ "default": "false",
8740
+ "description": "Marks the control as required for native form validation.",
8741
+ "fieldName": "required"
8742
+ },
8743
+ {
8744
+ "name": "searchable",
8745
+ "type": {
8746
+ "text": "boolean"
8747
+ },
8748
+ "default": "false",
8749
+ "description": "Enables editable, case-insensitive infix filtering by option label.\nTyped text never becomes a selected value.",
8750
+ "fieldName": "searchable"
8751
+ },
8752
+ {
8753
+ "name": "max",
8754
+ "type": {
8755
+ "text": "number"
8756
+ },
8757
+ "default": "0",
8758
+ "description": "Maximum number of selectable values; `0` (default) means unlimited.",
8759
+ "fieldName": "max"
8760
+ },
8761
+ {
8762
+ "name": "variant",
8763
+ "type": {
8764
+ "text": "MultiSelectVariant"
8765
+ },
8766
+ "default": "\"dropdown\"",
8767
+ "description": "Presentation variant. `\"dropdown\"` (default) opens a popover listbox;\n`\"list\"` renders a persistently visible, bordered list surface. Reflected\nso consumers can style by `[variant=\"list\"]`.",
8768
+ "fieldName": "variant"
8769
+ },
8770
+ {
8771
+ "name": "visible-rows",
8772
+ "type": {
8773
+ "text": "number"
8774
+ },
8775
+ "default": "5",
8776
+ "description": "Number of `2rem` rows the `list` variant's scroll viewport shows before it\nscrolls, mirroring a native `<select size>`. Normalized to an integer of at\nleast `1` (default `5`); ignored by the `dropdown` variant.",
8777
+ "fieldName": "visibleRows"
8778
+ },
8779
+ {
8780
+ "name": "show-chips",
8781
+ "type": {
8782
+ "text": "boolean"
8783
+ },
8784
+ "default": "false",
8785
+ "description": "When true, the selected values are also rendered as removable chips below\nthe trigger, each with an accessible `32px` remove control. Off by default:\nthe trigger already summarizes the selection, and values can be toggled off\nin the listbox. Applies to both variants.",
8786
+ "fieldName": "showChips"
8787
+ }
8788
+ ],
8789
+ "superclass": {
8790
+ "name": "LitElement",
8791
+ "package": "lit"
8792
+ },
8793
+ "tagName": "multi-select",
8794
+ "customElement": true
8795
+ }
8796
+ ],
8797
+ "exports": [
8798
+ {
8799
+ "kind": "js",
8800
+ "name": "MultiSelect",
8801
+ "declaration": {
8802
+ "name": "MultiSelect",
8803
+ "module": "src/multi-select.ts"
8804
+ }
8805
+ },
8806
+ {
8807
+ "kind": "custom-element-definition",
8808
+ "name": "multi-select",
8809
+ "declaration": {
8810
+ "name": "MultiSelect",
8811
+ "module": "src/multi-select.ts"
8812
+ }
8813
+ }
8814
+ ]
8815
+ },
8816
+ {
8817
+ "kind": "javascript-module",
8818
+ "path": "src/page-header.ts",
8819
+ "declarations": [
8820
+ {
8821
+ "kind": "class",
8822
+ "description": "Page title block for the top of a dashboard view: an optional breadcrumb\ntrail, the page heading, and a right-aligned cluster of page-level actions.\nIt only lays these out — the breadcrumb links and action buttons are entirely\nthe consumer's, so it stays framework- and router-agnostic.",
8823
+ "name": "PageHeader",
8824
+ "slots": [
8825
+ {
8826
+ "description": "Optional breadcrumb trail rendered above the heading.",
8827
+ "name": "breadcrumb"
8828
+ },
8829
+ {
8830
+ "description": "Optional right-aligned page actions (e.g. a primary button).",
8831
+ "name": "actions"
8832
+ }
8833
+ ],
8834
+ "members": [
8113
8835
  {
8114
- "name": "name",
8836
+ "kind": "field",
8837
+ "name": "heading",
8115
8838
  "type": {
8116
8839
  "text": "string"
8117
8840
  },
8118
8841
  "default": "\"\"",
8119
- "description": "Form control name; each selected value submits under it.",
8120
- "fieldName": "name"
8842
+ "description": "The page heading text.",
8843
+ "attribute": "heading"
8121
8844
  },
8122
8845
  {
8123
- "name": "label",
8846
+ "kind": "field",
8847
+ "name": "_hasBreadcrumb",
8124
8848
  "type": {
8125
- "text": "string"
8849
+ "text": "boolean"
8126
8850
  },
8127
- "default": "\"\"",
8128
- "description": "Accessible label applied to the trigger.",
8129
- "fieldName": "label"
8851
+ "privacy": "private",
8852
+ "default": "false",
8853
+ "description": "Whether the breadcrumb slot currently has assigned content."
8130
8854
  },
8131
8855
  {
8132
- "name": "placeholder",
8133
- "type": {
8134
- "text": "string"
8856
+ "kind": "method",
8857
+ "name": "_onBreadcrumbSlotChange",
8858
+ "privacy": "private",
8859
+ "return": {
8860
+ "type": {
8861
+ "text": "void"
8862
+ }
8135
8863
  },
8136
- "default": "\"Select options\"",
8137
- "description": "Text shown on the trigger when nothing is selected.",
8138
- "fieldName": "placeholder"
8139
- },
8864
+ "parameters": [
8865
+ {
8866
+ "name": "event",
8867
+ "type": {
8868
+ "text": "Event"
8869
+ }
8870
+ }
8871
+ ],
8872
+ "description": "Tracks whether the breadcrumb slot has content so its row can collapse when empty."
8873
+ }
8874
+ ],
8875
+ "attributes": [
8140
8876
  {
8141
- "name": "disabled",
8877
+ "name": "heading",
8142
8878
  "type": {
8143
- "text": "boolean"
8879
+ "text": "string"
8144
8880
  },
8145
- "default": "false",
8146
- "description": "Disables the whole control, preventing the popover from opening.",
8147
- "fieldName": "disabled"
8148
- },
8881
+ "default": "\"\"",
8882
+ "description": "The page heading text.",
8883
+ "fieldName": "heading"
8884
+ }
8885
+ ],
8886
+ "superclass": {
8887
+ "name": "LitElement",
8888
+ "package": "lit"
8889
+ },
8890
+ "tagName": "page-header",
8891
+ "customElement": true
8892
+ }
8893
+ ],
8894
+ "exports": [
8895
+ {
8896
+ "kind": "js",
8897
+ "name": "PageHeader",
8898
+ "declaration": {
8899
+ "name": "PageHeader",
8900
+ "module": "src/page-header.ts"
8901
+ }
8902
+ },
8903
+ {
8904
+ "kind": "custom-element-definition",
8905
+ "name": "page-header",
8906
+ "declaration": {
8907
+ "name": "PageHeader",
8908
+ "module": "src/page-header.ts"
8909
+ }
8910
+ }
8911
+ ]
8912
+ },
8913
+ {
8914
+ "kind": "javascript-module",
8915
+ "path": "src/pagination-nav.ts",
8916
+ "declarations": [
8917
+ {
8918
+ "kind": "class",
8919
+ "description": "Minimal, controlled pager for list/table views: a previous/next control pair\naround a \"Page N of M\" status. It owns no data — the consumer sets\n`current-page` / `total-pages` and moves the page in response to the\n`page-change` event (typically alongside its own data fetch), exactly like\n`data-table` leaves the row data to the caller.\n\nPrevious is disabled on the first page and next on the last; neither fires an\nevent when there is nowhere to go.",
8920
+ "name": "PaginationNav",
8921
+ "members": [
8149
8922
  {
8150
- "name": "required",
8923
+ "kind": "field",
8924
+ "name": "currentPage",
8151
8925
  "type": {
8152
- "text": "boolean"
8926
+ "text": "number"
8153
8927
  },
8154
- "default": "false",
8155
- "description": "Marks the control as required for native form validation.",
8156
- "fieldName": "required"
8928
+ "default": "1",
8929
+ "description": "The 1-based current page.",
8930
+ "attribute": "current-page"
8157
8931
  },
8158
8932
  {
8159
- "name": "searchable",
8933
+ "kind": "field",
8934
+ "name": "totalPages",
8160
8935
  "type": {
8161
- "text": "boolean"
8936
+ "text": "number"
8162
8937
  },
8163
- "default": "false",
8164
- "description": "Enables editable, case-insensitive infix filtering by option label.\nTyped text never becomes a selected value.",
8165
- "fieldName": "searchable"
8938
+ "default": "1",
8939
+ "description": "The total number of pages (minimum 1).",
8940
+ "attribute": "total-pages"
8166
8941
  },
8167
8942
  {
8168
- "name": "max",
8169
- "type": {
8170
- "text": "number"
8943
+ "kind": "method",
8944
+ "name": "_go",
8945
+ "privacy": "private",
8946
+ "return": {
8947
+ "type": {
8948
+ "text": "void"
8949
+ }
8171
8950
  },
8172
- "default": "0",
8173
- "description": "Maximum number of selectable values; `0` (default) means unlimited.",
8174
- "fieldName": "max"
8175
- },
8951
+ "parameters": [
8952
+ {
8953
+ "name": "page",
8954
+ "type": {
8955
+ "text": "number"
8956
+ }
8957
+ }
8958
+ ],
8959
+ "description": "Clamps `page` to the valid range and fires `page-change` when it actually moves."
8960
+ }
8961
+ ],
8962
+ "events": [
8176
8963
  {
8177
- "name": "variant",
8964
+ "name": "page-change",
8178
8965
  "type": {
8179
- "text": "MultiSelectVariant"
8966
+ "text": "CustomEvent"
8180
8967
  },
8181
- "default": "\"dropdown\"",
8182
- "description": "Presentation variant. `\"dropdown\"` (default) opens a popover listbox;\n`\"list\"` renders a persistently visible, bordered list surface. Reflected\nso consumers can style by `[variant=\"list\"]`.",
8183
- "fieldName": "variant"
8184
- },
8968
+ "description": "The user picked a new page (`detail: { page }`)."
8969
+ }
8970
+ ],
8971
+ "attributes": [
8185
8972
  {
8186
- "name": "visible-rows",
8973
+ "name": "current-page",
8187
8974
  "type": {
8188
8975
  "text": "number"
8189
8976
  },
8190
- "default": "5",
8191
- "description": "Number of `2rem` rows the `list` variant's scroll viewport shows before it\nscrolls, mirroring a native `<select size>`. Normalized to an integer of at\nleast `1` (default `5`); ignored by the `dropdown` variant.",
8192
- "fieldName": "visibleRows"
8977
+ "default": "1",
8978
+ "description": "The 1-based current page.",
8979
+ "fieldName": "currentPage"
8193
8980
  },
8194
8981
  {
8195
- "name": "show-chips",
8982
+ "name": "total-pages",
8196
8983
  "type": {
8197
- "text": "boolean"
8984
+ "text": "number"
8198
8985
  },
8199
- "default": "false",
8200
- "description": "When true, the selected values are also rendered as removable chips below\nthe trigger, each with an accessible `32px` remove control. Off by default:\nthe trigger already summarizes the selection, and values can be toggled off\nin the listbox. Applies to both variants.",
8201
- "fieldName": "showChips"
8986
+ "default": "1",
8987
+ "description": "The total number of pages (minimum 1).",
8988
+ "fieldName": "totalPages"
8202
8989
  }
8203
8990
  ],
8204
8991
  "superclass": {
8205
8992
  "name": "LitElement",
8206
8993
  "package": "lit"
8207
8994
  },
8208
- "tagName": "multi-select",
8995
+ "tagName": "pagination-nav",
8209
8996
  "customElement": true
8210
8997
  }
8211
8998
  ],
8212
8999
  "exports": [
8213
9000
  {
8214
9001
  "kind": "js",
8215
- "name": "MultiSelect",
9002
+ "name": "PaginationNav",
8216
9003
  "declaration": {
8217
- "name": "MultiSelect",
8218
- "module": "src/multi-select.ts"
9004
+ "name": "PaginationNav",
9005
+ "module": "src/pagination-nav.ts"
8219
9006
  }
8220
9007
  },
8221
9008
  {
8222
9009
  "kind": "custom-element-definition",
8223
- "name": "multi-select",
9010
+ "name": "pagination-nav",
8224
9011
  "declaration": {
8225
- "name": "MultiSelect",
8226
- "module": "src/multi-select.ts"
9012
+ "name": "PaginationNav",
9013
+ "module": "src/pagination-nav.ts"
8227
9014
  }
8228
9015
  }
8229
9016
  ]
@@ -10259,6 +11046,145 @@
10259
11046
  }
10260
11047
  ]
10261
11048
  },
11049
+ {
11050
+ "kind": "javascript-module",
11051
+ "path": "src/timeline-container.ts",
11052
+ "declarations": [
11053
+ {
11054
+ "kind": "class",
11055
+ "description": "Vertical timeline: a single connecting line runs down the left edge and each\nslotted `timeline-entry` places a dot on it. This is a thin layout and\nsemantics wrapper — the entries draw the line segments and dots themselves,\nso the container adds no gap between them (a gap would break the line).\nExposed to assistive technology as a list of events.",
11056
+ "name": "TimelineContainer",
11057
+ "slots": [
11058
+ {
11059
+ "description": "`timeline-entry` elements, in chronological order.",
11060
+ "name": ""
11061
+ }
11062
+ ],
11063
+ "members": [],
11064
+ "superclass": {
11065
+ "name": "LitElement",
11066
+ "package": "lit"
11067
+ },
11068
+ "tagName": "timeline-container",
11069
+ "customElement": true
11070
+ }
11071
+ ],
11072
+ "exports": [
11073
+ {
11074
+ "kind": "js",
11075
+ "name": "TimelineContainer",
11076
+ "declaration": {
11077
+ "name": "TimelineContainer",
11078
+ "module": "src/timeline-container.ts"
11079
+ }
11080
+ },
11081
+ {
11082
+ "kind": "custom-element-definition",
11083
+ "name": "timeline-container",
11084
+ "declaration": {
11085
+ "name": "TimelineContainer",
11086
+ "module": "src/timeline-container.ts"
11087
+ }
11088
+ }
11089
+ ]
11090
+ },
11091
+ {
11092
+ "kind": "javascript-module",
11093
+ "path": "src/timeline-entry.ts",
11094
+ "declarations": [
11095
+ {
11096
+ "kind": "class",
11097
+ "description": "One event on a `timeline-container`: a dot on the vertical line, an optional\nheadline, a relative timestamp (\"3 hours ago\"), and freely nested content.\nThe connecting line is drawn here — its segment above the dot is hidden on\nthe first entry and the segment below is hidden on the last, so the line caps\nexactly at the first and last dots. Only meaningful inside a\n`timeline-container`; demonstrated through it.",
11098
+ "name": "TimelineEntry",
11099
+ "slots": [
11100
+ {
11101
+ "description": "Optional headline/title for the event.",
11102
+ "name": "headline"
11103
+ },
11104
+ {
11105
+ "description": "The event content; nest any elements here.",
11106
+ "name": ""
11107
+ }
11108
+ ],
11109
+ "members": [
11110
+ {
11111
+ "kind": "field",
11112
+ "name": "datetime",
11113
+ "type": {
11114
+ "text": "string | null"
11115
+ },
11116
+ "default": "null",
11117
+ "description": "ISO 8601 or SQLite datetime string, rendered as a relative time.",
11118
+ "attribute": "datetime"
11119
+ },
11120
+ {
11121
+ "kind": "field",
11122
+ "name": "_hasHeadline",
11123
+ "type": {
11124
+ "text": "boolean"
11125
+ },
11126
+ "privacy": "private",
11127
+ "default": "false",
11128
+ "description": "Whether the headline slot currently has assigned content."
11129
+ },
11130
+ {
11131
+ "kind": "method",
11132
+ "name": "_onHeadlineSlotChange",
11133
+ "privacy": "private",
11134
+ "return": {
11135
+ "type": {
11136
+ "text": "void"
11137
+ }
11138
+ },
11139
+ "parameters": [
11140
+ {
11141
+ "name": "event",
11142
+ "type": {
11143
+ "text": "Event"
11144
+ }
11145
+ }
11146
+ ],
11147
+ "description": "Collapses the headline when nothing is slotted so the time sits alone."
11148
+ }
11149
+ ],
11150
+ "attributes": [
11151
+ {
11152
+ "name": "datetime",
11153
+ "type": {
11154
+ "text": "string | null"
11155
+ },
11156
+ "default": "null",
11157
+ "description": "ISO 8601 or SQLite datetime string, rendered as a relative time.",
11158
+ "fieldName": "datetime"
11159
+ }
11160
+ ],
11161
+ "superclass": {
11162
+ "name": "LitElement",
11163
+ "package": "lit"
11164
+ },
11165
+ "tagName": "timeline-entry",
11166
+ "customElement": true
11167
+ }
11168
+ ],
11169
+ "exports": [
11170
+ {
11171
+ "kind": "js",
11172
+ "name": "TimelineEntry",
11173
+ "declaration": {
11174
+ "name": "TimelineEntry",
11175
+ "module": "src/timeline-entry.ts"
11176
+ }
11177
+ },
11178
+ {
11179
+ "kind": "custom-element-definition",
11180
+ "name": "timeline-entry",
11181
+ "declaration": {
11182
+ "name": "TimelineEntry",
11183
+ "module": "src/timeline-entry.ts"
11184
+ }
11185
+ }
11186
+ ]
11187
+ },
10262
11188
  {
10263
11189
  "kind": "javascript-module",
10264
11190
  "path": "src/toast-notification.ts",