@coffer-org/web 7.2.0 → 7.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 (125) hide show
  1. package/dist/assets/ChatWidget-Bhj-WiNC.js +5 -0
  2. package/dist/assets/DiagnosticsPage-CAWQ6aOl.js +1 -0
  3. package/dist/assets/{MarkdownEditor-0mNSwLu_.js → MarkdownEditor-On2GbApm.js} +3 -3
  4. package/dist/assets/NewRecordView-Y6PoWPB9.js +1 -0
  5. package/dist/assets/PluginSettingsPage-CcTksC-8.js +1 -0
  6. package/dist/assets/ScanSummary-xxY2oZVM.js +1 -0
  7. package/dist/assets/SettingsForm-NWfklsPY.js +1 -0
  8. package/dist/assets/SettingsPage-CjsbuhdW.js +3 -0
  9. package/dist/assets/ThemeSwitcher-DKrSbFhp.js +1 -0
  10. package/dist/assets/{api-DD1tY5Dq.js → api-QNHQU9to.js} +1 -1
  11. package/dist/assets/{auth-context-BCos5wiL.js → auth-context-CoCE5oPD.js} +1 -1
  12. package/dist/assets/condition-B5taAXkb.js +1 -0
  13. package/dist/assets/countries-CoGvAZ5u.js +1 -0
  14. package/dist/assets/{data-size-qpzofknI.js → data-size-BMG0D59K.js} +1 -1
  15. package/dist/assets/{development-olQNibq5.js → development-ChLInqDF.js} +1 -1
  16. package/dist/assets/{esm-BsLSfif3.js → esm-CX8ST5Fv.js} +1 -1
  17. package/dist/assets/esm-oGoWacTd.js +24 -0
  18. package/dist/assets/extend-yQ8zoqGc.js +1 -0
  19. package/dist/assets/fields-CV3RQg0Y.js +64 -0
  20. package/dist/assets/file-text-CITvp61x.js +1 -0
  21. package/dist/assets/{icons-BTbA1N7a.js → icons-0CjpO0K1.js} +1 -1
  22. package/dist/assets/ilamy-view-CQD1H32m.js +7 -0
  23. package/dist/assets/index-4Lr8BOK1.js +22 -0
  24. package/dist/assets/index-lbeXf7OV.css +2 -0
  25. package/dist/assets/{input-tJjsdU1x.js → input-BFMNMo6y.js} +1 -1
  26. package/dist/assets/list-cache-DOhsI_p2.js +1 -0
  27. package/dist/assets/{markdown-vendor-CtaBI5gJ.js → markdown-vendor-WSL3P01P.js} +15 -15
  28. package/dist/assets/phone-input-BZ9vGYpI.js +21 -0
  29. package/dist/assets/phone-input-BpNLpzg_.js +1 -0
  30. package/dist/assets/plugin-Cjr7lgQH.js +1 -0
  31. package/dist/assets/{version-CtfLXkhy.js → plugin-label-CfdhA4_L.js} +1 -1
  32. package/dist/assets/{popover-C2xHG6L3.js → popover-C1KB68Kk.js} +1 -1
  33. package/dist/assets/registration-BBxYynR4.js +1 -0
  34. package/dist/assets/settings-Bo5IOwVg.js +1 -0
  35. package/dist/assets/shelf-Cj_pNvd-.js +1 -0
  36. package/dist/assets/showcase-BeBnutzT.js +1 -0
  37. package/dist/assets/src-0TBpEeKK.js +1 -0
  38. package/dist/assets/src-1AsWJbID.js +7 -0
  39. package/dist/assets/src-4bmZI2h_.js +1 -0
  40. package/dist/assets/src-B2aXBzDf.js +4 -0
  41. package/dist/assets/src-BHz-TcxU.js +1 -0
  42. package/dist/assets/src-BZK1QVol.js +1 -0
  43. package/dist/assets/src-BjYucEBM.js +1 -0
  44. package/dist/assets/src-Bl8rYgUt2.js +1 -0
  45. package/dist/assets/src-BmyfVP9z.js +1 -0
  46. package/dist/assets/src-BrHtOaqX.js +1 -0
  47. package/dist/assets/src-Bzgh6Ge5.js +1 -0
  48. package/dist/assets/src-C46sbhiF.js +2 -0
  49. package/dist/assets/src-CD1zBxk2.js +1 -0
  50. package/dist/assets/src-CE1TPDES.js +6 -0
  51. package/dist/assets/src-CQOQ3BNT.js +1 -0
  52. package/dist/assets/{src-IYiBUs1S.js → src-Cz38tTr3.js} +1 -1
  53. package/dist/assets/src-D14fQdLH.js +1 -0
  54. package/dist/assets/src-DgQcfYnz.js +1 -0
  55. package/dist/assets/src-DnN2GqEI.js +1 -0
  56. package/dist/assets/src-Dr_dOgc9.js +6 -0
  57. package/dist/assets/src-Ds6m7Evp2.js +1 -0
  58. package/dist/assets/src-Mln-mCD3.js +1 -0
  59. package/dist/assets/src-Q4BhkNtH.js +1 -0
  60. package/dist/assets/src-qJ0szNVM.js +1 -0
  61. package/dist/assets/src-rMuD7zD4.js +1 -0
  62. package/dist/assets/{src-DEcZTAam.js → src-tKMBP4Dv.js} +3 -3
  63. package/dist/assets/src-xh_qAK43.js +1 -0
  64. package/dist/assets/ui-BuqzqLDw.js +2 -0
  65. package/dist/assets/ui-CqUVBwcW.js +2 -0
  66. package/dist/assets/ui-Dj0Nsb2P.js +2 -0
  67. package/dist/assets/ui-QzaKLk9q.js +2 -0
  68. package/dist/assets/ui-vendor-C0IUUP3F.js +44 -0
  69. package/dist/index.html +22 -22
  70. package/dist-vendor/web-ui.js +20098 -14890
  71. package/package.json +1 -1
  72. package/dist/assets/ChatWidget-ByBb2eNs.js +0 -31
  73. package/dist/assets/DiagnosticsPage-tAFkmCz8.js +0 -1
  74. package/dist/assets/NewRecordView-CTSqFBfe.js +0 -1
  75. package/dist/assets/PluginSettingsPage-BFsSZgTa.js +0 -1
  76. package/dist/assets/ScanSummary-CaG-s5qh.js +0 -1
  77. package/dist/assets/SettingsForm-C_K9RpFr.js +0 -1
  78. package/dist/assets/SettingsPage-Cqp1tUyi.js +0 -3
  79. package/dist/assets/ThemeSwitcher-BPuCvU1U.js +0 -1
  80. package/dist/assets/arrow-left-DDsxjRCq.js +0 -1
  81. package/dist/assets/esm-DJsKiDbH.js +0 -24
  82. package/dist/assets/extend-BMkkNVfm.js +0 -1
  83. package/dist/assets/fields-GPyF03tK.js +0 -64
  84. package/dist/assets/file-text-DI3tERhf.js +0 -1
  85. package/dist/assets/index-C5rNjIku.css +0 -2
  86. package/dist/assets/index-DpBBejzP.js +0 -24
  87. package/dist/assets/lib-DU7Qh2A4.js +0 -1
  88. package/dist/assets/list-cache-B4i_A9fj.js +0 -1
  89. package/dist/assets/phone-input-BeYLRpyW.js +0 -1
  90. package/dist/assets/phone-input-CZF7hU3E.js +0 -21
  91. package/dist/assets/plugin-CFEkHH3f.js +0 -1
  92. package/dist/assets/plugin-ui-CKd6q8ec.js +0 -1
  93. package/dist/assets/settings-rQsBFoL2.js +0 -1
  94. package/dist/assets/shelf-CpE68_8d.js +0 -1
  95. package/dist/assets/showcase-CUDyXMb7.js +0 -1
  96. package/dist/assets/src-2QhdFJyH.js +0 -1
  97. package/dist/assets/src-BRA1s942.js +0 -1
  98. package/dist/assets/src-Bmc_xgWr.js +0 -1
  99. package/dist/assets/src-BnvKHmLu.js +0 -1
  100. package/dist/assets/src-Bv7IbF5F.js +0 -1
  101. package/dist/assets/src-C3X1cmlu.js +0 -1
  102. package/dist/assets/src-C3hdIsRT.js +0 -1
  103. package/dist/assets/src-CIrBx5O0.js +0 -1
  104. package/dist/assets/src-CTlBmB5n.js +0 -1
  105. package/dist/assets/src-Cp4yFztL.js +0 -4
  106. package/dist/assets/src-CvUhNHtO.js +0 -1
  107. package/dist/assets/src-D5pqHmdF.js +0 -1
  108. package/dist/assets/src-D9ZNj5Fi2.js +0 -1
  109. package/dist/assets/src-DAUYP87f2.js +0 -1
  110. package/dist/assets/src-DEqFDnFO.js +0 -1
  111. package/dist/assets/src-DXSkgVrX.js +0 -4
  112. package/dist/assets/src-DaHZILQZ.js +0 -1
  113. package/dist/assets/src-Dvbi--2I.js +0 -6
  114. package/dist/assets/src-Uu0k-CHA.js +0 -1
  115. package/dist/assets/src-WB1-7_Wh.js +0 -1
  116. package/dist/assets/src-dXlj2maQ.js +0 -1
  117. package/dist/assets/src-d_-Z83D-.js +0 -2
  118. package/dist/assets/src-eAsO2o4h2.js +0 -1
  119. package/dist/assets/src-uWOnIJWD.js +0 -6
  120. package/dist/assets/src-yL3q5Nfe.js +0 -1
  121. package/dist/assets/ui-A8aS2-NQ.js +0 -2
  122. package/dist/assets/ui-BK1F_c4b.js +0 -2
  123. package/dist/assets/ui-C9-epiVm.js +0 -2
  124. package/dist/assets/ui-kICtw37s.js +0 -1
  125. package/dist/assets/ui-vendor-BuwRGdK1.js +0 -44
@@ -0,0 +1 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{n as t}from"./plugin-Cjr7lgQH.js";import{t as n}from"./settings-Bo5IOwVg.js";var r=t({id:`console`,version:`1.0.0`,dependsOn:[],label:`console.plugin.label`,description:`console.plugin.description`,settings:n({label:`console.settings.label`,icon:`lucide:terminal`,fields:{info:e.info(`console.settings.intro`),divider:e.divider(),info2:e.info(`console.settings.claude`),divider2:e.divider(),info3:e.info(`console.settings.codex`),divider3:e.divider(),info4:e.info(`console.settings.skills`)}})});export{r as default};
@@ -0,0 +1,4 @@
1
+ import{n as e,r as t}from"./fields-CV3RQg0Y.js";import{a as n}from"./shelf-Cj_pNvd-.js";import{i as r,n as i}from"./plugin-Cjr7lgQH.js";var a=n({shelf:`meter_reading`,library:`home`,label:`home.meter_reading.label`,icon:`lucide:gauge`,agent:`Utility meter readings for a date. name — reading period, e.g. "2026-05".
2
+ date — reading date. cold_water/hot_water — water meter readings (m³).
3
+ electricity — electricity meter reading (kWh). gas — gas meter reading (m³).
4
+ Stores RAW cumulative readings, not consumption (the difference is a derived calculation).`,views:{title:`date`,inline:[`date`],list:[`cold_water`,`hot_water`,`electricity`,`gas`]},fields:{date:e.date({label:`home.meter_reading.fields.date`,rules:{min:`2000-01-01`,max:`today`},ui:{span:12}}),cold_water:e.real({label:`home.meter_reading.fields.cold_water`,rules:{min:0},ui:{span:3}}),hot_water:e.real({label:`home.meter_reading.fields.hot_water`,rules:{min:0},ui:{span:3}}),electricity:e.real({label:`home.meter_reading.fields.electricity`,rules:{min:0},ui:{span:3}}),gas:e.real({label:`home.meter_reading.fields.gas`,rules:{min:0},ui:{span:3}}),notes:e.text({label:`home.meter_reading.fields.notes`,rules:{max:500}})}}),o=n({shelf:`room`,library:`home`,label:`home.room.label`,icon:`lucide:door-open`,agent:`A room/space in the apartment. name — name (Bedroom, Kitchen). area — area (m²). This is a reference list of places: a target for relations from material (where a material was used). Does not store the materials themselves.`,views:{inline:[`name`],list:[`area`]},fields:{name:e.title({label:`core.fields.name`}),description:e.text({label:`home.room.fields.description`,rules:{max:1e3}}),area:e.measured({label:`home.room.fields.area`,units:`area`,rules:{min:0}}),notes:e.text({label:`home.room.fields.notes`,rules:{max:500}})}}),s=n({shelf:`material`,library:`home`,label:`home.material.label`,icon:`lucide:paint-roller`,agent:`A material/paint used in renovation. One record = a specific product (e.g. "Dulux Easycare, RAL 9010"). name — name, type — category, brand — manufacturer, color/color_code — color and tint code. rooms — relation to home/room (where used, can be several). price/quantity/store/bought_date/link — purchase data. photo/rating/notes — photos and impressions. Does NOT store a work log/timeline — only a catalog of "what was bought and where it is used".`,views:{inline:[`name`,`color`],list:[`type`,`color`,`brand`,`rooms`]},fields:{name:e.title({label:`core.fields.name`}),description:e.text({label:`home.material.fields.description`,rules:{max:1e3}}),group:e.group({label:`home.material.group.identity`,icon:`lucide:tag`,scope:`hoist`,fields:{type:e.string({label:`core.fields.type`,strict:!0,noSearch:!0,options:[{value:`paint`,title:`home.material.options.type.paint`},{value:`primer`,title:`home.material.options.type.primer`},{value:`lacquer`,title:`home.material.options.type.lacquer`},{value:`enamel`,title:`home.material.options.type.enamel`},{value:`plaster`,title:`home.material.options.type.plaster`},{value:`tile`,title:`home.material.options.type.tile`},{value:`laminate`,title:`home.material.options.type.laminate`},{value:`wallpaper`,title:`home.material.options.type.wallpaper`},{value:`skirting`,title:`home.material.options.type.skirting`},{value:`panel`,title:`home.material.options.type.panel`},{value:`putty`,title:`home.material.options.type.putty`},{value:`glue`,title:`home.material.options.type.glue`},{value:`cement`,title:`home.material.options.type.cement`},{value:`drywall`,title:`home.material.options.type.drywall`},{value:`insulation`,title:`home.material.options.type.insulation`},{value:`fixture`,title:`home.material.options.type.fixture`},{value:`plumbing`,title:`home.material.options.type.plumbing`},{value:`other`,title:`home.material.options.type.other`}]}),brand:e.string({label:`home.material.fields.brand`,rules:{max:120}}),color:e.color({label:`home.material.fields.color`}),color_code:e.string({label:`home.material.fields.color_code`,rules:{max:60}}),rooms:e.relation({label:`home.material.fields.rooms`,options:t({library:`home`,shelf:`room`}),multiple:!0})}}),ledger:e.ledger({label:`home.material.group.purchase`,icon:`lucide:shopping-cart`,fields:{price:e.money({label:`home.material.fields.price`,rules:{min:0}}),currency:e.currency({label:`core.fields.currency`,default:`UAH`}),quantity:e.measured({label:`home.material.fields.quantity`,units:[{value:`l`,label:`core.units.l`},{value:`kg`,label:`core.units.kg`},{value:`m2`,label:`core.units.m2`},{value:`pcs`,label:`core.units.pcs`}],rules:{min:0}}),store:e.string({label:`home.material.fields.store`,rules:{max:120}}),bought_date:e.date({label:`home.material.fields.bought_date`,rules:{max:`today`}}),link:e.link({label:`home.material.fields.link`})}}),group2:e.group({label:`home.material.group.media`,icon:`lucide:image`,scope:`hoist`,fields:{photo:e.image({label:`home.material.fields.photo`,multiple:!0}),rating:e.rating({label:`home.material.fields.rating`,rules:{max:5}})}}),notes:e.text({label:`home.material.fields.notes`,rules:{max:2e3}})}}),c=i({id:`home`,version:`1.0.0`,dependsOn:[],label:`home.plugin.label`,description:`home.plugin.description`,libraries:[{meta:r({id:`home`,label:`home.library.label`,icon:`lucide:house`,agent:{description:`The home itself — renovation materials, utility meter readings, rooms.`,instructions:`meter_reading readings are cumulative; consumption over a period = difference between adjacent dates. New meter readings — create_record meter_reading (do NOT edit old ones); used up a material — update material.quantity via update_record.`},starterHint:`meter readings that are overdue, or renovation materials running low`}),shelves:[a,o,s]}]});export{c as default};
@@ -0,0 +1 @@
1
+ import{n as e,r as t}from"./fields-CV3RQg0Y.js";import{a as n}from"./shelf-Cj_pNvd-.js";import{i as r,n as i}from"./plugin-Cjr7lgQH.js";import{t as a}from"./extend-yQ8zoqGc.js";import{n as o}from"./src-DgQcfYnz.js";import{t as s}from"./settings-Bo5IOwVg.js";import{t as c}from"./src-BrHtOaqX.js";import{t as l}from"./src-tKMBP4Dv.js";var u=n({shelf:`field_demo`,library:`lab`,label:`lab.field_demo.label`,icon:`lucide:flask-conical`,views:{inline:[`name`,`select`],listKind:`map`,list:[`place`,`text_minmax`,`integer`,`boolean`,`select`,`rating_5`,`measured_currency`]},fields:{name:e.title({label:`core.fields.name`}),image:e.cover({label:`lab.field_demo.fields.image`}),avatar:e.avatar({label:`lab.field_demo.fields.avatar`}),info:e.info(`lab.field_demo.info.intro`),button:e.button({label:`lab.field_demo.fields.button_demo`,value:`lab.demoAction`,icon:`lucide:zap`,variant:`outline`}),properties:e.properties({label:`lab.field_demo.groups.properties_inspector`,icon:`lucide:sliders-horizontal`,columns:4,fields:{demo_status:e.string({label:`lab.field_demo.fields.demo_status`,ui:{span:3}}),demo_author:e.string({label:`lab.field_demo.fields.demo_author`,ui:{span:3}}),demo_prop_rating:e.rating({label:`lab.field_demo.fields.rating_5`,ui:{span:3}}),demo_prop_date:e.date({label:`lab.field_demo.fields.date`,ui:{span:3}})}}),stack:e.stack({label:`lab.field_demo.groups.vertical_stack`,icon:`lucide:layers`,fields:{stack_note_1:e.string({label:`lab.field_demo.fields.stack_note_1`}),stack_note_2:e.string({label:`lab.field_demo.fields.stack_note_2`})}}),group:e.group({label:`lab.field_demo.groups.embeds`,icon:`lucide:tv`,scope:`hoist`,fields:{embed_wide:e.embed({label:`lab.field_demo.fields.embed_wide`,multiple:!0}),embed_narrow:e.embed({label:`lab.field_demo.fields.embed_narrow`,multiple:!0})}}),group2:e.group({label:`lab.field_demo.groups.text_pattern`,icon:`lucide:type`,scope:`hoist`,fields:{text_pattern:e.string({label:`lab.field_demo.fields.text_pattern`,rules:{pattern:`^[A-Za-z]+$`,messageKey:`lab.field_demo.validation.letters_only`}})}}),group3:e.group({label:`lab.field_demo.groups.text_email`,icon:`lucide:mail`,scope:`hoist`,fields:{text_emails:e.email({label:`lab.field_demo.fields.text_emails`,multiple:!0})}}),group4:e.group({label:`lab.field_demo.groups.text_url`,icon:`lucide:link`,scope:`hoist`,fields:{text_url:e.url({label:`lab.field_demo.fields.text_url`})}}),group5:e.group({label:`lab.field_demo.groups.text_password`,icon:`lucide:key-round`,scope:`hoist`,fields:{text_password:e.password({label:`lab.field_demo.fields.text_password`})}}),group6:e.group({label:`lab.field_demo.groups.slug_link`,icon:`lucide:link-2`,scope:`hoist`,fields:{demo_slug:e.slug({label:`lab.field_demo.fields.demo_slug`}),demo_link:e.link({label:`lab.field_demo.fields.demo_link`})}}),group7:e.group({label:`lab.field_demo.groups.string_mask`,icon:`lucide:credit-card`,scope:`hoist`,fields:{demo_mask_card:e.string({label:`lab.field_demo.fields.demo_mask_card`,rules:{pattern:`^\\d{4} \\d{4} \\d{4} \\d{4}$`}})}}),group8:e.group({label:`lab.field_demo.groups.percent_year`,icon:`lucide:percent`,scope:`hoist`,fields:{demo_percent:e.percent({label:`lab.field_demo.fields.demo_percent`}),demo_year:e.year({label:`lab.field_demo.fields.demo_year`})}}),group9:e.group({label:`lab.field_demo.groups.local_paths`,icon:`lucide:folder-tree`,scope:`hoist`,fields:{demo_local_dir:e.localDir({label:`lab.field_demo.fields.demo_local_dir`}),demo_local_file:e.localFile({label:`lab.field_demo.fields.demo_local_file`})}}),group10:e.group({label:`lab.field_demo.groups.tag_i18n`,icon:`lucide:tags`,scope:`hoist`,fields:{demo_tag:e.tag({label:`lab.field_demo.fields.demo_tag`,options:[`new`,`sale`,`featured`]}),demo_i18n:e.i18n({label:`lab.field_demo.fields.demo_i18n`})}}),group11:e.group({label:`lab.field_demo.groups.source_poster`,icon:`lucide:file-code`,scope:`hoist`,fields:{demo_source:e.source({label:`lab.field_demo.fields.demo_source`}),demo_poster:e.poster({label:`lab.field_demo.fields.demo_poster`})}}),group12:e.group({label:`lab.field_demo.groups.ranges`,icon:`lucide:chevrons-left-right`,scope:`hoist`,fields:{demo_number_range:e.numberRange({label:`lab.field_demo.fields.demo_number_range`}),demo_real_range:e.realRange({label:`lab.field_demo.fields.demo_real_range`})}}),group13:e.group({label:`lab.field_demo.groups.date_month`,icon:`lucide:calendar`,scope:`hoist`,fields:{demo_month:e.date({label:`lab.field_demo.fields.demo_month`,rules:{granularity:`month`}})}}),group14:e.group({label:`lab.field_demo.groups.ratings`,icon:`lucide:star`,scope:`hoist`,fields:{rating_5:e.rating({label:`lab.field_demo.fields.rating_5`}),rating_10:e.rating({label:`lab.field_demo.fields.rating_10`,rules:{max:10}})}}),group15:e.group({label:`lab.field_demo.groups.hostname`,icon:`lucide:globe`,scope:`hoist`,fields:{demo_hostname:c.hostname({label:`lab.field_demo.fields.demo_hostname`})}}),group16:e.group({label:`lab.field_demo.groups.unit_amount`,icon:`lucide:calculator`,scope:`hoist`,fields:{demo_unit:e.unit({label:`lab.field_demo.fields.demo_unit`,options:`weight`}),demo_amount:e.amount({label:`lab.field_demo.fields.demo_amount`,unitFrom:`demo_unit`})}}),group17:e.group({label:`lab.field_demo.groups.datetimes`,icon:`lucide:calendar-clock`,scope:`hoist`,fields:{datetimes_multi:e.datetime({label:`lab.field_demo.fields.datetimes_multi`,multiple:!0})}}),group18:e.group({label:`lab.field_demo.groups.times_multi`,icon:`lucide:alarm-clock`,scope:`hoist`,fields:{times_multi:e.time({label:`lab.field_demo.fields.times_multi`,multiple:!0})}}),group18b:e.group({label:`lab.field_demo.groups.recurrence`,icon:`lucide:repeat`,scope:`hoist`,fields:{demo_recurrence:o.recurrence({label:`lab.field_demo.fields.demo_recurrence`,exdates:`demo_exdates`}),demo_exdates:e.datetime({label:`lab.field_demo.fields.demo_exdates`,multiple:!0})}}),sheet:e.sheet({label:`lab.field_demo.fields.demo_sheet`,icon:`lucide:grid-2x2`,fields:{row1:{sheet_a1:e.string({label:`lab.field_demo.fields.sheet_a1`}),sheet_b1:e.string({label:`lab.field_demo.fields.sheet_b1`})},row2:{sheet_a2:e.string({label:`lab.field_demo.fields.sheet_a2`}),sheet_b2:e.string({label:`lab.field_demo.fields.sheet_b2`})}}}),demo_table_specs:e.row({scope:`nest`,multiple:!0,label:`lab.field_demo.fields.demo_table_specs`,icon:`lucide:table`,fields:{param:e.string({label:`lab.field_demo.per_row.param`}),val:e.string({label:`lab.field_demo.per_row.val`})}}),demo_check_multi:e.check({label:`lab.field_demo.fields.demo_check_multi`,multiple:!0}),demo_check_stages:e.check({label:`lab.field_demo.fields.demo_check_stages`,slots:[`lab.field_demo.fields.stage_ordered`,`lab.field_demo.fields.stage_paid`,`lab.field_demo.fields.stage_shipped`],multiple:!0}),demo_stepper:e.stepper({label:`lab.field_demo.fields.demo_stepper`,options:[{value:`ordered`,title:`lab.field_demo.options.stage.ordered`},{value:`packed`,title:`lab.field_demo.options.stage.packed`},{value:`shipped`,title:`lab.field_demo.options.stage.shipped`},{value:`delivered`,title:`lab.field_demo.options.stage.delivered`}]}),divider:e.divider({label:`lab.field_demo.blocks.divider`}),bento:e.bento({label:`lab.field_demo.blocks.bento`,icon:`lucide:layout-grid`,fields:{number_int:{span:`2x1`,el:e.int({label:`lab.field_demo.fields.number_int`,rules:{min:0,max:100}})},color_multi:e.color({label:`lab.field_demo.fields.color_multi`,multiple:!0}),numbers_multi:e.real({label:`lab.field_demo.fields.numbers_multi`,multiple:!0}),dates_multi:{span:`2x1`,el:e.date({label:`lab.field_demo.fields.dates_multi`,multiple:!0})}}}),group19:e.group({label:`lab.field_demo.groups.split_rating`,icon:`lucide:columns-2`,fields:{split:e.split({ratio:[1,1],columns:[{rating_split_5:e.rating({label:`lab.field_demo.fields.rating_split_5`})},{rating_split_10:e.rating({label:`lab.field_demo.fields.rating_split_10`,rules:{max:10}})}]})},scope:`hoist`}),grid:e.grid({label:`lab.field_demo.blocks.grid`,icon:`lucide:clock`,columns:2,fields:{time_field:e.time({label:`lab.field_demo.fields.time_field`})}}),group20:e.group({label:`lab.field_demo.groups.spread`,icon:`lucide:newspaper`,fields:{spread:e.spread({visual:{cover:e.cover({label:`lab.field_demo.fields.cover`})},quote:{nolabel_note:e.string({ui:{noEditControl:!0}})},facts:{origin:e.country({label:`lab.field_demo.fields.origin`}),tags_field:e.tags({label:`lab.field_demo.fields.tags_field`,options:[`alpha`,`beta`,`gamma`,`delta`]})}})},scope:`hoist`}),group21:e.group({label:`lab.field_demo.groups.aside`,icon:`lucide:panel-right`,scope:`hoist`,fields:{aside:e.aside({fields:{demo_weight:e.weight({label:`lab.field_demo.fields.demo_weight`})},aside:{demo_dimensions:e.dimensions({label:`lab.field_demo.fields.demo_dimensions`})}})}}),tabs:e.tabs({tabs:[{name:`tab1`,label:`lab.field_demo.blocks.tab1`,fields:{demo_datasize:c.dataSize({label:`lab.field_demo.fields.demo_datasize`}),demo_ram:c.ram({label:`lab.field_demo.fields.demo_ram`})}},{name:`tab2`,label:`lab.field_demo.blocks.tab2`,fields:{demo_disk:c.diskSize({label:`lab.field_demo.fields.demo_disk`}),ip_addr:c.ip({label:`lab.field_demo.fields.ip_addr`})}}]}),accordion:e.accordion({sections:[{name:`section1`,label:`lab.field_demo.blocks.section1`,open:!0,fields:{demo_weekday:e.string({label:`lab.field_demo.fields.demo_weekday`,options:`weekdays`,strict:!0,noSearch:!0}),demo_weekdays:e.string({label:`lab.field_demo.fields.demo_weekdays`,options:`weekdays`,multiple:!0,strict:!0,noSearch:!0})}},{name:`section2`,label:`lab.field_demo.blocks.section2`,fields:{cidr_subnet:c.cidr({label:`lab.field_demo.fields.cidr_subnet`}),ip_addrs:c.ip({label:`lab.field_demo.fields.ip_addrs`,multiple:!0})}}]}),divider2:e.divider({label:`lab.field_demo.blocks.leaves`}),prose:e.prose({label:`lab.field_demo.blocks.prose`,icon:`lucide:file-text`,dropCap:`markdown`,fields:{markdown:e.markdown({label:`lab.field_demo.fields.markdown`,rules:{max:5e3}}),text_multiline:e.text({label:`lab.field_demo.fields.text_multiline`,rules:{max:500}})}}),plaque:e.plaque({label:`lab.field_demo.blocks.plaque`,icon:`lucide:cpu`,title:{mac:c.mac({label:`lab.field_demo.fields.mac`})},subtitle:{imei:c.imei({label:`lab.field_demo.fields.imei`})}}),ledger:e.ledger({label:`lab.field_demo.blocks.ledger`,icon:`lucide:list`,fields:{duration_short:e.duration({label:`lab.field_demo.fields.duration_short`,rules:{max:28800,step:300}}),measured_weight:e.measured({label:`lab.field_demo.fields.measured_weight`,units:`weight`})}}),stats:e.stats({label:`lab.field_demo.blocks.stats`,icon:`lucide:thermometer`,fields:{tempRange:e.realRange({label:`lab.field_demo.fields.tempRange`})}}),facets:e.facets({label:`lab.field_demo.blocks.facets`,icon:`lucide:sun-medium`,fields:{day_period:e.string({label:`lab.field_demo.fields.day_period`,options:`day-periods`,strict:!0,noSearch:!0})}}),terminal:e.terminal({label:`lab.field_demo.blocks.terminal`,icon:`lucide:terminal`,caption:`lab.field_demo.blocks.terminal_caption`,fields:{code:e.snippet({label:`lab.field_demo.fields.code`,rules:{language:`yaml`,max:5e3}})}}),callout:e.callout({label:`lab.field_demo.blocks.callout`,icon:`lucide:shield-check`,tone:`warn`,fields:{agree:e.triState({label:`lab.field_demo.fields.agree`}),boolean:e.boolean({label:`lab.field_demo.fields.boolean`})}}),compare:e.compare({label:`lab.field_demo.blocks.compare`,icon:`lucide:git-compare`,leftLabel:`lab.field_demo.blocks.compare_left`,rightLabel:`lab.field_demo.blocks.compare_right`,left:{country_multi:e.string({label:`lab.field_demo.fields.country_multi`,options:`countries`,multiple:!0,strict:!0,noSearch:!0})},right:{demo_check:e.check({label:`lab.field_demo.fields.demo_check`}),select_multi:e.string({label:`lab.field_demo.fields.select_multi`,multiple:!0,strict:!0,noSearch:!0,options:[{value:`red`,title:`lab.field_demo.options.select.red`},{value:`green`,title:`lab.field_demo.options.select.green`},{value:`blue`,title:`lab.field_demo.options.select.blue`}]})}}),group22:e.group({label:`lab.field_demo.groups.figure`,icon:`lucide:image`,fields:{figure:e.figure({image:{image_gallery:e.image({label:`lab.field_demo.fields.image_gallery`,multiple:!0})},caption:{small_text:e.smallText({label:`lab.field_demo.fields.small_text`,rules:{max:500}})}})},scope:`hoist`}),group23:e.group({label:`lab.field_demo.groups.illustrated`,icon:`lucide:image`,scope:`hoist`,fields:{illustrated_one:e.illustrated({label:`lab.field_demo.fields.illustrated_one`}),illustrated_many:e.illustrated({label:`lab.field_demo.fields.illustrated_many`,multiple:!0,fields:{text:e.markdown({}),image:e.image({})}})}}),group24:e.group({label:`lab.field_demo.groups.epigraph`,icon:`lucide:quote`,fields:{epigraph:e.epigraph({source:{textarea:e.text({label:`lab.field_demo.fields.textarea`,rules:{max:1e3},ui:{noLabel:!0}})},attribution:{compact_note:e.string({label:`lab.field_demo.fields.compact_note`,ui:{noEditControl:!0}})}})},scope:`hoist`}),group25:e.group({label:`lab.field_demo.groups.masthead`,icon:`lucide:calendar-days`,fields:{masthead:e.masthead({overline:{day_period_multi:e.string({label:`lab.field_demo.fields.day_period_multi`,options:`day-periods`,multiple:!0,strict:!0,noSearch:!0})},title:{birthYear:e.date({label:`lab.field_demo.fields.birthYear`,rules:{granularity:`year`}})}})},scope:`hoist`}),divider3:e.divider({label:`lab.field_demo.blocks.domain`}),group26:e.group({label:`lab.field_demo.groups.timeline`,icon:`lucide:history`,fields:{timeline:e.timeline({fields:{date_future:e.date({label:`lab.field_demo.fields.date_future`,rules:{min:`today`}}),demo_reminder:e.reminder({label:`lab.field_demo.fields.demo_reminder`,rules:{lead:14}})}})},scope:`hoist`}),group27:e.group({label:`lab.field_demo.groups.countdown`,icon:`lucide:timer`,fields:{countdown:e.countdown({source:{datetime:e.datetime({label:`lab.field_demo.fields.datetime`})},caption:`lab.field_demo.blocks.countdown_caption`})},scope:`hoist`}),group28:e.group({label:`lab.field_demo.groups.deck`,icon:`lucide:layers`,fields:{deck:e.deck({source:{relation_multi:e.relation({label:`lab.field_demo.fields.relation_multi`,options:t({library:`lab`,shelf:`field_demo_child`}),multiple:!0})}})},scope:`hoist`}),group29:e.group({label:`lab.field_demo.groups.people`,icon:`lucide:user`,fields:{people:e.people({source:{relation_single:e.relation({label:`lab.field_demo.fields.relation_single`,options:t({library:`lab`,shelf:`field_demo_child`})})}})},scope:`hoist`}),group30:e.group({label:`lab.field_demo.groups.identity`,icon:`lucide:contact`,fields:{identity:e.identity({name:{text_plain:e.string({label:`lab.field_demo.fields.text_plain`,rules:{max:200}})},role:{text_minmax:e.string({label:`lab.field_demo.fields.text_minmax`,rules:{min:3,max:20}})},channels:{text_tel:e.tel({label:`lab.field_demo.fields.text_tel`}),text_email:e.email({label:`lab.field_demo.fields.text_email`})}})},scope:`hoist`}),group31:e.group({label:`lab.field_demo.groups.score`,icon:`lucide:gauge`,fields:{score:e.score({source:{integer:e.int({label:`lab.field_demo.fields.integer`,rules:{min:1,max:12}})},max:12})},scope:`hoist`}),group32:e.group({label:`lab.field_demo.groups.status`,icon:`lucide:check-circle`,fields:{status:e.status({source:{select:e.string({label:`lab.field_demo.fields.select`,strict:!0,noSearch:!0,options:[{value:`red`,title:`lab.field_demo.options.select.red`},{value:`green`,title:`lab.field_demo.options.select.green`},{value:`blue`,title:`lab.field_demo.options.select.blue`}]})}})},scope:`hoist`}),group33:e.group({label:`lab.field_demo.groups.meter`,icon:`lucide:sliders-horizontal`,fields:{meter:e.meter({source:{meter_value:e.int({label:`lab.field_demo.fields.meter_value`,rules:{min:0,max:50}})},min:0,max:50})},scope:`hoist`}),group34:e.group({label:`lab.field_demo.groups.receipt`,icon:`lucide:receipt`,scope:`hoist`,fields:{receipt:e.receipt({fields:{number_decimal:e.real({label:`lab.field_demo.fields.number_decimal`,rules:{min:0,max:1e3}})},total:{price:e.money({label:`lab.field_demo.fields.price`})}}),currency:e.currency({label:`core.fields.currency`,default:`UAH`})}}),group35:e.group({label:`lab.field_demo.groups.balance`,icon:`lucide:scale`,fields:{balance:e.balance({source:{measured_currency:e.measured({label:`lab.field_demo.fields.measured_currency`,units:`currency`})},caption:`lab.field_demo.blocks.balance_caption`})},scope:`hoist`}),group36:e.group({label:`lab.field_demo.groups.route`,icon:`lucide:map-pin`,fields:{route:e.route({from:{country:e.string({label:`lab.field_demo.fields.country`,options:`countries`,strict:!0,noSearch:!0})},to:{place:e.geo({label:`lab.field_demo.fields.place`})}})},scope:`hoist`}),calendar:e.calendar({source:{calendar_dates:e.group({scope:`nest`,label:`lab.field_demo.fields.calendar_dates`,icon:`lucide:calendar`,multiple:!0,fields:{occurs_on:e.date({label:`lab.field_demo.per_row.occurs_on`})}})},date:`occurs_on`}),journal:e.journal({source:{journal_log:e.group({scope:`nest`,label:`lab.field_demo.fields.journal_log`,icon:`lucide:book-open`,multiple:!0,fields:{logged_at:e.date({label:`lab.field_demo.per_row.logged_at`}),entry:e.text({label:`lab.field_demo.per_row.entry`,rules:{max:500}})}})},date:`logged_at`,text:`entry`}),group37:e.group({label:`lab.field_demo.groups.nutrition`,icon:`lucide:flame`,scope:`hoist`,fields:{nutrition:e.nutrition({energy:{ageRange:e.numberRange({label:`lab.field_demo.fields.ageRange`,rules:{min:0,max:120}})},fields:{measured_custom:e.measured({label:`lab.field_demo.fields.measured_custom`,units:[{value:`shot`,label:`lab.field_demo.units.shot`},{value:`scoop`,label:`lab.field_demo.units.scoop`}]})}})}}),group38:e.group({label:`lab.field_demo.groups.specimen`,icon:`lucide:palette`,fields:{specimen:e.specimen({title:{color_name:e.string({label:`lab.field_demo.fields.color_name`,options:`colors`,strict:!0,noSearch:!0})},subtitle:{color_hex:e.color({label:`lab.field_demo.fields.color_hex`})}})},scope:`hoist`}),manifest:e.manifest({source:{row_ingredients:e.group({scope:`nest`,label:`lab.field_demo.fields.row_ingredients`,icon:`lucide:carrot`,multiple:!0,rules:{unique:[`product`]},fields:{product:e.relation({label:`lab.field_demo.per_row.product`,options:t({library:`kitchen`,shelf:`food_item`})}),amount:e.real({label:`lab.field_demo.per_row.amount`,rules:{min:0}}),stock:e.measured({label:`lab.field_demo.per_row.stock`,units:`cooking`,cache:0,value:async e=>(await e.ref?.(`product`))?.quantity??null})}})},quantity:`amount`,item:`product`}),table:e.table({label:`lab.field_demo.fields.demo_table`,source:{demo_table_rows:e.row({scope:`nest`,label:`lab.field_demo.fields.demo_table`,multiple:!0,fields:{part:e.string({label:`lab.field_demo.table.part`}),vendor:e.string({label:`lab.field_demo.table.vendor`}),qty:e.int({label:`lab.field_demo.table.qty`})}})},sort:`qty`,dir:`desc`,groupBy:`vendor`,totals:{qty:`sum`},numbered:!0}),group39:e.group({label:`lab.field_demo.groups.idcard`,icon:`lucide:credit-card`,fields:{idcard:e.idcard({number:{iban:l.iban({label:`lab.field_demo.fields.iban`})},meta:{date:e.date({label:`lab.field_demo.fields.date`})}})},scope:`hoist`}),divider4:e.divider({label:`lab.field_demo.blocks.computed`}),chart:e.chart({source:{chart_readings:e.group({scope:`nest`,label:`lab.field_demo.fields.chart_readings`,icon:`lucide:trending-up`,multiple:!0,fields:{measured_on:e.date({label:`lab.field_demo.per_row.measured_on`}),reading:e.real({label:`lab.field_demo.per_row.reading`})}})},value:`reading`,date:`measured_on`,delta:!0}),heatmap:e.heatmap({source:{heatmap_sessions:e.group({scope:`nest`,label:`lab.field_demo.fields.heatmap_sessions`,icon:`lucide:calendar-check`,multiple:!0,fields:{happened_on:e.date({label:`lab.field_demo.per_row.happened_on`})}})},date:`happened_on`}),divider5:e.divider(),group40:e.group({label:`lab.field_demo.groups.periods`,icon:`lucide:calendar-range`,scope:`hoist`,fields:{periods:e.period({label:`lab.field_demo.fields.periods`,multiple:!0})}}),group41:e.group({label:`lab.field_demo.groups.json`,icon:`lucide:code-2`,scope:`hoist`,fields:{json:e.json({label:`lab.field_demo.fields.json`,ui:{emphasis:`muted`}})}}),row_single:e.group({scope:`nest`,label:`lab.field_demo.fields.row_single`,icon:`lucide:rows-3`,fields:{env:e.string({label:`lab.field_demo.per_row.env`,strict:!0,noSearch:!0,options:[{value:`dev`,title:`lab.field_demo.options.env.dev`},{value:`prod`,title:`lab.field_demo.options.env.prod`}]}),url:e.url({label:`lab.field_demo.per_row.url`}),token:e.password({label:`lab.field_demo.per_row.token`})}}),variants:e.keyed({label:`lab.field_demo.fields.variants`,icon:`lucide:languages`,fields:{lang:e.string({label:`lab.field_demo.per_row.lang`,options:`languages`,strict:!0,noSearch:!0}),name:e.string({label:`lab.field_demo.per_row.name`}),surname:e.string({label:`lab.field_demo.per_row.surname`})},by:`lang`}),perkey_fixed:e.keyed({label:`lab.field_demo.fields.perkey_fixed`,icon:`lucide:key`,fixed:!0,fields:{size:e.string({label:`lab.field_demo.per_row.size`,strict:!0,noSearch:!0,options:[{value:`s`,title:`lab.field_demo.options.size.s`},{value:`m`,title:`lab.field_demo.options.size.m`},{value:`l`,title:`lab.field_demo.options.size.l`}]}),qty:e.int({label:`lab.field_demo.per_row.qty`,rules:{min:0}})},by:`size`}),coll_text:e.group({scope:`nest`,label:`lab.field_demo.fields.coll_text`,icon:`lucide:type`,multiple:!0,fields:{person:e.relation({label:`lab.field_demo.fields.pp_person`,options:t({library:`people`,shelf:`person`})}),value:e.string({label:`lab.field_demo.fields.pp_value`})}}),coll_integer:e.group({scope:`nest`,label:`lab.field_demo.fields.coll_integer`,icon:`lucide:hash`,multiple:!0,fields:{person:e.relation({label:`lab.field_demo.fields.pp_person`,options:t({library:`people`,shelf:`person`})}),value:e.int({label:`lab.field_demo.fields.pp_value`})}}),coll_select:e.group({scope:`nest`,label:`lab.field_demo.fields.coll_select`,icon:`lucide:list-checks`,multiple:!0,fields:{person:e.relation({label:`lab.field_demo.fields.pp_person`,options:t({library:`people`,shelf:`person`})}),value:e.string({label:`lab.field_demo.fields.pp_value`,strict:!0,noSearch:!0,options:[{value:`s`,title:`lab.field_demo.options.pp_select.s`},{value:`m`,title:`lab.field_demo.options.pp_select.m`},{value:`l`,title:`lab.field_demo.options.pp_select.l`}]})}}),group42:e.group({label:`lab.field_demo.groups.per_weekday`,icon:`lucide:calendar-days`,scope:`hoist`,fields:{per_weekday:e.perWeekday({label:`lab.field_demo.fields.per_weekday`,rules:{min:0,max:5,step:.5}})}}),per_weekday_per_person:e.group({scope:`nest`,label:`lab.field_demo.fields.per_weekday_per_person`,icon:`lucide:users`,multiple:!0,fields:{person:e.relation({label:`lab.field_demo.fields.pp_person`,options:t({library:`people`,shelf:`person`})}),value:e.perWeekday({label:`lab.field_demo.fields.pp_value`,rules:{min:0,max:10,step:1}})}}),group43:e.group({label:`lab.field_demo.groups.media_carousel`,icon:`lucide:images`,scope:`hoist`,fields:{avatar_row:e.avatar({label:`lab.field_demo.fields.avatar_row`,multiple:!0}),cover_carousel:e.cover({label:`lab.field_demo.fields.cover_carousel`,multiple:!0})}}),group44:e.group({label:`lab.field_demo.groups.files`,icon:`lucide:paperclip`,scope:`hoist`,fields:{attachment:e.file({label:`lab.field_demo.fields.attachment`}),doc:e.document({label:`lab.field_demo.fields.doc`}),voice:e.audio({label:`lab.field_demo.fields.voice`}),clip:e.video({label:`lab.field_demo.fields.clip`}),gallery:e.media({label:`lab.field_demo.fields.gallery`,multiple:!0}),attachment_one:e.attachment({label:`lab.field_demo.fields.attachment_one`}),attachment_many:e.attachment({label:`lab.field_demo.fields.attachment_many`,multiple:!0,fields:{file:e.document({})}})}}),group45:e.group({label:`lab.field_demo.groups.key_value`,icon:`lucide:key-round`,scope:`hoist`,fields:{key_value:e.keyValue({label:`lab.field_demo.fields.key_value`,multiple:!0}),key_value_secret:e.keyValue({label:`lab.field_demo.fields.key_value_secret`,fields:{value:e.password({label:``})}})}}),services_bylist:e.group({scope:`nest`,label:`lab.field_demo.fields.services_bylist`,icon:`lucide:server`,multiple:!0,fields:{type:e.string({label:`devices.service.type`,options:`service-types`,strict:!0,noSearch:!0}),url:e.url({label:`devices.service.url`}),login:e.string({label:`devices.service.login`}),password:e.password({label:`devices.service.password`,ui:{emphasis:`muted`}}),token:e.password({label:`devices.service.token`})}}),group47:e.group({label:`lab.field_demo.groups.catalogue_gap`,icon:`lucide:scan-line`,scope:`hoist`,fields:{identifier:e.identifier({label:`lab.field_demo.fields.identifier`,rules:{max:50},ui:{span:4}}),colorname:e.colorname({label:`lab.field_demo.fields.colorname`,ui:{span:4}}),age:e.age({label:`lab.field_demo.fields.age`,rules:{min:`1900-01-01`,max:`today`},ui:{span:4}}),path:e.path({label:`lab.field_demo.fields.path`,rules:{max:120},ui:{span:6}}),mrz:e.mrz({label:`lab.field_demo.fields.mrz`,rules:{max:200},ui:{span:6}}),timetable:e.timetable({label:`lab.field_demo.fields.timetable`,ui:{span:12}})}}),assay:e.assay({label:`lab.field_demo.groups.assay`,icon:`lucide:activity`,analyte:`analyte`,value:`value`,unit:`unit`,low:`low`,high:`high`,source:{readings:e.group({scope:`nest`,multiple:!0,fields:{analyte:e.string({label:`lab.field_demo.fields.analyte`,rules:{max:100}}),value:e.real({label:`lab.field_demo.fields.value`}),unit:e.string({label:`lab.field_demo.fields.unit`,rules:{max:20}}),low:e.real({label:`lab.field_demo.fields.low`}),high:e.real({label:`lab.field_demo.fields.high`})}})}}),flow:e.flow({amount:{flow_amount:e.money({label:`lab.field_demo.fields.flow_amount`})},from:{flow_from:e.relation({label:`lab.field_demo.fields.flow_from`,options:t({library:`lab`,shelf:`field_demo_child`})})},to:{flow_to:e.relation({label:`lab.field_demo.fields.flow_to`,options:t({library:`lab`,shelf:`field_demo_child`})})}}),children:e.backrefs({label:`lab.field_demo.fields.children`,from:{library:`lab`,shelf:`field_demo_child`,field:`demo_id`}}),group46:e.group({label:`lab.field_demo.groups.classifier`,icon:`lucide:toggle-right`,scope:`hoist`,fields:{type:e.string({label:`lab.field_demo.fields.type`,strict:!0,noSearch:!0,options:[{value:`basic`,title:`lab.field_demo.options.type.basic`},{value:`advanced`,title:`lab.field_demo.options.type.advanced`}]})}})}}),d=n({shelf:`field_demo_child`,library:`lab`,label:`lab.field_demo_child.label`,icon:`lucide:link`,standalone:!1,fields:{name:e.title({label:`core.fields.name`}),demo_id:e.relation({label:`lab.field_demo_child.fields.demo_id`,options:t({library:`lab`,shelf:`field_demo`})}),notes:e.text({label:`lab.field_demo_child.fields.notes`,rules:{max:500}})}}),f=a({id:`demo_extra`,label:`lab.demo_extra.label`,icon:`lucide:plus`,attachTo:[{library:`lab`,shelf:`field_demo`}],showWhen:{type:`advanced`},fields:{extra_text:e.string({label:`lab.demo_extra.fields.extra_text`,rules:{max:200}}),extra_number:e.int({label:`lab.demo_extra.fields.extra_number`,rules:{min:0}}),extra_flag:e.boolean({label:`lab.demo_extra.fields.extra_flag`})}}),p=i({id:`lab`,version:`1.0.0`,dependsOn:[`people`,`kitchen`,`devices`,`finance`,`geo`,`calendar`],label:`lab.plugin.label`,description:`lab.plugin.description`,settings:s({label:`lab.settings.label`,icon:`lucide:flask-conical`,fields:{info:e.info(`lab.settings.intro`),greeting:e.string({label:`lab.settings.fields.greeting`,rules:{max:80}}),enabled:e.boolean({label:`lab.settings.fields.enabled`}),mode:e.string({label:`lab.settings.fields.mode`,strict:!0,noSearch:!0,options:[{value:`fast`,title:`lab.settings.modes.fast`},{value:`safe`,title:`lab.settings.modes.safe`},{value:`debug`,title:`lab.settings.modes.debug`}]}),retries:e.int({label:`lab.settings.fields.retries`,rules:{min:0,max:10}}),divider:e.divider(),info2:e.info(`lab.settings.actions_info`),button:e.button({label:`lab.settings.run_button`,value:`lab.demoAction`,icon:`lucide:play`}),button2:e.button({label:`lab.settings.fail_button`,value:`lab.demoFail`,icon:`lucide:bug`,variant:`destructive`}),button3:e.button({label:`lab.settings.variants.default`,value:`lab.demoAction`,icon:`lucide:check`,variant:`default`}),button4:e.button({label:`lab.settings.variants.secondary`,value:`lab.demoAction`,icon:`lucide:settings`,variant:`secondary`}),button5:e.button({label:`lab.settings.variants.ghost`,value:`lab.demoAction`,icon:`lucide:ghost`,variant:`ghost`}),button6:e.button({label:`lab.settings.variants.link`,value:`lab.demoAction`,icon:`lucide:link`,variant:`link`})}}),libraries:[{meta:r({id:`lab`,label:`lab.library.label`,icon:`lucide:flask-conical`,agent:`Developer demo of field types — not real household data; ignore unless explicitly asked.`}),shelves:[u,d]}],extends_:[f]});export{p as default};
@@ -0,0 +1 @@
1
+ import{n as e,r as t,t as n}from"./src-tKMBP4Dv.js";export{e as default,n as fin,t as iban};
@@ -0,0 +1 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{n as t}from"./plugin-Cjr7lgQH.js";import{t as n}from"./settings-Bo5IOwVg.js";var r=1800,i=32e3,a=64e3,o={tools:!0,reasoning:!0},s={tools:!0,reasoning:!1};function c(e){return{labelKey:`claude-agent.models.${e}.label`,titleKey:`claude-agent.models.${e}.title`,hintKey:`claude-agent.models.${e}.hint`}}var l=[{value:`haiku`,id:`claude-haiku-4-5`,effort:``,quality:1,time:1,maxOutput:a,...c(`haiku`),capabilities:s},{value:`sonnet-medium`,id:`claude-sonnet-5`,effort:`medium`,quality:2,time:2,maxOutput:i,...c(`sonnet-medium`),capabilities:o},{value:`sonnet-high`,id:`claude-sonnet-5`,effort:`high`,quality:3,time:3,maxOutput:i,...c(`sonnet-high`),capabilities:o},{value:`opus-medium`,id:`claude-opus-5`,effort:`medium`,quality:4,time:4,maxOutput:i,...c(`opus-medium`),capabilities:o},{value:`opus-high`,id:`claude-opus-5`,effort:`high`,quality:5,time:5,maxOutput:i,...c(`opus-high`),capabilities:o}],u=t({id:`claude-agent`,version:`1.0.0`,dependsOn:[],label:`claude-agent.plugin.label`,description:`claude-agent.plugin.description`,fieldContribs:[{library:`_settings`,shelf:`system`,field:`agent_id`,options:[{value:`claude-agent`,title:`claude-agent.plugin.label`}]}],settings:n({label:`claude-agent.settings.label`,fields:{group:e.group({label:`claude-agent.settings.groups.runtime`,icon:`lucide:bot`,scope:`hoist`,fields:{auth_mode:e.string({label:`claude-agent.settings.auth_mode`,default:`subscription`,strict:!0,noSearch:!0,options:[{value:`subscription`,title:`claude-agent.settings.auth_mode_subscription`},{value:`api_key`,title:`claude-agent.settings.auth_mode_api_key`}]}),anthropic_api_key:e.password({label:`claude-agent.settings.anthropic_api_key`,ui:{hidden:{auth_mode:{$ne:`api_key`}}}}),claude_model:e.string({label:`claude-agent.settings.claude_model`,default:`haiku`,strict:!0,noSearch:!0,options:l.map(e=>({value:e.value,title:e.labelKey}))}),thinking_enabled:e.boolean({label:`claude-agent.settings.thinking_enabled`,default:!1}),skip_permissions:e.boolean({label:`claude-agent.settings.skip_permissions`,default:!0}),response_timeout:e.int({label:`claude-agent.settings.response_timeout`,default:r})}}),group2:e.group({label:`claude-agent.settings.groups.rag`,icon:`lucide:search`,scope:`hoist`,fields:{rag_enabled:e.boolean({label:`claude-agent.settings.rag_enabled`,default:!0}),openai_api_key:e.password({label:`claude-agent.settings.openai_api_key`})}}),group3:e.group({label:`claude-agent.settings.groups.langfuse`,icon:`lucide:activity`,scope:`hoist`,fields:{tracing_enabled:e.boolean({label:`claude-agent.settings.tracing_enabled`}),langfuse_base_url:e.string({label:`claude-agent.settings.langfuse_base_url`}),langfuse_public_key:e.password({label:`claude-agent.settings.langfuse_public_key`}),langfuse_secret_key:e.password({label:`claude-agent.settings.langfuse_secret_key`})}})}})});export{u as default};
@@ -0,0 +1 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{a as t}from"./shelf-Cj_pNvd-.js";import{i as n,n as r}from"./plugin-Cjr7lgQH.js";var i=t({shelf:`person`,library:`people`,label:`people.person.label`,icon:`lucide:user`,agent:`A person card. fullName — the full name (first + last), used as the title.`,views:{inline:[`logo`,`fullName`],list:[`birthDate`],select:{icon:`logo`,title:`fullName`,subtitle:`birthDate`}},fields:{identity:e.identity({avatar:{logo:e.avatar({label:`people.person.fields.logo`})},name:{fullName:e.title({label:`people.person.fields.fullName`})}}),bio:e.prose({fields:{description:e.text({label:`people.person.fields.description`,rules:{max:500}})}}),hairline:e.divider(),properties:e.properties({columns:4,fields:{occupation:e.string({label:`people.person.fields.occupation`,rules:{max:200},ui:{span:3}}),birthDate:e.age({label:`people.person.fields.birthDate`,rules:{min:`1900-01-01`,max:`today`},ui:{span:3}}),sex:e.string({label:`people.person.fields.sex`,strict:!0,noSearch:!0,options:`sex`,ui:{span:3}}),phone:e.tel({label:`people.person.fields.phone`,ui:{span:3}}),email:e.email({label:`people.person.fields.email`,ui:{span:6}}),address:e.text({label:`people.person.fields.address`,rules:{max:300},ui:{span:6}})}}),photos:e.image({label:`people.person.fields.photos`,multiple:!0}),tags:e.tags({label:`people.person.fields.tags`}),notes:e.text({label:`people.person.fields.notes`,rules:{max:1e3}})}}),a=r({id:`people`,version:`1.0.0`,dependsOn:[],label:`people.plugin.label`,description:`people.plugin.description`,libraries:[{meta:n({id:`people`,label:`people.library.label`,icon:`lucide:users`,agent:{description:`People (person) — contacts, birthdays, jobs; referenced by health, travel, and others.`,instructions:`Count birthdays by birthDate. When contacts/address/job change — update the relevant fields via update_record.`}}),shelves:[i]}]});export{a as default};
@@ -0,0 +1 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{n as t}from"./plugin-Cjr7lgQH.js";import{t as n}from"./settings-Bo5IOwVg.js";var r=t({id:`webchat`,version:`1.0.0`,dependsOn:[],label:`webchat.plugin.label`,description:`webchat.plugin.description`,settings:n({label:`webchat.settings.label`,fields:{reasoning_display:e.string({label:`webchat.settings.reasoning_display`,default:`live`,strict:!0,noSearch:!0,options:[{value:`live`,title:`webchat.settings.reasoning_display_live`},{value:`off`,title:`webchat.settings.reasoning_display_off`}]})}})});export{r as default};
@@ -0,0 +1 @@
1
+ import{B as e,D as t,F as n,I as r,L as i,N as a,O as o,P as s,R as c,T as l,j as u,k as d,n as f,r as p,w as m,z as h}from"./fields-CV3RQg0Y.js";import{a as g}from"./shelf-Cj_pNvd-.js";import{i as _,n as v}from"./plugin-Cjr7lgQH.js";import{t as y}from"./extend-yQ8zoqGc.js";import{t as b}from"./settings-Bo5IOwVg.js";import{i as x,r as S,s as C}from"./data-size-BMG0D59K.js";import{t as w}from"./showcase-BeBnutzT.js";var T=(t,n)=>e().superRefine((e,r)=>{t.safeParse(o(e)).success||r.addIssue({code:a.custom,message:u(n)})}),E=()=>r().int().min(0).max(255),D=()=>r().int().min(0).max(65535),O=h([E(),E(),E(),E()]),k=h([D(),D(),D(),D(),D(),D(),D(),D()]),A=i({v:n(4),a:O}),j=i({v:n(6),a:k}),M=s(`v`,[A,j]);function N(e){let n=m(e),r=T(M,`ip_structure`);return t(void 0,n,l({kind:`ip`,label:n.label??``,prim:`ip`,column:`text`,hints:{},zod:d(r)},n.multiple??!1))}var P=/^([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}$/;function F(e){let n=m(e),r=c().regex(P,{message:u(`pattern`,{messageKey:`core.presets.mac`})});return t(void 0,n,l({kind:`text`,label:n.label??``,prim:`text`,column:`text`,hints:{mask:`macAddress`,voice:`data`},zod:d(r)},n.multiple??!1))}var I=/^[A-Za-z0-9_]([A-Za-z0-9_-]{0,61}[A-Za-z0-9_])?(\.[A-Za-z0-9_]([A-Za-z0-9_-]{0,61}[A-Za-z0-9_])?)*$/;function L(e){let n=m(e),r=c().regex(I,{message:u(`pattern`,{messageKey:`core.presets.hostname`})});return t(void 0,n,l({kind:`text`,label:n.label??``,prim:`text`,column:`text`,hints:{voice:`data`},zod:d(r)},n.multiple??!1))}var R=/^\d{15}$/;function z(e){let t=0,n=!1;for(let r=e.length-1;r>=0;r--){let i=e.charCodeAt(r)-48;n&&(i*=2,i>9&&(i-=9)),t+=i,n=!n}return t%10==0}function B(e){let n=m(e),r=c().regex(R,{message:u(`pattern`,{messageKey:`core.presets.imei`})}).refine(z,{message:u(`pattern`,{messageKey:`core.presets.imei`})});return t(void 0,n,l({kind:`text`,label:n.label??``,prim:`text`,column:`text`,hints:{voice:`data`},zod:d(r)},n.multiple??!1))}var V=s(`v`,[A.extend({p:r().int().min(0).max(32)}),j.extend({p:r().int().min(0).max(128)})]);function H(e){let n=m(e),r=T(V,`cidr_structure`);return t(void 0,n,l({kind:`cidr`,label:n.label??``,prim:`cidr`,column:`text`,hints:{},zod:d(r)},n.multiple??!1))}var U=g({shelf:`network`,library:`devices`,label:`devices.network.label`,icon:`lucide:globe`,agent:`A network segment. subnet — CIDR. gateway — the gateway. domain — the segment's DNS suffix (e.g. lan → host FQDN = hostname.lan).`,views:{list:[`subnet`,`gateway`,`dnsPrimary`]},fields:{name:f.title({label:`core.fields.name`}),description:f.text({label:`devices.network.fields.description`,rules:{max:1e3}}),facets:f.facets({fields:{vlan:f.int({label:`devices.network.fields.vlan`,rules:{min:1,max:4094}}),domain:L({label:`devices.network.fields.domain`})}}),ledger:f.ledger({fields:{subnet:H({label:`devices.network.fields.subnet`}),gateway:N({label:`devices.network.fields.gateway`}),dnsPrimary:N({label:`devices.network.fields.dnsPrimary`}),dnsFallback:N({label:`devices.network.fields.dnsFallback`}),poolStart:N({label:`devices.network.fields.poolStart`}),poolEnd:N({label:`devices.network.fields.poolEnd`})}}),notes:f.text({label:`devices.network.fields.notes`,rules:{max:2e3}})}}),W=[`access`,`infra`,`monitoring`,`database`,`automation`,`network`,`media`,`lighting`,`files`,`backup`,`downloads`,`finance`,`calendars`,`communication`,`web`,`ai`,`devices`,`other`].map(e=>({value:e,title:`devices.service.cat.${e}`})),G=[{value:`http`,title:`devices.accessTypes.http`},{value:`https`,title:`devices.accessTypes.https`},{value:`ssh`,title:`devices.accessTypes.ssh`},{value:`mysql`,title:`devices.accessTypes.mysql`},{value:`mqtt`,title:`devices.accessTypes.mqtt`},{value:`ws`,title:`devices.accessTypes.ws`},{value:`dns`,title:`devices.accessTypes.dns`},{value:`other`,title:`devices.accessTypes.other`}],K={http:`http`,https:`https`,ssh:`ssh`,mysql:`mysql`,mqtt:`mqtt`,ws:`ws`,wss:`ws`,dns:`dns`},q=g({shelf:`service`,library:`devices`,label:`devices.service_catalog.label`,icon:`lucide:layers`,agent:`Catalog of network service types. name — human-readable name (custom, not translated). code — slug (auto-link key from the scanner). category — tag slugs (multi; SERVICE_CATEGORIES as hints). description_mode — description source: 'key' (i18n key in the description field) or 'own' (free text in the description_text field). SERVICE_META defaults → 'key' + devices.service.desc.<code>; user records are usually 'own'.`,views:{list:[`code`,`category`]},fields:{name:f.title({label:`core.fields.name`}),description_mode:f.string({label:`devices.service.description_mode`,options:[{value:`key`,title:`devices.service.description_mode_key`},{value:`own`,title:`devices.service.description_mode_own`}],default:`key`,strict:!0,noSearch:!0}),description:f.i18n({label:`devices.service.description`,rules:{max:1e3},ui:{hidden:{description_mode:{$ne:`key`}}}}),description_text:f.text({label:`devices.service.description`,rules:{max:1e3},ui:{hidden:{description_mode:{$ne:`own`}}}}),code:f.string({label:`devices.service.code`,rules:{max:60}}),category:f.string({label:`devices.service.category`,options:[...W],multiple:!0,strict:!0,noSearch:!0})}}),J=(e,t)=>{let n=e?.[t];return typeof n==`number`&&Number.isFinite(n)&&n>=0?n:null},Y=({parent:e})=>{let t=J(e,`used`),n=J(e,`free`);return t==null||n==null||t+n===0?null:Math.round(t/(t+n)*1e3)/10},X=80,Z=95,Q=y({id:`device_info`,label:`devices.device_info.label`,icon:`lucide:monitor`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`device`},agent:{description:`Network and technical specs of a device. hostname — FQDN on the LAN. addresses[] — network addresses (ip/mac, multi-NIC). group — human-friendly. services[] — inline services (type/title/links[]/secrets[]). disks_usage[] — disk usage (SSH).`,instructions:`Find a host via list_records things/item with filters: { type: "device" } — network fields live under _extends.device_info on each returned record. When the software/address/location changes — update via update_record.`},fields:{facets:f.facets({fields:{group:f.string({label:`devices.device_info.fields.group`,options:`device-groups`,strict:!0,noSearch:!0}),arch:f.string({label:`devices.device_info.fields.arch`,rules:{max:30}})}}),ledger:f.ledger({fields:{hostname:f.string({label:`devices.device_info.fields.hostname`,rules:{max:120}}),vendor:f.string({label:`devices.device_info.fields.vendor`,rules:{max:80}}),model:f.string({label:`devices.device_info.fields.model`,rules:{max:120}}),os:f.string({label:`devices.device_info.fields.os`,rules:{max:100}}),kernel:f.string({label:`devices.device_info.fields.kernel`,rules:{max:100}}),cpu:f.string({label:`devices.device_info.fields.cpu`,rules:{max:150}}),gpu:f.string({label:`devices.device_info.fields.gpu`,rules:{max:150}}),ram:C({label:`devices.device_info.fields.ram`})}}),addresses:f.row({scope:`nest`,multiple:!0,label:`devices.device_info.fields.addresses`,icon:`lucide:network`,fields:{ip:N({label:`devices.device_info.fields.ip`}),mac:F({label:`devices.device_info.fields.mac`})}}),disks_usage:f.group({scope:`nest`,label:`devices.device_info.fields.disks_usage`,icon:`lucide:hard-drive`,multiple:!0,fields:{mount:f.string({label:`devices.device_info.disk.mount`,rules:{max:255}}),size:S({label:`devices.device_info.disk.size`,system:`binary`,unit:`GiB`}),used:S({label:`devices.device_info.disk.used`,system:`binary`,unit:`GiB`,mutate:[`.usage`]}),free:S({label:`devices.device_info.disk.free`,system:`binary`,unit:`GiB`,mutate:[`.usage`]}),usage:f.real({label:`devices.device_info.disk.usage`,rules:{min:0,max:100},value:Y,mutate:[`.state`]}),state:f.string({label:`devices.device_info.disk.state`,options:[{value:`ok`,title:`devices.device_info.disk_state.ok`,icon:{kind:`icon`,value:`lucide:check`}},{value:`warn`,title:`devices.device_info.disk_state.warn`,icon:{kind:`icon`,value:`lucide:minus`}},{value:`full`,title:`devices.device_info.disk_state.full`,icon:{kind:`icon`,value:`lucide:x`}}],value:e=>{let t=Y(e);return typeof t==`number`?t>=Z?`full`:t>=X?`warn`:`ok`:null},strict:!0,noSearch:!0})}}),services:f.keyed({label:`devices.device_info.fields.services`,icon:`lucide:server`,fields:{service:f.relation({label:`devices.service.type`,options:p({library:`devices`,shelf:`service`})}),description:f.smallText({label:`devices.service.description`,rules:{max:500}}),hide:f.boolean({label:`devices.service.hide`}),links:f.row({scope:`nest`,multiple:!0,label:`devices.service.links`,icon:`lucide:link`,fields:{url:f.url({label:`devices.service.url`}),access:f.string({label:`devices.service.access`,options:`access-types`,strict:!0,noSearch:!0}),visibility:f.string({label:`devices.service.visibility`,options:`visibility-types`,strict:!0,noSearch:!0})}}),secrets:f.keyValue({label:`devices.service.secrets`,fields:{value:f.password({})},multiple:!0,ui:{keyLabel:`devices.service.secretName`,valueLabel:`devices.service.secretValue`}})},by:`service`})}}),$={ssh_config_path:`~/.ssh/config`,pihole_conf_path:``,syncthing_ini_path:`~/.config/syncthingtray.ini`,gtk_bookmarks_path:`~/.config/gtk-3.0/bookmarks`,kodi_sources_path:`~/.local/share/kodi/userdata/sources.xml`,krdc_bookmarks_path:`~/.local/share/krdc/bookmarks.xml`,rclone_config_path:`~/.config/rclone/rclone.conf`,remmina_dir:`~/.local/share/remmina`,remoteview_dir:`~/.local/share/remoteview`,delfin_config_path:`~/.config/delfin/config.toml`},ee=`docker compose exec pihole pihole reloaddns`,te={ip:N,cidr:H,mac:F,hostname:L,imei:B,dataSize:S,ram:C,diskSize:x},ne=v({id:`devices`,version:`1.0.0`,dependsOn:[`things`],label:`devices.plugin.label`,description:`devices.plugin.description`,settings:b({label:`devices.settings.label`,icon:`lucide:radar`,fields:{info:f.info(`devices.settings.scan_info`),button:f.button({label:`devices.settings.scan_button`,value:`devices.runScan`,icon:`lucide:radar`}),info2:f.info(`devices.settings.secrets_help`),info3:f.info(`devices.settings.sync_targets_info`),ssh_config_path:f.localFile({label:`devices.settings.ssh_config_path`,default:$.ssh_config_path}),pihole_conf_path:f.localFile({label:`devices.settings.pihole_conf_path`,default:$.pihole_conf_path}),pihole_reload_cmd:f.string({label:`devices.settings.pihole_reload_cmd`,default:ee}),syncthing_ini_path:f.localFile({label:`devices.settings.syncthing_ini_path`,default:$.syncthing_ini_path}),gtk_bookmarks_path:f.localFile({label:`devices.settings.gtk_bookmarks_path`,default:$.gtk_bookmarks_path}),kodi_sources_path:f.localFile({label:`devices.settings.kodi_sources_path`,default:$.kodi_sources_path}),krdc_bookmarks_path:f.localFile({label:`devices.settings.krdc_bookmarks_path`,default:$.krdc_bookmarks_path}),rclone_config_path:f.localFile({label:`devices.settings.rclone_config_path`,default:$.rclone_config_path}),remmina_dir:f.localDir({label:`devices.settings.remmina_dir`,default:$.remmina_dir}),remoteview_dir:f.localDir({label:`devices.settings.remoteview_dir`,default:$.remoteview_dir}),delfin_config_path:f.localFile({label:`devices.settings.delfin_config_path`,default:$.delfin_config_path})}}),libraries:[{meta:_({id:`devices`,label:`devices.library.label`,icon:`lucide:globe`,agent:`Network subnets and the service catalog (network, service).`}),shelves:[U,q]},{meta:_({id:`hardware`,label:`devices.hardware.label`,icon:`lucide:monitor`,agent:`All owned devices (a view over things/item where type=device). No shelves of its own.`}),shelves:[]}],extends_:[Q],showcases:[w({id:`fleet`,library:`devices`,label:`devices.fleet.label`,icon:`lucide:server`,source:{library:`things`,shelf:`item`},filter:{type:`device`,tags:{$contains:`network`}},columns:[`subtype`,`brand`,`model`,`location`,`condition`],createDefaults:{type:`device`}}),w({id:`all`,library:`hardware`,label:`devices.all.label`,icon:`lucide:monitor`,source:{library:`things`,shelf:`item`},filter:{type:`device`},columns:[`subtype`,`brand`,`model`,`location`,`condition`],createDefaults:{type:`device`}})],fieldContribs:[{library:`things`,shelf:`item`,field:`type`,options:[{value:`device`,title:`devices.device_info.label`}]},{library:`things`,shelf:`item`,field:`subtype`,options:[{value:`pc`,title:`devices.deviceGroups.pc`,when:{type:`device`}},{value:`server`,title:`devices.deviceGroups.server`,when:{type:`device`}},{value:`mobile`,title:`devices.deviceGroups.mobile`,when:{type:`device`}},{value:`tv`,title:`devices.deviceGroups.tv`,when:{type:`device`}},{value:`printer`,title:`devices.deviceGroups.printer`,when:{type:`device`}},{value:`iot`,title:`devices.deviceGroups.iot`,when:{type:`device`}},{value:`network`,title:`devices.deviceGroups.network`,when:{type:`device`}},{value:`other`,title:`devices.deviceGroups.other`,when:{type:`device`}}]}],optionLists:[{name:`access-types`,options:[...G]},{name:`visibility-types`,options:[{value:`lan`,title:`devices.visibilityTypes.lan`},{value:`public`,title:`devices.visibilityTypes.public`},{value:`other`,title:`devices.visibilityTypes.other`}]},{name:`device-groups`,options:[{value:`pc`,title:`devices.deviceGroups.pc`},{value:`server`,title:`devices.deviceGroups.server`},{value:`mobile`,title:`devices.deviceGroups.mobile`},{value:`tv`,title:`devices.deviceGroups.tv`},{value:`printer`,title:`devices.deviceGroups.printer`},{value:`iot`,title:`devices.deviceGroups.iot`},{value:`network`,title:`devices.deviceGroups.network`},{value:`other`,title:`devices.deviceGroups.other`}]}]});export{L as a,F as c,H as i,ne as n,B as o,K as r,N as s,te as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./plugin-Cjr7lgQH.js";var t=e({id:`geo`,version:`1.0.0`,dependsOn:[],label:`geo.plugin.label`,description:`geo.plugin.description`});export{t as default};
@@ -0,0 +1,2 @@
1
+ import{n as e,r as t}from"./fields-CV3RQg0Y.js";import{a as n}from"./shelf-Cj_pNvd-.js";import{i as r,n as i}from"./plugin-Cjr7lgQH.js";import{t as a}from"./extend-yQ8zoqGc.js";var o=n({shelf:`personal_document`,library:`documents`,label:`documents.personal_document.label`,icon:`lucide:id-card`,views:{list:[`owner`,`type`,`surname`,`expires`]},fields:{name:e.title({label:`core.fields.name`}),about:e.illustrated({label:`documents.personal_document.fields.about`,fields:{image:e.avatar({}),text:e.text({rules:{max:1e3}})}}),idcard:e.idcard({overline:{type:e.string({label:`core.fields.type`,strict:!0,noSearch:!0,options:[{value:`P`,title:`documents.personal_document.options.type.P`,face:`passport`},{value:`PA`,title:`documents.personal_document.options.type.PA`,face:`biometric`},{value:`ID`,title:`documents.personal_document.options.type.ID`,face:`idcard`},{value:`DL`,title:`documents.personal_document.options.type.DL`,face:`licence`},{value:`RP`,title:`documents.personal_document.options.type.RP`,face:`residence`},{value:`TP`,title:`documents.personal_document.options.type.TP`,face:`protection`},{value:`MIL`,title:`documents.personal_document.options.type.MIL`,face:`military`},{value:`TIN`,title:`documents.personal_document.options.type.TIN`,face:`tax`},{value:`SSN`,title:`documents.personal_document.options.type.SSN`,face:`social`},{value:`V`,title:`documents.personal_document.options.type.V`,face:`visa`},{value:`WP`,title:`documents.personal_document.options.type.WP`,face:`workpermit`},{value:`MC`,title:`documents.personal_document.options.type.MC`,face:`medical`},{value:`INS`,title:`documents.personal_document.options.type.INS`,face:`insurance`},{value:`BR`,title:`documents.personal_document.options.type.BR`,face:`birth`},{value:`MAR`,title:`documents.personal_document.options.type.MAR`,face:`marriage`},{value:`DIV`,title:`documents.personal_document.options.type.DIV`,face:`divorce`},{value:`DEA`,title:`documents.personal_document.options.type.DEA`,face:`death`},{value:`EDU`,title:`documents.personal_document.options.type.EDU`,face:`diploma`},{value:`VAC`,title:`documents.personal_document.options.type.VAC`,face:`vaccination`},{value:`OT`,title:`documents.personal_document.options.type.OT`}]})},number:{number:e.identifier({label:`documents.personal_document.fields.number`,rules:{max:50}})},photo:{portrait:e.image({label:`documents.personal_document.fields.portrait`})},meta:{surname:e.string({label:`documents.personal_document.fields.surname`,rules:{max:100},ui:{span:6}}),given_names:e.string({label:`documents.personal_document.fields.given_names`,rules:{max:200},ui:{span:6}}),birth_date:e.date({label:`documents.personal_document.fields.birth_date`,ui:{span:4}}),sex:e.string({label:`documents.personal_document.fields.sex`,strict:!0,noSearch:!0,options:[{value:`M`,title:`documents.personal_document.options.sex.M`},{value:`F`,title:`documents.personal_document.options.sex.F`}],ui:{span:4,faces:[`passport`,`biometric`,`idcard`,`licence`,`residence`,`protection`,`military`,`visa`]}}),nationality:e.string({label:`documents.personal_document.fields.nationality`,options:`countries`,strict:!0,noSearch:!0,ui:{span:4,faces:[`passport`,`biometric`,`idcard`,`licence`,`residence`,`protection`,`military`,`visa`]}})},footer:{issued:e.date({label:`documents.personal_document.fields.issued`,ui:{span:4}}),authority:e.string({label:`documents.personal_document.fields.authority`,rules:{max:200},ui:{span:4}}),record_no:e.string({label:`documents.personal_document.fields.record_no`,rules:{max:50},ui:{span:4}})},mrz:{mrz:e.mrz({label:`documents.personal_document.fields.mrz`,rules:{max:200}})}}),expires:e.reminder({label:`documents.personal_document.fields.expires`,rules:{lead:60}}),owner:e.relation({label:`documents.personal_document.fields.owner`,options:t({library:`people`,shelf:`person`}),ui:{span:6}}),storage:e.relation({label:`documents.personal_document.fields.storage`,options:t({library:`things`,shelf:`storage_location`}),ui:{span:6}}),photos:e.image({label:`documents.personal_document.fields.photos`,multiple:!0}),tags:e.tags({label:`documents.personal_document.fields.tags`}),notes:e.text({label:`documents.personal_document.fields.notes`,rules:{max:1e3}})}}),s=a({id:`person_identity`,label:`documents.person_identity.label`,icon:`lucide:globe`,attachTo:[{library:`people`,shelf:`person`}],agent:`Canonical person identity (not tied to a physical document).
2
+ nationality — ISO alpha-2. variants — given/family name per language (field.keyed by lang: name+surname).`,fields:{nationality:e.string({label:`documents.person_identity.fields.nationality`,options:`countries`,strict:!0,noSearch:!0}),variants:e.keyed({label:`documents.person_identity.fields.variants`,icon:`lucide:languages`,fields:{lang:e.string({label:`documents.person_identity.variants.lang`,options:`languages`,strict:!0,noSearch:!0}),name:e.string({label:`documents.person_identity.variants.name`}),surname:e.string({label:`documents.person_identity.variants.surname`})},by:`lang`})}}),c=i({id:`documents`,version:`1.0.0`,dependsOn:[`people`,`things`],label:`documents.plugin.label`,description:`documents.plugin.description`,libraries:[{meta:r({id:`documents`,label:`documents.library.label`,icon:`lucide:id-card`,agent:{description:`Personal documents — IDs, passports, licences (personal_document); tracks expiry.`,instructions:`Expiring documents — count by expires. When a document is reissued — update number/issued/expires via update_record.`},starterHint:`documents that are about to expire`}),shelves:[o]}],extends_:[s]});export{c as default};
@@ -0,0 +1 @@
1
+ import{i as e,r as t,s as n}from"./data-size-BMG0D59K.js";import{a as r,c as i,i as a,n as o,o as s,r as c,s as l,t as u}from"./src-BrHtOaqX.js";export{c as SCHEME_TO_ACCESS_TYPE,a as cidr,t as dataSize,o as default,u as dev,e as diskSize,r as hostname,s as imei,l as ip,i as mac,n as ram};
@@ -0,0 +1,6 @@
1
+ import{n as e,r as t}from"./fields-CV3RQg0Y.js";import{a as n}from"./shelf-Cj_pNvd-.js";import{i as r,n as i}from"./plugin-Cjr7lgQH.js";var a=n({shelf:`item`,library:`things`,label:`things.item.label`,icon:`lucide:package`,agent:`A physical item. name — the title. type — an optional FAMILY classifier (extends can add types, e.g. device). subtype — an optional LEAF within that family (e.g. type=device, subtype=vtx for a video transmitter); an empty subtype is a valid state. Nothing validates that the pair is coherent, so when you set one, set the other consistently with it. store — a relation to things/store; store_legacy is hidden pre-migration free text kept only as a one-release rollback safety net, never write to it.`,views:{list:[`type`,`subtype`,`brand`,`model`,`location`],groupBy:[`type`,`subtype`,`paymentStatus`,`condition`,`owner`,`location`,`store`,`madeIn`,`tags`]},fields:{name:e.title({label:`core.fields.name`}),about:e.illustrated({label:`things.item.fields.about`,fields:{image:e.avatar({}),text:e.text({rules:{max:1e3}})}}),properties:e.properties({columns:4,fields:{type:e.string({label:`core.fields.type`,options:[{value:`clothing`,title:`things.item.options.type.clothing`},{value:`bag`,title:`things.item.options.type.bag`},{value:`cable`,title:`things.item.options.type.cable`},{value:`tool`,title:`things.item.options.type.tool`},{value:`furniture`,title:`things.item.options.type.furniture`},{value:`appliance`,title:`things.item.options.type.appliance`},{value:`household`,title:`things.item.options.type.household`},{value:`consumable`,title:`things.item.options.type.consumable`},{value:`personal_care`,title:`things.item.options.type.personal_care`},{value:`sports`,title:`things.item.options.type.sports`},{value:`hobby`,title:`things.item.options.type.hobby`},{value:`hardware`,title:`things.item.options.type.hardware`},{value:`decor`,title:`things.item.options.type.decor`},{value:`stationery`,title:`things.item.options.type.stationery`},{value:`other`,title:`things.item.options.type.other`}],strict:!0,noSearch:!0,ui:{span:3}}),subtype:e.string({label:`core.fields.subtype`,options:[],strict:!0,noSearch:!0,ui:{span:3}}),status:e.status({source:{condition:e.string({label:`things.item.fields.condition`,strict:!0,noSearch:!0,ui:{span:3},options:[{value:`new`,title:`things.item.options.condition.new`},{value:`good`,title:`things.item.options.condition.good`},{value:`fair`,title:`things.item.options.condition.fair`},{value:`poor`,title:`things.item.options.condition.poor`}]})}}),quantity:e.int({label:`things.item.fields.quantity`,rules:{min:0},ui:{span:3}}),owner:e.relation({label:`things.item.fields.owner`,options:t({library:`people`,shelf:`person`}),ui:{span:3}}),location:e.relation({label:`things.item.fields.location`,options:t({library:`things`,shelf:`storage_location`}),ui:{span:3}}),brand:e.string({label:`things.item.fields.brand`,rules:{max:100},ui:{span:3}}),model:e.string({label:`things.item.fields.model`,rules:{max:100},ui:{span:3}})}}),warrantyExpires:e.reminder({label:`things.item.fields.warrantyExpires`,rules:{lead:30},agent:`When the warranty EXPIRES — not when the item was bought.`}),group:e.group({label:`things.item.groups.specs`,icon:`lucide:ruler`,scope:`hoist`,fields:{serialNumber:e.identifier({label:`things.item.fields.serialNumber`,rules:{max:80},ui:{span:4}}),weight:e.weight({label:`things.item.fields.weight`,ui:{span:4}}),dimensions:e.dimensions({label:`things.item.fields.dimensions`,ui:{span:4}}),color:e.string({label:`things.item.fields.color`,rules:{max:120},ui:{span:4}}),material:e.string({label:`things.item.fields.material`,rules:{max:80},ui:{span:4}}),madeIn:e.country({label:`things.item.fields.madeIn`,ui:{span:4}})}}),group2:e.group({label:`things.item.groups.purchase`,icon:`lucide:shopping-cart`,scope:`hoist`,fields:{purchaseDate:e.date({label:`things.item.fields.purchaseDate`,ui:{span:4}}),purchasePrice:e.money({label:`things.item.fields.purchasePrice`,ui:{span:2}}),currency:e.currency({label:`core.fields.currency`,default:`UAH`,ui:{span:2}}),paymentStatus:e.string({label:`things.item.fields.paymentStatus`,strict:!0,noSearch:!0,ui:{span:4},options:[{value:`bought`,title:`things.item.options.paymentStatus.bought`},{value:`installment`,title:`things.item.options.paymentStatus.installment`},{value:`credit`,title:`things.item.options.paymentStatus.credit`}]}),store:e.relation({label:`things.item.fields.store`,options:t({library:`things`,shelf:`store`}),ui:{span:6}}),store_legacy:e.string({label:`things.item.fields.store_legacy`,ui:{hidden:!0},rules:{max:100}}),orderNumber:e.string({label:`things.item.fields.orderNumber`,rules:{max:100},ui:{span:6}}),link:e.link({label:`things.item.fields.link`,ui:{span:12}}),receipt:e.image({label:`things.item.fields.receipt`})}}),group3:e.group({label:`things.item.groups.media`,icon:`lucide:images`,scope:`hoist`,fields:{manual:e.document({label:`things.item.fields.manual`,ui:{span:6}}),photos:e.image({label:`things.item.fields.photos`,multiple:!0})}}),tags:e.tags({label:`things.item.fields.tags`}),notes:e.text({label:`things.item.fields.notes`,rules:{max:2e3}})}}),o=n({shelf:`storage_location`,library:`things`,label:`things.storage_location.label`,icon:`lucide:map-pin`,agent:`A storage location for items. name — what we call the place. path — hierarchy levels in order (room, furniture, shelf, container), free-form.`,views:{list:[`path`]},fields:{name:e.title({label:`core.fields.name`}),description:e.text({label:`things.storage_location.fields.description`,rules:{max:1e3}}),path:e.path({label:`things.storage_location.fields.path`,rules:{max:120}}),contents:e.backrefs({label:`things.storage_location.fields.contents`,from:{library:`things`,shelf:`item`,field:`location`}}),notes:e.text({label:`things.storage_location.fields.notes`,rules:{max:2e3}})}}),s=n({shelf:`store`,library:`things`,label:`things.store.label`,icon:`lucide:store`,agent:`A shop, marketplace or seller a thing was bought from; things/item.store points here.
2
+ scripts — a collection of page-extraction scripts for this shop. Each row's script field is
3
+ plain JavaScript text, readable in one record read, and is written by uploading a file or
4
+ through the API — never hand-edited in the web form. urlPattern is a human hint about which
5
+ pages a script applies to; nothing matches against it automatically. account holds a login or
6
+ a loyalty-card number and is stored in the clear — never write a password there.`,views:{list:[`type`,`country`,`status`,`rating`],inline:[`logo`,`name`],groupBy:[`type`,`status`,`country`,`tags`]},fields:{name:e.title({label:`core.fields.name`}),logo:e.avatar({label:`things.store.fields.logo`}),description:e.text({label:`things.store.fields.description`,rules:{max:1e3}}),group:e.group({label:`things.store.groups.place`,icon:`lucide:map-pin`,scope:`hoist`,fields:{address:e.string({label:`things.store.fields.address`,rules:{max:200},ui:{span:6}}),geo:e.geo({label:`things.store.fields.geo`,ui:{span:6}}),hours:e.keyed({label:`things.store.fields.hours`,fields:{day:e.string({label:`core.fields.weekday`,options:`weekdays`,strict:!0,noSearch:!0}),open:e.time({label:`things.store.fields.open`}),close:e.time({label:`things.store.fields.close`})},by:`day`,unique:[`day`]})}}),links:e.group({scope:`nest`,label:`things.store.groups.links`,icon:`lucide:link`,multiple:!0,fields:{kind:e.string({label:`things.store.fields.linkKind`,options:[{value:`site`,title:`things.store.options.linkKind.site`},{value:`account`,title:`things.store.options.linkKind.account`},{value:`orders`,title:`things.store.options.linkKind.orders`},{value:`support`,title:`things.store.options.linkKind.support`},{value:`other`,title:`things.store.options.linkKind.other`}],strict:!0,noSearch:!0}),url:e.link({label:`things.store.fields.url`})}}),account:e.string({label:`things.store.fields.account`,rules:{max:100}}),scripts:e.group({scope:`nest`,label:`things.store.groups.scripts`,icon:`lucide:code`,multiple:!0,fields:{title:e.string({label:`things.store.fields.scriptTitle`,rules:{max:100}}),kind:e.string({label:`things.store.fields.scriptKind`,options:[{value:`product`,title:`things.store.options.scriptKind.product`},{value:`orders`,title:`things.store.options.scriptKind.orders`},{value:`receipt`,title:`things.store.options.scriptKind.receipt`},{value:`search`,title:`things.store.options.scriptKind.search`},{value:`other`,title:`things.store.options.scriptKind.other`}],strict:!0,noSearch:!0}),urlPattern:e.string({label:`things.store.fields.urlPattern`,rules:{max:200}}),script:e.source({label:`things.store.fields.script`,rules:{ext:`js`}}),note:e.text({label:`things.store.fields.scriptNote`,rules:{max:500}})}}),photos:e.image({label:`things.store.fields.photos`,multiple:!0}),properties:e.properties({columns:4,fields:{type:e.string({label:`core.fields.type`,options:[{value:`marketplace`,title:`things.store.options.type.marketplace`},{value:`online_store`,title:`things.store.options.type.online_store`},{value:`retail`,title:`things.store.options.type.retail`},{value:`secondhand`,title:`things.store.options.type.secondhand`},{value:`manufacturer`,title:`things.store.options.type.manufacturer`}],strict:!0,noSearch:!0,ui:{span:3}}),country:e.country({label:`things.store.fields.country`,ui:{span:3}}),rating:e.rating({label:`things.store.fields.rating`,ui:{span:3}}),status:e.string({label:`things.store.fields.status`,options:[{value:`active`,title:`things.store.options.status.active`},{value:`rare`,title:`things.store.options.status.rare`},{value:`abandoned`,title:`things.store.options.status.abandoned`}],strict:!0,noSearch:!0,ui:{span:3}})}}),tags:e.tags({label:`things.store.fields.tags`}),notes:e.text({label:`things.store.fields.notes`,rules:{max:2e3}})}}),c=i({id:`things`,version:`1.0.0`,dependsOn:[`people`],label:`things.plugin.label`,description:`things.plugin.description`,libraries:[{meta:r({id:`things`,label:`things.library.label`,icon:`lucide:package`,agent:{description:`Belongings and where they are stored (item, storage_location, store). Also hosts network hosts (device_info) and drone builds.`,instructions:`item: quantity {value,unit}, location (relation to storage_location), condition, warrantyExpires (ISO date). Find an item via list_records things/item (filters or text q). When an item is moved/changes condition/is repaired — update location/condition/quantity via update_record; on purchase — purchaseDate/warrantyExpires.`},starterHint:`what's about to warranty-expire`}),shelves:[a,o,s]}]});export{c as default};
@@ -0,0 +1 @@
1
+ import{n as e,r as t}from"./fields-CV3RQg0Y.js";import{a as n}from"./shelf-Cj_pNvd-.js";import{i as r,n as i}from"./plugin-Cjr7lgQH.js";import{t as a}from"./extend-yQ8zoqGc.js";import{t as o}from"./showcase-BeBnutzT.js";var s=a({id:`drone`,label:`drone.drone.label`,icon:`tb:drone`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`drone`,subtype:{$in:[`aircraft`,`rtf`]}},agent:{description:`FPV drone technical characteristics. frame_size — frame size (e.g. 3.5"). motors — motors. firmware — firmware (Betaflight/INAV). camera/flight_controller/vtx/gps_module link to things/item[type=drone] records of the matching subtype. A drone whose parts cannot be separate records is subtype='rtf' instead, and carries the component extends directly.`,instructions:`drone references the components; specs live in each module's fields. When you replace a component or update the firmware — update the relevant fields via update_record.`},fields:{bento:e.bento({fields:{group:{span:`2x1`,el:e.group({scope:`hoist`,fields:{motors:e.string({label:`drone.drone.fields.motors`,rules:{max:150}}),props:e.string({label:`drone.drone.fields.props`,rules:{max:80}}),camera:e.relation({label:`drone.drone.fields.camera`,options:t({library:`things`,shelf:`item`,filter:{type:`drone`,subtype:`camera`}})})}})},group2:e.group({scope:`hoist`,fields:{power_module:e.string({label:`drone.drone.fields.power_module`,rules:{max:60}}),vtx:e.relation({label:`drone.drone.fields.vtx`,options:t({library:`things`,shelf:`item`,filter:{type:`drone`,subtype:`vtx`}})})}}),group3:e.group({scope:`hoist`,fields:{flight_time:e.string({label:`drone.drone.fields.flight_time`,rules:{max:60}}),firmware:e.string({label:`drone.drone.fields.firmware`,options:`drone-firmware`,strict:!0,noSearch:!0}),firmware_version:e.string({label:`drone.drone.fields.firmware_version`,rules:{max:40}}),firmware_target:e.string({label:`drone.drone.fields.firmware_target`,rules:{max:80}})}}),group4:e.group({scope:`hoist`,fields:{frame_size:e.string({label:`drone.drone.fields.frame_size`,rules:{max:40}}),purpose:e.string({label:`drone.drone.fields.purpose`,rules:{max:200}})}}),group5:e.group({scope:`hoist`,fields:{flight_controller:e.relation({label:`drone.drone.fields.flight_controller`,options:t({library:`things`,shelf:`item`,filter:{type:`drone`,subtype:`flight_controller`}})}),gps_module:e.relation({label:`drone.drone.fields.gps_module`,options:t({library:`things`,shelf:`item`,filter:{type:`drone`,subtype:`gps`}})})}}),group6:e.group({scope:`hoist`,fields:{radio_link:e.string({label:`drone.drone.fields.radio_link`,options:`drone-radio-links`,multiple:!0,strict:!0,noSearch:!0}),receiver:e.string({label:`drone.drone.fields.receiver`,rules:{max:80}}),video_system:e.string({label:`drone.drone.fields.video_system`,options:`drone-video-systems`,strict:!0,noSearch:!0})}})}}),snippets:e.group({scope:`nest`,label:`drone.drone.groups.snippets`,icon:`lucide:terminal`,multiple:!0,fields:{title:e.string({label:`drone.drone.fields.snippet_title`,rules:{max:100}}),summary:e.text({label:`drone.drone.fields.snippet_summary`,rules:{max:500}}),snippet:e.source({label:`drone.drone.fields.snippet`,rules:{ext:`md`}})}}),flights:e.backrefs({label:`drone.drone.fields.flights`,from:{library:`drone`,shelf:`flight`,field:`aircraft`}}),notes:e.text({label:`drone.drone.fields.notes`,rules:{max:2e3}})}}),c=a({id:`drone_battery`,label:`drone.drone_battery.label`,icon:`lucide:battery-full`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`drone`,subtype:{$in:[`battery`,`rtf`]}},agent:`FPV drone battery characteristics. cells — number of cells (1S/3S/4S). capacity — capacity in mAh. c_rate — discharge current. auw — all-up weight of the assembly in flight.`,fields:{charger:e.string({label:`drone.drone_battery.fields.charger`,rules:{max:100}}),cells:e.string({label:`drone.drone_battery.fields.cells`,options:`drone-cells`,strict:!0,noSearch:!0}),capacity:e.measured({label:`drone.drone_battery.fields.capacity`,units:`energy`}),c_rate:e.string({label:`drone.drone_battery.fields.c_rate`,rules:{max:20}}),auw:e.string({label:`drone.drone_battery.fields.auw`,rules:{max:40}}),flights:e.backrefs({label:`drone.drone_battery.fields.flights`,from:{library:`drone`,shelf:`flight`,field:`batteries`}}),notes:e.text({label:`drone.drone_battery.fields.notes`,rules:{max:2e3}})}}),l=a({id:`drone_vtx`,label:`drone.drone_vtx.label`,icon:`lucide:radio-tower`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`drone`,subtype:{$in:[`vtx`,`rtf`]}},agent:`FPV video transmitter characteristics. input_voltage — input voltage. protocol — control protocols, codes from the drone-vtx-protocols list. frequency_groups — Betaflight band letters. channel_count — number of channels.`,fields:{input_voltage:e.string({label:`drone.drone_vtx.fields.input_voltage`,rules:{max:40}}),protocol:e.string({label:`drone.drone_vtx.fields.protocol`,options:`drone-vtx-protocols`,multiple:!0,strict:!0,noSearch:!0}),antenna_interface:e.string({label:`drone.drone_vtx.fields.antenna_interface`,options:`drone-rf-connectors`,strict:!0,noSearch:!0}),channel_count:e.int({label:`drone.drone_vtx.fields.channel_count`,rules:{min:0}}),mounting:e.string({label:`drone.drone_vtx.fields.mounting`,options:`drone-mounting`,multiple:!0,strict:!0,noSearch:!0}),built_in_microphone:e.boolean({label:`drone.drone_vtx.fields.built_in_microphone`}),frequency_groups:e.string({label:`drone.drone_vtx.fields.frequency_groups`,options:`drone-bands`,multiple:!0,strict:!0,noSearch:!0}),power_levels:e.keyed({label:`drone.drone_vtx.groups.power_levels`,icon:`lucide:zap`,container:e.row,fields:{level:e.string({label:`drone.drone_vtx.fields.power_level`,options:`drone-vtx-power`,strict:!0,noSearch:!0}),current_ma:e.int({label:`drone.drone_vtx.fields.current_ma`,rules:{min:0}}),dbm:e.real({label:`drone.drone_vtx.fields.dbm`})},by:`level`}),notes:e.text({label:`drone.drone_vtx.fields.notes`,rules:{max:2e3}})}}),u=a({id:`drone_gps`,label:`drone.drone_gps.label`,icon:`lucide:satellite`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`drone`,subtype:{$in:[`gps`,`rtf`]}},agent:`FPV drone GPS module characteristics. gnss_chip — chipset. compass_chip — magnetometer. satellite_systems — supported satellite systems.`,fields:{gnss_chip:e.string({label:`drone.drone_gps.fields.gnss_chip`,rules:{max:80}}),compass_chip:e.string({label:`drone.drone_gps.fields.compass_chip`,rules:{max:60}}),barometer:e.boolean({label:`drone.drone_gps.fields.barometer`}),interface:e.string({label:`drone.drone_gps.fields.interface`,options:`drone-serial-interfaces`,multiple:!0,strict:!0,noSearch:!0}),input_voltage:e.string({label:`drone.drone_gps.fields.input_voltage`,rules:{max:40}}),update_rate_hz:e.int({label:`drone.drone_gps.fields.update_rate_hz`,rules:{min:0}}),receiving_channels:e.int({label:`drone.drone_gps.fields.receiving_channels`,rules:{min:0}}),supported_protocols:e.string({label:`drone.drone_gps.fields.supported_protocols`,options:`drone-gnss-protocols`,multiple:!0,strict:!0,noSearch:!0}),baud_rates:e.string({label:`drone.drone_gps.fields.baud_rates`,options:`drone-baud-rates`,multiple:!0,strict:!0,noSearch:!0}),satellite_systems:e.string({label:`drone.drone_gps.fields.satellite_systems`,options:`drone-gnss-systems`,multiple:!0,strict:!0,noSearch:!0}),notes:e.text({label:`drone.drone_gps.fields.notes`,rules:{max:2e3}})}}),d=a({id:`drone_flight_controller`,label:`drone.drone_flight_controller.label`,icon:`lucide:sliders-horizontal`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`drone`,subtype:{$in:[`flight_controller`,`rtf`]}},agent:`FPV drone flight controller characteristics. mcu — processor (STM32F411/F405). gyro — gyroscope. supported_firmware — compatible firmware (Betaflight, INAV).`,fields:{mcu:e.string({label:`drone.drone_flight_controller.fields.mcu`,options:`drone-fc-mcu`,strict:!0,noSearch:!0}),gyro:e.string({label:`drone.drone_flight_controller.fields.gyro`,options:`drone-gyro`,multiple:!0,strict:!0,noSearch:!0}),barometer:e.boolean({label:`drone.drone_flight_controller.fields.barometer`}),osd_chip:e.string({label:`drone.drone_flight_controller.fields.osd_chip`,options:`drone-osd-chip`,strict:!0,noSearch:!0}),blackbox:e.string({label:`drone.drone_flight_controller.fields.blackbox`,options:`drone-blackbox`,strict:!0,noSearch:!0}),bluetooth:e.boolean({label:`drone.drone_flight_controller.fields.bluetooth`}),wifi:e.boolean({label:`drone.drone_flight_controller.fields.wifi`}),current_sensor_input:e.boolean({label:`drone.drone_flight_controller.fields.current_sensor_input`}),power_input:e.string({label:`drone.drone_flight_controller.fields.power_input`,rules:{max:40}}),constant_current:e.string({label:`drone.drone_flight_controller.fields.constant_current`,rules:{max:20}}),peak_current:e.string({label:`drone.drone_flight_controller.fields.peak_current`,rules:{max:20}}),bec_5v:e.string({label:`drone.drone_flight_controller.fields.bec_5v`,rules:{max:20}}),bec_9v:e.string({label:`drone.drone_flight_controller.fields.bec_9v`,rules:{max:20}}),mounting:e.string({label:`drone.drone_flight_controller.fields.mounting`,options:`drone-mounting`,multiple:!0,strict:!0,noSearch:!0}),uart_count:e.int({label:`drone.drone_flight_controller.fields.uart_count`,rules:{min:0}}),supported_firmware:e.string({label:`drone.drone_flight_controller.fields.supported_firmware`,options:`drone-firmware`,multiple:!0,strict:!0,noSearch:!0}),firmware_target:e.string({label:`drone.drone_flight_controller.fields.firmware_target`,rules:{max:80}}),build_role:e.string({label:`drone.drone_flight_controller.fields.build_role`,rules:{max:200}}),notes:e.text({label:`drone.drone_flight_controller.fields.notes`,rules:{max:2e3}})}}),f=a({id:`drone_goggles`,label:`drone.drone_goggles.label`,icon:`lucide:glasses`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`drone`,subtype:`goggles`},agent:`FPV goggles characteristics. display_size — display diagonal. frequency_bands — supported radio bands. battery_life — runtime on battery.`,fields:{display_size:e.string({label:`drone.drone_goggles.fields.display_size`,rules:{max:20}}),display_resolution:e.string({label:`drone.drone_goggles.fields.display_resolution`,rules:{max:40}}),display_brightness:e.string({label:`drone.drone_goggles.fields.display_brightness`,rules:{max:30}}),view_angle:e.string({label:`drone.drone_goggles.fields.view_angle`,rules:{max:20}}),antenna:e.string({label:`drone.drone_goggles.fields.antenna`,rules:{max:80}}),frequency_bands:e.string({label:`drone.drone_goggles.fields.frequency_bands`,options:`drone-bands`,multiple:!0,strict:!0,noSearch:!0}),battery:e.string({label:`drone.drone_goggles.fields.battery`,rules:{max:60}}),battery_life:e.string({label:`drone.drone_goggles.fields.battery_life`,rules:{max:40}}),charging:e.string({label:`drone.drone_goggles.fields.charging`,rules:{max:60}}),band_channels:e.keyed({label:`drone.drone_goggles.groups.band_channels`,icon:`lucide:radio`,container:e.row,fields:{band:e.string({label:`drone.drone_goggles.fields.band`,options:`drone-bands`,strict:!0,noSearch:!0}),channels:e.int({label:`drone.drone_goggles.fields.channels`,multiple:!0})},by:`band`}),notes:e.text({label:`drone.drone_goggles.fields.notes`,rules:{max:2e3}})}}),p=a({id:`drone_antenna`,label:`drone.drone_antenna.label`,icon:`lucide:radio`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`drone`,subtype:{$in:[`antenna`,`rtf`]}},agent:`FPV antenna characteristics. rf_band — the bands it covers, codes from drone-rf-bands. polarization — RHCP/LHCP/linear; a video link needs the SAME polarization on both ends. antenna_type — the radiating structure. connector — one model often ships in several connector variants.`,fields:{rf_band:e.string({label:`drone.drone_antenna.fields.rf_band`,options:`drone-rf-bands`,multiple:!0,strict:!0,noSearch:!0}),polarization:e.string({label:`drone.drone_antenna.fields.polarization`,options:`drone-polarization`,strict:!0,noSearch:!0}),antenna_type:e.string({label:`drone.drone_antenna.fields.antenna_type`,options:`drone-antenna-types`,strict:!0,noSearch:!0}),connector:e.string({label:`drone.drone_antenna.fields.connector`,options:`drone-rf-connectors`,multiple:!0,strict:!0,noSearch:!0}),gain_dbi:e.real({label:`drone.drone_antenna.fields.gain_dbi`}),cable_length:e.int({label:`drone.drone_antenna.fields.cable_length`,rules:{min:0}}),notes:e.text({label:`drone.drone_antenna.fields.notes`,rules:{max:2e3}})}}),m=a({id:`drone_receiver`,label:`drone.drone_receiver.label`,icon:`lucide:antenna`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`drone`,subtype:{$in:[`receiver`,`rtf`]}},agent:`RC receiver characteristics. radio_link — the protocol it binds with (ExpressLRS, Crossfire…). output_protocol — how it talks to the flight controller (CRSF, SBUS…). diversity — two antennas with active switching.`,fields:{radio_link:e.string({label:`drone.drone_receiver.fields.radio_link`,options:`drone-radio-links`,strict:!0,noSearch:!0}),rf_band:e.string({label:`drone.drone_receiver.fields.rf_band`,options:`drone-rf-bands`,multiple:!0,strict:!0,noSearch:!0}),output_protocol:e.string({label:`drone.drone_receiver.fields.output_protocol`,options:`drone-rx-outputs`,multiple:!0,strict:!0,noSearch:!0}),antenna_connector:e.string({label:`drone.drone_receiver.fields.antenna_connector`,options:`drone-rf-connectors`,strict:!0,noSearch:!0}),antenna_count:e.int({label:`drone.drone_receiver.fields.antenna_count`,rules:{min:0}}),telemetry:e.boolean({label:`drone.drone_receiver.fields.telemetry`}),diversity:e.boolean({label:`drone.drone_receiver.fields.diversity`}),input_voltage:e.string({label:`drone.drone_receiver.fields.input_voltage`,rules:{max:40}}),firmware_version:e.string({label:`drone.drone_receiver.fields.firmware_version`,rules:{max:40}}),notes:e.text({label:`drone.drone_receiver.fields.notes`,rules:{max:2e3}})}}),h=a({id:`drone_camera`,label:`drone.drone_camera.label`,icon:`lucide:camera`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{type:`drone`,subtype:{$in:[`camera`,`rtf`]}},agent:`FPV camera characteristics. sensor — the sensor model (free text, e.g. Sony Super HAD II). resolution_tvl — analog horizontal resolution in TVL. aspect_ratio — 4:3 / 16:9 / switchable. output — the video signal it produces (analog CVBS or a digital HD system).`,fields:{sensor:e.string({label:`drone.drone_camera.fields.sensor`,rules:{max:100}}),resolution_tvl:e.int({label:`drone.drone_camera.fields.resolution_tvl`,rules:{min:0}}),aspect_ratio:e.string({label:`drone.drone_camera.fields.aspect_ratio`,options:`drone-camera-aspect`,strict:!0,noSearch:!0}),lens_mm:e.real({label:`drone.drone_camera.fields.lens_mm`}),fov_deg:e.int({label:`drone.drone_camera.fields.fov_deg`,rules:{min:0}}),output:e.string({label:`drone.drone_camera.fields.output`,options:`drone-camera-output`,strict:!0,noSearch:!0}),camera_size:e.string({label:`drone.drone_camera.fields.camera_size`,options:`drone-camera-sizes`,strict:!0,noSearch:!0}),input_voltage:e.string({label:`drone.drone_camera.fields.input_voltage`,rules:{max:40}}),notes:e.text({label:`drone.drone_camera.fields.notes`,rules:{max:2e3}})}}),g=[`ok`,`low_voltage`,`crash`,`lost`],_=[{value:`ok`,title:`drone.options.outcome.ok`,tone:`success`},{value:`low_voltage`,title:`drone.options.outcome.low_voltage`,tone:`warning`},{value:`crash`,title:`drone.options.outcome.crash`,tone:`danger`},{value:`lost`,title:`drone.options.outcome.lost`,tone:`danger`}],v=e=>Array.isArray(e)?e.filter(e=>e&&typeof e==`object`):[];function y(e,t){let n=[];for(let r of v(e)){let e=r[t];if(e==null||e===``)continue;let i=Number(e);Number.isFinite(i)&&(n.includes(i)||n.push(i))}return n}function b(e,t=`outcome`){let n=-1;for(let r of v(e)){let e=g.indexOf(r[t]);e>n&&(n=e)}return n<0?null:g[n]}var x=n({shelf:`flight`,library:`drone`,label:`drone.flight.label`,icon:`lucide:plane-takeoff`,agent:"A flying session, not a single sortie: one record is one outing — date, place, aircraft — and each battery pack flown is a row of `packs` (battery, duration in seconds, outcome, notes). `batteries` and `outcome` are SERVER-OWNED derivations over those rows and are rejected if sent: `batteries` indexes the distinct batteries used, `outcome` is the worst row outcome. Record a crash by setting that pack's outcome and listing the broken parts in `damage`, not by prose in `notes`. The `aircraft` picker only offers things/item[subtype='aircraft'] — a ready-to-fly kit (subtype='rtf') cannot be selected there today, so log its flights against an 'aircraft'-subtype record instead.",views:{title:`date`,listKind:`map`,list:[`aircraft`,`place`,`outcome`],inline:[`date`,`aircraft`]},fields:{date:e.date({label:`drone.flight.fields.date`,rules:{min:`2000-01-01`,max:`today`},ui:{span:4}}),description:e.text({label:`drone.flight.fields.description`,rules:{max:1e3}}),place:e.geo({label:`drone.flight.fields.place`}),aircraft:e.relation({label:`drone.flight.fields.aircraft`,options:t({library:`things`,shelf:`item`,filter:{type:`drone`,subtype:`aircraft`}})}),batteries:e.relation({label:`drone.flight.fields.batteries`,multiple:!0,options:t({library:`things`,shelf:`item`,filter:{type:`drone`,subtype:`battery`}}),value:({record:e})=>y(e.packs,`battery`)}),weather:e.group({scope:`hoist`,label:`drone.flight.groups.weather`,icon:`lucide:cloud-sun`,fields:{temp:e.measured({label:`drone.flight.fields.temp`,units:`temperature`,ui:{span:4}}),wind:e.measured({label:`drone.flight.fields.wind`,units:`speed`,ui:{span:4}}),sky:e.string({label:`drone.flight.fields.sky`,options:`drone-sky`,strict:!0,noSearch:!0})}}),packs:e.row({scope:`nest`,multiple:!0,label:`drone.flight.fields.packs`,icon:`lucide:battery-charging`,fields:{battery:e.relation({label:`drone.flight.fields.battery`,options:t({library:`things`,shelf:`item`,filter:{type:`drone`,subtype:`battery`}}),mutate:[`batteries`]}),duration:e.duration({label:`drone.flight.fields.duration`}),outcome:e.string({label:`drone.flight.fields.pack_outcome`,options:`drone-outcomes`,strict:!0,noSearch:!0,mutate:[`outcome`]}),notes:e.text({label:`drone.flight.fields.pack_notes`,rules:{max:500}})}}),outcome:e.string({label:`drone.flight.fields.outcome`,options:`drone-outcomes`,strict:!0,noSearch:!0,value:({record:e})=>b(e.packs)}),setup:e.group({scope:`hoist`,label:`drone.flight.groups.setup`,icon:`lucide:sliders-horizontal`,fields:{firmware_version:e.string({label:`drone.flight.fields.firmware_version`,rules:{max:40}}),tune:e.text({label:`drone.flight.fields.tune`,rules:{max:2e3}})}}),damage:e.relation({label:`drone.flight.fields.damage`,multiple:!0,options:t({library:`things`,shelf:`item`,filter:{type:`drone`}})}),video:e.video({label:`drone.flight.fields.video`,multiple:!0}),photos:e.image({label:`drone.flight.fields.photos`,multiple:!0}),edit_link:e.link({label:`drone.flight.fields.edit_link`}),tags:e.tags({label:`drone.flight.fields.tags`}),notes:e.text({label:`drone.flight.fields.notes`,rules:{max:2e3}})}}),S=i({id:`drone`,version:`1.0.0`,dependsOn:[`things`,`geo`],label:`drone.plugin.label`,description:`drone.plugin.description`,libraries:[{meta:r({id:`drone`,label:`drone.library.label`,icon:`tb:drone`,agent:`FPV drones and their components. A component is a things/item row with type=drone — this library owns no table for those. A FLIGHT is different: it is an event, not a thing, and it is this library's one table (flight): one record per outing, with the battery packs flown as rows inside it.`}),shelves:[x]}],extends_:[s,c,l,u,d,f,p,m,h],showcases:[o({id:`fleet`,library:`drone`,label:`drone.fleet.label`,icon:`lucide:plane`,source:{library:`things`,shelf:`item`},filter:{type:`drone`},columns:[`subtype`,`brand`,`model`,`location`,`condition`],defaultGroupBy:`subtype`,createDefaults:{type:`drone`}})],optionLists:[{name:`drone-bands`,options:[{value:`A`,title:`A`},{value:`B`,title:`B`},{value:`E`,title:`E`},{value:`F`,title:`F`},{value:`R`,title:`R`},{value:`L`,title:`L`},{value:`U`,title:`U`},{value:`O`,title:`O`},{value:`H`,title:`H`}]},{name:`drone-vtx-power`,options:[{value:`pit`,title:`PIT`},{value:`25mw`,title:`25 mW`},{value:`100mw`,title:`100 mW`},{value:`200mw`,title:`200 mW`},{value:`350mw`,title:`350 mW`},{value:`400mw`,title:`400 mW`},{value:`600mw`,title:`600 mW`},{value:`800mw`,title:`800 mW`},{value:`1000mw`,title:`1 W`},{value:`1600mw`,title:`1.6 W`},{value:`2500mw`,title:`2.5 W`}]},{name:`drone-vtx-protocols`,options:[{value:`smartaudio_1_0`,title:`SmartAudio 1.0`},{value:`smartaudio_2_0`,title:`SmartAudio 2.0`},{value:`smartaudio_2_1`,title:`SmartAudio 2.1`},{value:`tramp`,title:`IRC Tramp`},{value:`msp_displayport`,title:`MSP DisplayPort`},{value:`none`,title:`drone.options.none`}]},{name:`drone-rf-connectors`,options:[{value:`ipex_mhf1`,title:`IPEX / MHF1 (U.FL)`},{value:`ipex_mhf3`,title:`IPEX MHF3`},{value:`mmcx`,title:`MMCX`},{value:`sma`,title:`SMA`},{value:`rp_sma`,title:`RP-SMA`},{value:`ufl_solder`,title:`U.FL (soldered)`}]},{name:`drone-mounting`,options:[{value:`16x16_m2`,title:`16×16 mm M2`},{value:`20x20_m2`,title:`20×20 mm M2`},{value:`20x20_m3`,title:`20×20 mm M3`},{value:`25.5x25.5_m2`,title:`25.5×25.5 mm M2`},{value:`30.5x30.5_m3`,title:`30.5×30.5 mm M3`},{value:`adhesive`,title:`drone.options.adhesive`}]},{name:`drone-firmware`,options:[{value:`betaflight`,title:`Betaflight`},{value:`inav`,title:`INAV`},{value:`ardupilot`,title:`ArduPilot`},{value:`emuflight`,title:`EmuFlight`},{value:`rotorflight`,title:`Rotorflight`},{value:`kiss`,title:`KISS`},{value:`cleanflight`,title:`Cleanflight`}]},{name:`drone-fc-mcu`,options:[{value:`stm32f411`,title:`STM32F411`},{value:`stm32f405`,title:`STM32F405`},{value:`stm32f722`,title:`STM32F722`},{value:`stm32f745`,title:`STM32F745`},{value:`stm32f765`,title:`STM32F765`},{value:`stm32h743`,title:`STM32H743`},{value:`stm32h750`,title:`STM32H750`},{value:`at32f435`,title:`AT32F435`},{value:`gd32f405`,title:`GD32F405`}]},{name:`drone-gyro`,options:[{value:`mpu6000`,title:`MPU6000`},{value:`mpu6500`,title:`MPU6500`},{value:`icm20602`,title:`ICM20602`},{value:`icm20689`,title:`ICM20689`},{value:`icm42688p`,title:`ICM42688-P`},{value:`icm42605`,title:`ICM42605`},{value:`bmi270`,title:`BMI270`},{value:`bmi160`,title:`BMI160`}]},{name:`drone-osd-chip`,options:[{value:`at7456e`,title:`AT7456E`},{value:`max7456`,title:`MAX7456`},{value:`msp_displayport`,title:`MSP DisplayPort`},{value:`none`,title:`drone.options.none`}]},{name:`drone-blackbox`,options:[{value:`none`,title:`drone.options.none`},{value:`flash_8mb`,title:`Flash 8 MB`},{value:`flash_16mb`,title:`Flash 16 MB`},{value:`flash_32mb`,title:`Flash 32 MB`},{value:`sd_card`,title:`microSD`}]},{name:`drone-gnss-systems`,options:[{value:`gps`,title:`GPS`},{value:`glonass`,title:`GLONASS`},{value:`galileo`,title:`Galileo`},{value:`beidou`,title:`BeiDou`},{value:`qzss`,title:`QZSS`},{value:`sbas`,title:`SBAS`},{value:`navic`,title:`NavIC`}]},{name:`drone-gnss-protocols`,options:[{value:`ubx`,title:`UBX`},{value:`nmea`,title:`NMEA`},{value:`rtcm3`,title:`RTCM3`},{value:`msp`,title:`MSP`}]},{name:`drone-baud-rates`,options:[{value:`4800`,title:`4800`},{value:`9600`,title:`9600`},{value:`19200`,title:`19200`},{value:`38400`,title:`38400`},{value:`57600`,title:`57600`},{value:`115200`,title:`115200`},{value:`230400`,title:`230400`},{value:`460800`,title:`460800`},{value:`921600`,title:`921600`}]},{name:`drone-serial-interfaces`,options:[{value:`uart`,title:`UART`},{value:`i2c`,title:`I2C`},{value:`spi`,title:`SPI`},{value:`can`,title:`CAN`}]},{name:`drone-video-systems`,options:[{value:`analog_5_8`,title:`drone.options.videoSystems.analog_5_8`},{value:`dji_v1_v2`,title:`DJI V1/V2`},{value:`dji_o3`,title:`DJI O3`},{value:`dji_o4`,title:`DJI O4`},{value:`walksnail_avatar`,title:`Walksnail Avatar`},{value:`hdzero`,title:`HDZero`}]},{name:`drone-radio-links`,options:[{value:`elrs_2_4`,title:`ExpressLRS 2.4 GHz`},{value:`elrs_900`,title:`ExpressLRS 868/915 MHz`},{value:`crossfire`,title:`TBS Crossfire`},{value:`tracer`,title:`TBS Tracer`},{value:`ghost`,title:`ImmersionRC Ghost`},{value:`frsky_d16`,title:`FrSky D16`},{value:`frsky_d8`,title:`FrSky D8`},{value:`dsmx`,title:`Spektrum DSMX`},{value:`dji`,title:`DJI`}]},{name:`drone-rf-bands`,options:[{value:`5_8ghz`,title:`5.8 GHz`},{value:`2_4ghz`,title:`2.4 GHz`},{value:`1_2ghz`,title:`1.2 GHz`},{value:`900mhz`,title:`868/915 MHz`},{value:`433mhz`,title:`433 MHz`}]},{name:`drone-polarization`,options:[{value:`rhcp`,title:`drone.options.polarization.rhcp`},{value:`lhcp`,title:`drone.options.polarization.lhcp`},{value:`linear`,title:`drone.options.polarization.linear`}]},{name:`drone-antenna-types`,options:[{value:`omni`,title:`drone.options.antennaTypes.omni`},{value:`patch`,title:`drone.options.antennaTypes.patch`},{value:`helical`,title:`drone.options.antennaTypes.helical`},{value:`pagoda`,title:`drone.options.antennaTypes.pagoda`},{value:`cloverleaf`,title:`drone.options.antennaTypes.cloverleaf`},{value:`monopole`,title:`drone.options.antennaTypes.monopole`},{value:`whip`,title:`drone.options.antennaTypes.whip`}]},{name:`drone-cells`,options:[{value:`1s`,title:`1S`},{value:`2s`,title:`2S`},{value:`3s`,title:`3S`},{value:`4s`,title:`4S`},{value:`5s`,title:`5S`},{value:`6s`,title:`6S`},{value:`7s`,title:`7S`},{value:`8s`,title:`8S`},{value:`12s`,title:`12S`}]},{name:`drone-rx-outputs`,options:[{value:`crsf`,title:`CRSF`},{value:`sbus`,title:`SBUS`},{value:`ibus`,title:`IBUS`},{value:`ppm`,title:`PPM`},{value:`pwm`,title:`PWM`},{value:`spektrum`,title:`Spektrum`},{value:`ghst`,title:`GHST`}]},{name:`drone-camera-aspect`,options:[{value:`4_3`,title:`4:3`},{value:`16_9`,title:`16:9`},{value:`switchable`,title:`drone.options.cameraAspect.switchable`}]},{name:`drone-camera-output`,options:[{value:`analog_cvbs`,title:`drone.options.cameraOutput.analog_cvbs`},{value:`dji`,title:`DJI`},{value:`walksnail`,title:`Walksnail`},{value:`hdzero`,title:`HDZero`}]},{name:`drone-camera-sizes`,options:[{value:`nano`,title:`Nano`},{value:`micro`,title:`Micro`},{value:`mini`,title:`Mini`},{value:`full`,title:`Full-size`},{value:`whoop`,title:`Whoop`}]},{name:`drone-outcomes`,options:[..._]},{name:`drone-sky`,options:[{value:`clear`,title:`drone.options.sky.clear`},{value:`cloudy`,title:`drone.options.sky.cloudy`},{value:`overcast`,title:`drone.options.sky.overcast`},{value:`fog`,title:`drone.options.sky.fog`},{value:`rain`,title:`drone.options.sky.rain`},{value:`snow`,title:`drone.options.sky.snow`}]}],fieldContribs:[{library:`things`,shelf:`item`,field:`type`,options:[{value:`drone`,title:`drone.drone.label`}]},{library:`things`,shelf:`item`,field:`subtype`,options:[{value:`aircraft`,title:`drone.contrib.subtype.aircraft`,when:{type:`drone`}},{value:`battery`,title:`drone.drone_battery.label`,when:{type:`drone`}},{value:`vtx`,title:`drone.drone_vtx.label`,when:{type:`drone`}},{value:`gps`,title:`drone.drone_gps.label`,when:{type:`drone`}},{value:`flight_controller`,title:`drone.drone_flight_controller.label`,when:{type:`drone`}},{value:`goggles`,title:`drone.drone_goggles.label`,when:{type:`drone`}},{value:`radio`,title:`drone.contrib.subtype.radio`,when:{type:`drone`}},{value:`camera`,title:`drone.drone_camera.label`,when:{type:`drone`}},{value:`antenna`,title:`drone.drone_antenna.label`,when:{type:`drone`}},{value:`receiver`,title:`drone.drone_receiver.label`,when:{type:`drone`}},{value:`frame`,title:`drone.contrib.subtype.frame`,when:{type:`drone`}},{value:`rtf`,title:`drone.contrib.subtype.rtf`,when:{type:`drone`}},{value:`accessory`,title:`drone.contrib.subtype.accessory`,when:{type:`drone`}}]}]});export{S as default};
@@ -1 +1 @@
1
- import{n as e}from"./plugin-CFEkHH3f.js";var t=class extends Error{},n=class extends Error{},r=new Map;function i(e){if(!/^[A-Za-z0-9-]+$/.test(e.id))throw Error(`[dav] source id '${e.id}': letters, digits and '-' only`);if(r.has(e.id))throw Error(`[dav] source '${e.id}' already registered`);r.set(e.id,e)}function a(e){r.delete(e)}function o(){return[...r.values()]}var s=e({id:`dav`,version:`1.0.0`,dependsOn:[]});export{n as NotFound,t as PreconditionFailed,s as default,o as listCalendarSources,i as registerCalendarSource,a as unregisterCalendarSource};
1
+ import{n as e}from"./plugin-Cjr7lgQH.js";var t=class extends Error{},n=class extends Error{},r=new Map;function i(e){if(!/^[A-Za-z0-9-]+$/.test(e.id))throw Error(`[dav] source id '${e.id}': letters, digits and '-' only`);if(r.has(e.id))throw Error(`[dav] source '${e.id}' already registered`);r.set(e.id,e)}function a(e){r.delete(e)}function o(){return[...r.values()]}var s=e({id:`dav`,version:`1.0.0`,dependsOn:[],label:`dav.plugin.label`,description:`dav.plugin.description`});export{n as NotFound,t as PreconditionFailed,s as default,o as listCalendarSources,i as registerCalendarSource,a as unregisterCalendarSource};
@@ -0,0 +1 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{a as t}from"./shelf-Cj_pNvd-.js";import{i as n,n as r}from"./plugin-Cjr7lgQH.js";import{t as i}from"./settings-Bo5IOwVg.js";var a=t({shelf:`bus_route`,library:`transit`,label:`transit.bus_route.label`,icon:`lucide:bus`,views:{list:[`route_number`,`from`,`to`]},fields:{name:e.title({label:`core.fields.name`}),route:e.stats({fields:{route_number:e.int({label:`transit.bus_route.fields.route_number`}),from:e.string({label:`transit.bus_route.fields.from`,rules:{max:100}}),to:e.string({label:`transit.bus_route.fields.to`,rules:{max:100}}),stop:e.string({label:`transit.bus_route.fields.stop`,rules:{max:200}})}}),hairline:e.divider({}),description:e.text({label:`transit.bus_route.fields.description`,rules:{max:1e3}}),weekday_times:e.timetable({label:`transit.bus_route.fields.weekday_times`,ui:{span:12}}),saturday_times:e.timetable({label:`transit.bus_route.fields.saturday_times`,ui:{span:6}}),sunday_times:e.timetable({label:`transit.bus_route.fields.sunday_times`,ui:{span:6}}),tags:e.tags({label:`transit.bus_route.fields.tags`}),notes:e.text({label:`transit.bus_route.fields.notes`,rules:{max:500}})}}),o=r({id:`transit`,version:`1.0.0`,dependsOn:[],label:`transit.plugin.label`,description:`transit.plugin.description`,libraries:[{meta:n({id:`transit`,label:`transit.library.label`,icon:`lucide:bus`,agent:{description:`Local bus routes and their departure schedules (bus_route).`,instructions:`bus_route: weekday_times/saturday_times/sunday_times — departure schedule. When the schedule changes, update *_times via update_record.`},starterHint:`the next departures on the saved routes`}),shelves:[a]}],settings:i({label:`transit.settings.label`,fields:{caldav_calendar:e.string({label:`transit.settings.caldav_calendar`}),caldav_url:e.string({label:`transit.settings.caldav_url`}),caldav_username:e.string({label:`transit.settings.caldav_username`}),caldav_password:e.password({label:`transit.settings.caldav_password`})}})});export{o as default};
@@ -0,0 +1 @@
1
+ import{D as e,N as t,R as n,j as r,k as i,n as a,r as o,w as s}from"./fields-CV3RQg0Y.js";import{a as c}from"./shelf-Cj_pNvd-.js";import{i as l,n as u}from"./plugin-Cjr7lgQH.js";import{t as d}from"./extend-yQ8zoqGc.js";import{i as f}from"./ical-FRtCagm-.js";function p(a){if(a.multiple)throw Error("cal.recurrence: `multiple` is not supported — a record holds one series");let o=s(a),c=n().superRefine((e,n)=>{f(e)&&n.addIssue({code:t.custom,message:r(`pattern`,{messageKey:`calendar.validation.rrule`})})});return e(void 0,o,{kind:`recurrence`,label:o.label??``,prim:`recurrence`,column:`text`,hints:{...a.exdates?{exdates:a.exdates}:{},...a.overrides?{overrides:a.overrides}:{},...a.allDay?{allDay:a.allDay}:{}},zod:i(c)})}var m={recurrence:p},h=c({shelf:`entry`,library:`calendar`,label:`calendar.entry.label`,icon:`lucide:calendar-days`,agent:"An event or a task on the household calendar. `type` decides which: an event has a start and an end in `when`; a task has its due date in `when.until` and priority/percent/completed in its task_details extend. Recurrence is an RRULE in `recurrence` with exceptions in `exdates`; a per-instance change is a separate record with `master` = the series and `recurrenceId` = the instance it replaces. The shelf is served to phones over CalDAV at /dav/calendars/entry/. Leave `uid` and `ics` alone: they belong to the sync.",views:{listKind:`calendar-ilamy`,list:[`when`,`type`,`location`,`status`],inline:[`summary`,`when`],groupBy:[`type`,`status`],defaultGroupBy:`type`},fields:{summary:a.title({label:`calendar.entry.fields.summary`}),description:a.text({label:`calendar.entry.fields.description`,rules:{max:5e3}}),when:a.period({label:`calendar.entry.fields.when`,rules:{granularity:`datetime`}}),allDay:a.boolean({label:`calendar.entry.fields.allDay`}),location:a.string({label:`calendar.entry.fields.location`,rules:{max:300}}),recurrence:m.recurrence({label:`calendar.entry.fields.recurrence`,exdates:`exdates`,overrides:{master:`master`,at:`recurrenceId`},allDay:`allDay`}),exdates:a.datetime({label:`calendar.entry.fields.exdates`,multiple:!0}),master:a.relation({label:`calendar.entry.fields.master`,options:o({library:`calendar`,shelf:`entry`})}),recurrenceId:a.datetime({label:`calendar.entry.fields.recurrenceId`}),type:a.string({label:`core.fields.type`,strict:!0,noSearch:!0,default:`event`,options:[{value:`event`,title:`calendar.entry.options.type.event`},{value:`task`,title:`calendar.entry.options.type.task`}]}),status:a.string({label:`calendar.entry.fields.status`,strict:!0,noSearch:!0,options:[{value:`tentative`,title:`calendar.entry.options.status.tentative`,when:{type:`event`}},{value:`confirmed`,title:`calendar.entry.options.status.confirmed`,when:{type:`event`}},{value:`needs-action`,title:`calendar.entry.options.status.needs_action`,when:{type:`task`}},{value:`in-process`,title:`calendar.entry.options.status.in_process`,when:{type:`task`}},{value:`completed`,title:`calendar.entry.options.status.completed`,when:{type:`task`}},{value:`cancelled`,title:`calendar.entry.options.status.cancelled`}]}),uid:a.string({label:`calendar.entry.fields.uid`,rules:{max:255},ui:{emphasis:`muted`}}),ics:a.source({label:`calendar.entry.fields.ics`,rules:{ext:`ics`},ui:{emphasis:`muted`}}),tags:a.tags({label:`calendar.entry.fields.tags`}),notes:a.text({label:`calendar.entry.fields.notes`,rules:{max:2e3}})}}),g=d({id:`task_details`,label:`calendar.task_details.label`,icon:`lucide:check-square`,attachTo:[{library:`calendar`,shelf:`entry`}],showWhen:{type:`task`},fields:{priority:a.int({label:`calendar.task_details.fields.priority`,rules:{min:0,max:9}}),percent:a.percent({label:`calendar.task_details.fields.percent`}),completed:a.datetime({label:`calendar.task_details.fields.completed`})}}),_=u({id:`calendar`,version:`1.0.0`,dependsOn:[`dav`],label:`calendar.plugin.label`,description:`calendar.plugin.description`,libraries:[{meta:l({id:`calendar`,label:`calendar.library.label`,icon:`lucide:calendar-days`,agent:`The household calendar: events and tasks, also served to phones over CalDAV.`}),shelves:[h]}],extends_:[g]});export{m as n,p as r,_ as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{n as t}from"./plugin-Cjr7lgQH.js";import{t as n}from"./settings-Bo5IOwVg.js";var r=t({id:`http`,version:`1.0.0`,dependsOn:[],label:`http.plugin.label`,description:`http.plugin.description`,settings:n({label:`http.settings.label`,fields:{port:e.int({label:`http.settings.port`})}})});export{r as default};
@@ -0,0 +1,6 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{a as t}from"./shelf-Cj_pNvd-.js";import{i as n,n as r}from"./plugin-Cjr7lgQH.js";function i(e,t){if(typeof e!=`string`||!e)return null;let n=Number(t);if(!Number.isFinite(n)||n<=0)return null;let r=Date.parse(e);return Number.isNaN(r)?null:new Date(r+n*864e5).toISOString().slice(0,10)}var a=(e,t)=>({record:n})=>i(n[e],n[t]),o=t({shelf:`plant`,library:`garden`,label:`garden.plant.label`,icon:`lucide:sprout`,agent:`A houseplant. title — name. variety — cultivar/subspecies. location — where it stands.
2
+ wateringDays — watering interval (days). lastWatered — date of last watering.
3
+ fertilizerDays — fertilizing interval. lastFertilized — last date.
4
+ planted — date planted/acquired.
5
+ nextWatering/nextFertilizing are COMPUTED by the server (last date + interval) and rejected on write:
6
+ to move them, write lastWatered/lastFertilized.`,views:{list:[`variety`,`location`,`wateringDays`,`lastWatered`]},fields:{name:e.title({label:`core.fields.name`}),due:e.stats({fields:{nextWatering:e.reminder({label:`garden.plant.fields.nextWatering`,rules:{lead:3},value:a(`lastWatered`,`wateringDays`)}),nextFertilizing:e.reminder({label:`garden.plant.fields.nextFertilizing`,rules:{lead:7},value:a(`lastFertilized`,`fertilizerDays`)}),planted:e.date({label:`garden.plant.fields.planted`,rules:{min:`2000-01-01`,max:`today`}})}}),hairline:e.divider({}),specimen:e.specimen({title:{variety:e.string({label:`garden.plant.fields.variety`,rules:{max:100}})},subtitle:{location:e.string({label:`garden.plant.fields.location`,strict:!0,noSearch:!0,options:[{value:`windowsill`,title:`garden.plant.options.location.windowsill`},{value:`balcony`,title:`garden.plant.options.location.balcony`},{value:`hanging`,title:`garden.plant.options.location.hanging`},{value:`floor`,title:`garden.plant.options.location.floor`},{value:`other`,title:`garden.plant.options.location.other`}]})},conditions:{sunlight:e.string({label:`garden.plant.fields.sunlight`,strict:!0,noSearch:!0,options:[{value:`shade`,title:`garden.plant.options.sunlight.shade`},{value:`partial`,title:`garden.plant.options.sunlight.partial`},{value:`indirect`,title:`garden.plant.options.sunlight.indirect`},{value:`direct`,title:`garden.plant.options.sunlight.direct`}]}),pot:e.string({label:`garden.plant.fields.pot`,rules:{max:100}})}}),about:e.illustrated({label:`garden.plant.fields.about`,fields:{image:e.avatar({}),text:e.text({rules:{max:1e3}})}}),watering:e.grid({columns:3,fields:{button:e.button({label:`garden.plant.actions.watered`,value:`garden.watered`,icon:`lucide:droplet`}),lastWatered:e.date({label:`garden.plant.fields.lastWatered`,rules:{max:`today`},mutate:[`nextWatering`]}),wateringDays:e.int({label:`garden.plant.fields.wateringDays`,rules:{min:1,max:365},mutate:[`nextWatering`]})}}),feeding:e.grid({columns:3,fields:{button2:e.button({label:`garden.plant.actions.fertilized`,value:`garden.fertilized`,icon:`lucide:flask-conical`}),lastFertilized:e.date({label:`garden.plant.fields.lastFertilized`,rules:{max:`today`},mutate:[`nextFertilizing`]}),fertilizerDays:e.int({label:`garden.plant.fields.fertilizerDays`,rules:{min:1,max:365},mutate:[`nextFertilizing`]})}}),photos:e.image({label:`garden.plant.fields.photos`,multiple:!0}),tags:e.tags({label:`garden.plant.fields.tags`}),notes:e.text({label:`garden.plant.fields.notes`,rules:{max:500}})}}),s=r({id:`garden`,version:`1.0.0`,dependsOn:[`things`],label:`garden.plugin.label`,description:`garden.plugin.description`,libraries:[{meta:n({id:`garden`,label:`garden.library.label`,icon:`lucide:sprout`,agent:{description:`Garden plants (plant) — watering and fertilizing schedule.`,instructions:`To find what needs watering — compare nextWatering with today. When watered/fertilized — update lastWatered/lastFertilized via update_record; nextWatering/nextFertilizing are computed by the server from those dates and the interval, and are rejected if you write them.`},starterHint:`plants due for watering or fertilizing`}),shelves:[o]}],fieldContribs:[{library:`things`,shelf:`item`,field:`type`,options:[{value:`garden`,title:`garden.contrib.type.garden`}]}]});export{s as default};
@@ -0,0 +1 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{a as t}from"./shelf-Cj_pNvd-.js";import{i as n,n as r}from"./plugin-Cjr7lgQH.js";import{t as i}from"./settings-Bo5IOwVg.js";var a=t({shelf:`title`,library:`media`,label:`media.title.label`,icon:`lucide:clapperboard`,agent:`A movie or series in the watchlist. name — the title. kind — movie/series. status — viewing intent (want=added to the list, not in Jellyfin yet / unwatched=in Jellyfin, not watched / watching / watched / dropped). in_library, jellyfin_id and source are mirrored from Jellyfin — do not edit manually when source=jellyfin (sync will overwrite).`,views:{list:[`kind`,`status`,`year`,`imdb_rating`],groupBy:[`kind`,`status`,`genres`,`year`,`source`]},fields:{name:e.title({label:`core.fields.name`}),about:e.illustrated({label:`media.title.fields.about`,fields:{image:e.poster({}),text:e.text({rules:{max:2e3}})}}),runtime:e.duration({label:`media.title.fields.runtime`,ui:{span:4}}),seasons:e.int({label:`media.title.fields.seasons`,rules:{min:0},ui:{span:4}}),episodes:e.int({label:`media.title.fields.episodes`,rules:{min:0},ui:{span:4}}),link:e.link({label:`media.title.fields.link`,ui:{span:6}}),jellyfin_id:e.link({label:`media.title.fields.jellyfin_id`,rules:{max:300},ui:{span:6}}),scores:e.score({label:`media.title.fields.scores`,max:10,source:{tmdb_rating:e.real({label:`media.title.fields.tmdb_rating`}),imdb_rating:e.real({label:`media.title.fields.imdb_rating`})}}),properties:e.properties({columns:3,fields:{kind:e.string({label:`media.title.fields.kind`,strict:!0,noSearch:!0,ui:{span:4},options:[{value:`movie`,title:`media.title.options.kind.movie`},{value:`series`,title:`media.title.options.kind.series`}]}),year:e.int({label:`media.title.fields.year`,ui:{span:4}}),status:e.string({label:`media.title.fields.status`,strict:!0,noSearch:!0,ui:{span:4},options:[{value:`want`,title:`media.title.options.status.want`},{value:`unwatched`,title:`media.title.options.status.unwatched`},{value:`watching`,title:`media.title.options.status.watching`},{value:`watched`,title:`media.title.options.status.watched`},{value:`dropped`,title:`media.title.options.status.dropped`}]}),watched_date:e.date({label:`media.title.fields.watched_date`,ui:{span:4}}),in_library:e.boolean({label:`media.title.fields.in_library`,ui:{span:4}}),tmdb_id:e.identifier({label:`media.title.fields.tmdb_id`,rules:{max:32},ui:{span:4}}),imdb_id:e.identifier({label:`media.title.fields.imdb_id`,rules:{max:32},ui:{span:4}}),source:e.string({label:`media.title.fields.source`,default:`manual`,strict:!0,noSearch:!0,ui:{span:4},options:[{value:`manual`,title:`media.title.options.source.manual`},{value:`jellyfin`,title:`media.title.options.source.jellyfin`},{value:`agent`,title:`media.title.options.source.agent`}]})}}),genres:e.tags({label:`media.title.fields.genres`}),notes:e.text({label:`media.title.fields.notes`,rules:{max:2e3}})}}),o=r({id:`media`,version:`1.0.0`,dependsOn:[],label:`media.plugin.label`,description:`media.plugin.description`,libraries:[{meta:n({id:`media`,label:`media.library.label`,icon:`lucide:clapperboard`,agent:{description:`Movies and series watchlist (title) — tracked against a Jellyfin library.`,instructions:`status: want=added to the list, not in Jellyfin yet; unwatched=in Jellyfin, not watched; watching; watched; dropped. in_library, jellyfin_id and source are mirrored from Jellyfin — do not edit manually when source=jellyfin. To add a movie by name — search_titles (review candidates) then add_title.`}}),shelves:[a]}],settings:i({label:`media.settings.label`,fields:{tmdb_key:e.password({label:`media.settings.tmdb_key`}),omdb_key:e.password({label:`media.settings.omdb_key`}),jellyfin_url:e.string({label:`media.settings.jellyfin_url`}),jellyfin_token:e.password({label:`media.settings.jellyfin_token`}),jellyfin_user_id:e.string({label:`media.settings.jellyfin_user_id`}),button:e.button({label:`media.settings.test_button`,value:`media.testJellyfin`,icon:`lucide:wifi`}),button2:e.button({label:`media.settings.sync_button`,value:`media.syncJellyfin`,icon:`lucide:refresh-cw`})}})});export{o as default};
@@ -0,0 +1 @@
1
+ import{n as e,r as t,t as n}from"./src-DgQcfYnz.js";export{e as cal,n as default,t as recurrence};
@@ -0,0 +1 @@
1
+ import{_ as e,n as t,r as n}from"./fields-CV3RQg0Y.js";import{a as r}from"./shelf-Cj_pNvd-.js";import{i,n as a}from"./plugin-Cjr7lgQH.js";import{t as o}from"./extend-yQ8zoqGc.js";import{t as s}from"./settings-Bo5IOwVg.js";var c=new Map(e.map((e,t)=>[e.value,t])),l=864e5,u=7;function d(e){let t=[0,0,0,0,0,0,0];if(!Array.isArray(e))return t;for(let n of e){let e=n?.value;if(Array.isArray(e))for(let n of e){let e=n,r=typeof e?.day==`string`?c.get(e.day):void 0;if(r===void 0)continue;let i=Number(e?.value);Number.isFinite(i)&&i>0&&(t[r]=t[r]+i)}}return t}function f(){return new Date().toISOString().slice(0,10)}var p=e=>String(e).padStart(2,`0`);function m(e){let t=e instanceof Date?`${e.getFullYear()}-${p(e.getMonth()+1)}-${p(e.getDate())}`:typeof e==`string`?e.slice(0,10):null;if(t===null||!/^\d{4}-\d{2}-\d{2}$/.test(t))return null;let n=Date.parse(t);return Number.isNaN(n)?null:n}function h(e,t,n){let r=Math.round((n-t)/l);if(!Number.isFinite(r)||r<=0)return 0;let i=e.reduce((e,t)=>e+t,0),a=Math.floor(r/u)*i,o=(new Date(t).getUTCDay()+6)%u;for(let t=1;t<=r%u;t++)a+=e[(o+t)%u];return a}function g(e,t,n,r){let i=Number(e);if(!Number.isFinite(i))return null;let a=d(t),o=a.reduce((e,t)=>e+t,0);if(o<=0)return null;let s=m(n),c=m(r),l=s===null||c===null?0:h(a,s,c),f=Math.max(0,i-l);return Math.floor(f/(o/u))}function _(e){return typeof e!=`number`||!Number.isFinite(e)?null:e<=0?`out`:e<7?`low`:`enough`}var v=({record:e})=>g(e.quantity,e.dose,e.quantityCheckedAt,f()),y=r({shelf:`medicine`,library:`health`,label:`health.medicine.label`,icon:`lucide:pill`,views:{list:[`type`,`form`,`quantity`]},fields:{name:t.title({label:`core.fields.name`}),stock:t.stats({fields:{quantity:t.int({label:`health.medicine.fields.quantity`,rules:{min:0,max:1e5},mutate:[`daysLeft`,`quantityCheckedAt`]}),meter:t.meter({source:{daysLeft:t.int({label:`health.medicine.fields.daysLeft`,value:v,cache:3600,mutate:[`supply_state`]})},min:0,max:30}),status:t.status({source:{supply_state:t.string({label:`health.medicine.fields.supply_state`,options:[{value:`enough`,title:`health.medicine.options.supply_state.enough`,icon:{kind:`icon`,value:`lucide:check`},tone:`success`},{value:`low`,title:`health.medicine.options.supply_state.low`,icon:{kind:`icon`,value:`lucide:minus`},tone:`warning`},{value:`out`,title:`health.medicine.options.supply_state.out`,icon:{kind:`icon`,value:`lucide:x`},tone:`danger`}],value:e=>_(v(e)),cache:3600,strict:!0,noSearch:!0})}}),countdown:t.countdown({source:{quantityCheckedAt:t.date({label:`health.medicine.fields.quantityCheckedAt`,value:e=>e.now.slice(0,10),mutate:[`daysLeft`]})},caption:`units.days`})}}),hairline:t.divider({}),about:t.illustrated({label:`health.medicine.fields.about`,fields:{image:t.image({}),text:t.text({rules:{max:1e3}})}}),photos:t.image({label:`health.medicine.fields.photos`,multiple:!0}),dose:t.keyed({label:`health.medicine.fields.dose`,icon:`lucide:pill`,fields:{person:t.relation({label:`health.medicine.fields.dose_person`,options:n({library:`people`,shelf:`person`})}),value:t.perWeekday({label:`health.medicine.fields.dose_value`,rules:{min:0,max:20,step:.5},mutate:[`daysLeft`]})},by:`person`}),intakeTimes:t.string({label:`health.medicine.fields.intakeTimes`,options:`day-periods`,multiple:!0,strict:!0,noSearch:!0}),intakePeriods:t.period({label:`health.medicine.fields.intakePeriods`,multiple:!0}),properties:t.properties({columns:2,fields:{type:t.string({label:`core.fields.type`,strict:!0,noSearch:!0,ui:{span:6},options:[{value:`vitamin`,title:`health.medicine.options.type.vitamin`},{value:`supplement`,title:`health.medicine.options.type.supplement`},{value:`medication`,title:`health.medicine.options.type.medication`},{value:`antibiotic`,title:`health.medicine.options.type.antibiotic`},{value:`hormone`,title:`health.medicine.options.type.hormone`},{value:`painkiller`,title:`health.medicine.options.type.painkiller`},{value:`homeopathy`,title:`health.medicine.options.type.homeopathy`},{value:`herbal`,title:`health.medicine.options.type.herbal`}]}),form:t.string({label:`health.medicine.fields.form`,strict:!0,noSearch:!0,ui:{span:6},options:[{value:`tablet`,title:`health.medicine.options.form.tablet`},{value:`capsule`,title:`health.medicine.options.form.capsule`},{value:`syrup`,title:`health.medicine.options.form.syrup`},{value:`drops`,title:`health.medicine.options.form.drops`},{value:`ointment`,title:`health.medicine.options.form.ointment`},{value:`gel`,title:`health.medicine.options.form.gel`},{value:`spray`,title:`health.medicine.options.form.spray`},{value:`injection`,title:`health.medicine.options.form.injection`},{value:`powder`,title:`health.medicine.options.form.powder`},{value:`suppository`,title:`health.medicine.options.form.suppository`}]})}}),purchase:t.group({label:`health.medicine.groups.purchase`,icon:`lucide:shopping-cart`,scope:`hoist`,fields:{link:t.link({label:`health.medicine.fields.link`,ui:{span:12}}),store:t.relation({label:`health.medicine.fields.store`,options:n({library:`things`,shelf:`store`}),ui:{span:6}}),orderNumber:t.string({label:`health.medicine.fields.orderNumber`,rules:{max:100},ui:{span:6}}),purchaseDate:t.date({label:`health.medicine.fields.purchaseDate`,ui:{span:4}}),purchasePrice:t.money({label:`health.medicine.fields.purchasePrice`,ui:{span:4}}),currency:t.currency({label:`core.fields.currency`,default:`UAH`,ui:{span:4}})}}),notes:t.text({label:`health.medicine.fields.notes`,rules:{max:2e3}})}}),b=r({shelf:`health_visit`,library:`health`,label:`health.health_visit.label`,icon:`lucide:stethoscope`,views:{list:[`date`,`person`,`specialty`]},fields:{name:t.title({label:`core.fields.name`}),description:t.text({label:`health.health_visit.fields.description`,rules:{max:1e3}}),timeline:t.timeline({fields:{date:t.date({label:`health.health_visit.fields.date`}),nextVisit:t.reminder({label:`health.health_visit.fields.nextVisit`,rules:{lead:14}})}}),reason:t.text({label:`health.health_visit.fields.reason`,rules:{max:1e3}}),result:t.text({label:`health.health_visit.fields.result`,rules:{max:2e3}}),next_step:t.text({label:`health.health_visit.fields.next_step`,rules:{max:1e3}}),specialist:t.string({label:`health.health_visit.fields.specialist`,rules:{max:200},ui:{span:4}}),specialty:t.string({label:`health.health_visit.fields.specialty`,rules:{max:100},ui:{span:4}}),clinic:t.string({label:`health.health_visit.fields.clinic`,rules:{max:200},ui:{span:4}}),cost:t.money({label:`health.health_visit.fields.cost`,ui:{span:3}}),currency:t.currency({label:`core.fields.currency`,default:`UAH`,ui:{span:3}}),medicines:t.relation({label:`health.health_visit.fields.medicines`,options:n({library:`health`,shelf:`medicine`}),multiple:!0,ui:{span:6}}),people:t.people({source:{person:t.relation({label:`health.health_visit.fields.person`,options:n({library:`people`,shelf:`person`})})}}),files:t.file({label:`health.health_visit.fields.files`,multiple:!0}),photos:t.image({label:`health.health_visit.fields.photos`,multiple:!0}),notes:t.text({label:`health.health_visit.fields.notes`,rules:{max:2e3}})}}),x=r({shelf:`health_test`,library:`health`,label:`health.health_test.label`,icon:`lucide:flask-conical`,views:{list:[`date`,`person`,`status`]},fields:{name:t.title({label:`core.fields.name`}),description:t.text({label:`health.health_test.fields.description`,rules:{max:1e3}}),date:t.date({label:`health.health_test.fields.date`,ui:{span:4}}),clinic:t.string({label:`health.health_test.fields.clinic`,rules:{max:200},ui:{span:4}}),person:t.relation({label:`health.health_test.fields.person`,options:n({library:`people`,shelf:`person`}),ui:{span:4}}),indicators:t.assay({label:`health.health_test.fields.indicators`,icon:`lucide:activity`,analyte:`analyte`,value:`value`,unit:`unit`,low:`low`,high:`high`,source:{indicators:t.group({scope:`nest`,multiple:!0,fields:{analyte:t.string({label:`health.health_test.fields.analyte`,rules:{max:100}}),value:t.real({label:`health.health_test.fields.value`}),unit:t.string({label:`health.health_test.fields.unit`,rules:{max:20}}),low:t.real({label:`health.health_test.fields.low`}),high:t.real({label:`health.health_test.fields.high`})}})}}),result:t.text({label:`health.health_test.fields.result`,rules:{max:5e3}}),attachments:t.image({label:`health.health_test.fields.attachments`,multiple:!0}),properties:t.properties({columns:2,fields:{status:t.string({label:`health.health_test.fields.status`,strict:!0,noSearch:!0,ui:{span:6},options:[{value:`ordered`,title:`health.health_test.options.status.ordered`},{value:`completed`,title:`health.health_test.options.status.completed`},{value:`cancelled`,title:`health.health_test.options.status.cancelled`}]}),test_type:t.string({label:`health.health_test.fields.test_type`,strict:!0,noSearch:!0,ui:{span:6},options:[{value:`blood`,title:`health.health_test.options.test_type.blood`},{value:`urine`,title:`health.health_test.options.test_type.urine`},{value:`ultrasound`,title:`health.health_test.options.test_type.ultrasound`},{value:`xray`,title:`health.health_test.options.test_type.xray`},{value:`mri`,title:`health.health_test.options.test_type.mri`},{value:`other`,title:`health.health_test.options.test_type.other`}]})}}),notes:t.text({label:`health.health_test.fields.notes`,rules:{max:2e3}})}}),S=o({id:`person_body`,label:`health.person_body.label`,icon:`lucide:ruler`,attachTo:[{library:`people`,shelf:`person`}],agent:`Person's body measurements. weightKg — weight in kg. heightCm — height in cm. bloodGroup — ABO/Rh blood type. allergies — list of allergens.`,fields:{weightKg:t.real({label:`health.person_body.fields.weightKg`,rules:{min:1,max:500}}),heightCm:t.int({label:`health.person_body.fields.heightCm`,rules:{min:50,max:250}}),bloodGroup:t.string({label:`health.person_body.fields.bloodGroup`,strict:!0,noSearch:!0,options:[`O-`,`O+`,`A-`,`A+`,`B-`,`B+`,`AB-`,`AB+`]}),allergies:t.string({label:`health.person_body.fields.allergies`,multiple:!0})}}),C=[{value:`any`,title:`health.dayPeriods.any`},{value:`before_breakfast`,title:`health.dayPeriods.before_breakfast`},{value:`with_breakfast`,title:`health.dayPeriods.with_breakfast`},{value:`after_breakfast`,title:`health.dayPeriods.after_breakfast`},{value:`with_food`,title:`health.dayPeriods.with_food`},{value:`after_lunch`,title:`health.dayPeriods.after_lunch`},{value:`evening`,title:`health.dayPeriods.evening`},{value:`before_bed`,title:`health.dayPeriods.before_bed`},{value:`as_needed`,title:`health.dayPeriods.as_needed`}],w=a({id:`health`,version:`1.0.0`,dependsOn:[`people`,`things`],label:`health.plugin.label`,description:`health.plugin.description`,optionLists:[{name:`day-periods`,options:[...C]}],libraries:[{meta:i({id:`health`,label:`health.library.label`,icon:`lucide:hospital`,agent:{description:`Medical tests, doctor visits, and medicines — each linked to a person.`,instructions:`Records link to a person (relation to people). Count upcoming/overdue visits by the date field. medicine.quantity is a SNAPSHOT dated by medicine.quantityCheckedAt ("this many as of that date"), and daysLeft subtracts everything the dose schedule has consumed since it — so when a medicine is taken or restocked, ALWAYS write quantityCheckedAt (today) in the same update_record call as quantity. Writing quantity alone dates the new count to the old checkpoint and can immediately report the pack as out. After a visit — result/nextVisit.`},starterHint:`appointments coming up, or test results worth revisiting`}),shelves:[y,b,x]}],extends_:[S],settings:s({label:`health.settings.label`,fields:{caldav_calendar:t.string({label:`health.settings.caldav_calendar`}),caldav_url:t.string({label:`health.settings.caldav_url`}),caldav_username:t.string({label:`health.settings.caldav_username`}),caldav_password:t.password({label:`health.settings.caldav_password`}),...Object.fromEntries(C.filter(e=>e.value!==`as_needed`).map(e=>[`time_${e.value}`,t.time({label:`health.settings.time_${e.value}`,rules:{granularity:`minute`}})]))}})});export{w as default};
@@ -0,0 +1 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{n as t}from"./plugin-Cjr7lgQH.js";import{t as n}from"./settings-Bo5IOwVg.js";var r=t({id:`webexport`,version:`1.0.0`,dependsOn:[],label:`webexport.plugin.label`,description:`webexport.plugin.description`,libraries:[],settings:n({label:`webexport.settings.label`,icon:`lucide:folder-output`,fields:{output_dir:e.localDir({label:`webexport.settings.output_dir`})}})});export{r as default};
@@ -0,0 +1 @@
1
+ import{n as e,r as t}from"./fields-CV3RQg0Y.js";import{a as n}from"./shelf-Cj_pNvd-.js";import{i as r,n as i}from"./plugin-Cjr7lgQH.js";var a=(e,t)=>(e??[]).reduce((e,n)=>{let r=n?.[t];return e+(Number(r&&typeof r==`object`?r.value:r)||0)},0),o=e=>e&&typeof e==`object`?e.unit??null:null,s=()=>e.string({options:`cooking`,value:({record:e})=>o(e.quantity),strict:!0}),c=(e,t)=>(e??[]).map(e=>e?.[t]==null?``:String(e[t])).filter(e=>e!==``).sort()[0]??null,l=e=>{let t=e?.value;return typeof t==`number`&&Number.isFinite(t)?t:null},u=n({shelf:`food_item`,library:`kitchen`,label:`kitchen.food_item.label`,icon:`lucide:soup`,agent:'A kitchen product is generic (buckwheat, milk), and its `variants` rows are the actual goods on the shelf. The unit is declared once on the product, inside its stock: `quantity` is written as `{"unit": "<unit>"}` — the unit alone, never a value. Every amount below it — `minQuantity`, each variant row\'s `quantity` — is written as `{"value": <number>}` alone, on that scale. Do NOT send a unit inside those amounts: the server fills it in from the product\'s `quantity.unit` and discards anything you put there. Reads hand them back as `{"value": …, "unit": …}`, which you may echo unchanged. The `value` of the product\'s `quantity`, and `expires`, are computed from the variants and MUST NOT be written — to record a purchase or a write-off, change the `quantity` of the relevant variant row, or add a variant row for a good that is not there yet. A variant with quantity 0 means "this good is known, none in stock" and is a shopping-list candidate, so do not delete it.',views:{list:[`subcategory`,`quantity`,`expires`]},fields:{name:e.title({label:`core.fields.name`}),stock:e.stats({fields:{quantity:e.measured({label:`kitchen.food_item.fields.quantity`,units:`cooking`,rules:{min:0},fields:{value:e.real({value:({record:e})=>a(e.variants,`quantity`),mutate:[`stockState`]}),unit:e.string({options:`cooking`,strict:!0,mutate:[`minQuantity.unit`,`variants.quantity.unit`]})}}),status:e.status({source:{stockState:e.string({label:`kitchen.food_item.fields.stockState`,value:({record:e})=>{let t=l(e.minQuantity);return t==null?`ok`:(l(e.quantity)??0)<t?`low`:`ok`},strict:!0,noSearch:!0,options:[{value:`ok`,title:`kitchen.food_item.options.stockState.ok`,tone:`success`},{value:`low`,title:`kitchen.food_item.options.stockState.low`,tone:`danger`}]})}}),minQuantity:e.measured({label:`kitchen.food_item.fields.minQuantity`,units:`cooking`,rules:{min:0},fields:{unit:s(),value:e.real({rules:{min:0},mutate:[`stockState`]})}}),expires:e.reminder({label:`kitchen.food_item.fields.expires`,rules:{lead:14},value:({record:e})=>c(e.variants,`expires`)})}}),hairline:e.divider({}),about:e.illustrated({label:`kitchen.food_item.fields.about`,fields:{image:e.avatar({}),text:e.text({rules:{max:1e3}})}}),photos:e.image({label:`kitchen.food_item.fields.photos`,multiple:!0}),variants:e.row({scope:`nest`,multiple:!0,label:`kitchen.food_item.fields.variants`,icon:`lucide:package`,fields:{name:e.string({label:`kitchen.food_item.variant.name`,rules:{max:200}}),quantity:e.measured({label:`kitchen.food_item.variant.quantity`,units:`cooking`,rules:{min:0},fields:{unit:s(),value:e.real({rules:{min:0},mutate:[`quantity.value`]})}}),expires:e.reminder({label:`kitchen.food_item.variant.expires`,rules:{lead:14},mutate:[`expires`]}),location:e.relation({label:`kitchen.food_item.variant.location`,options:t({library:`things`,shelf:`storage_location`})}),shops:e.link({label:`kitchen.food_item.variant.shops`,multiple:!0}),photo:e.image({label:`kitchen.food_item.variant.photo`})}}),subcategory:e.string({label:`kitchen.food_item.fields.subcategory`,rules:{max:100}}),tags:e.tags({label:`kitchen.food_item.fields.tags`}),notes:e.text({label:`kitchen.food_item.fields.notes`,rules:{max:2e3}})}}),d=async({ref:e})=>{let t=(await e?.(`product`))?.quantity;return t&&typeof t==`object`?t.unit??null:null},f=e=>{let t=e?.value;return typeof t==`number`&&Number.isFinite(t)?t:null},p=async({ref:e})=>(await e?.(`product`))?.quantity??null,m=n({shelf:`food_recipe`,library:`kitchen`,label:`kitchen.food_recipe.label`,icon:`lucide:clipboard-list`,views:{list:[`category`,`description`,`prep_time`,`cook_time`]},fields:{name:e.title({label:`core.fields.name`}),cooking:e.stats({fields:{status:e.status({source:{readiness:e.string({label:`kitchen.food_recipe.fields.readiness`,value:({record:e})=>(e.ingredients??[]).filter(e=>!e.optional).every(e=>e.stock_state===`enough`)?`ready`:`not_ready`,strict:!0,noSearch:!0,options:[{value:`ready`,title:`kitchen.food_recipe.options.readiness.ready`,tone:`success`},{value:`not_ready`,title:`kitchen.food_recipe.options.readiness.not_ready`,tone:`danger`}]})}}),servings:e.int({label:`kitchen.food_recipe.fields.servings`,rules:{min:1,max:100}}),prep_time:e.duration({label:`kitchen.food_recipe.fields.prep_time`}),cook_time:e.duration({label:`kitchen.food_recipe.fields.cook_time`})}}),hairline:e.divider({}),description:e.text({label:`kitchen.food_recipe.fields.description`,rules:{max:500}}),images:e.image({label:`kitchen.food_recipe.fields.images`,multiple:!0}),ingredients:e.row({scope:`nest`,multiple:!0,label:`kitchen.food_recipe.fields.ingredients`,icon:`lucide:carrot`,rules:{unique:[`product`]},fields:{product:e.relation({label:`kitchen.food_recipe.ingredient.product`,options:t({library:`kitchen`,shelf:`food_item`})}),amount:e.measured({label:`kitchen.food_recipe.ingredient.amount`,units:`cooking`,rules:{min:0},fields:{unit:e.string({options:`cooking`,value:d,strict:!0,cache:0}),value:e.real({rules:{min:0},mutate:[`.stock_state`]})}}),optional:e.boolean({label:`kitchen.food_recipe.ingredient.optional`,mutate:[`readiness`]}),stock:e.measured({label:`kitchen.food_recipe.ingredient.stock`,units:`cooking`,cache:0,value:p}),stock_state:e.string({label:`kitchen.food_recipe.ingredient.stock_state`,cache:0,value:async e=>{let t=f(await p(e));if(t==null)return null;let n=f(e.parent?.amount);return n==null?t>0?null:`missing`:t>=n?`enough`:t>0?`partial`:`missing`},mutate:[`readiness`],strict:!0,noSearch:!0,options:[{value:`enough`,title:`kitchen.food_recipe.options.stock_state.enough`,icon:{kind:`icon`,value:`lucide:check`},tone:`success`},{value:`partial`,title:`kitchen.food_recipe.options.stock_state.partial`,icon:{kind:`icon`,value:`lucide:minus`},tone:`danger`},{value:`missing`,title:`kitchen.food_recipe.options.stock_state.missing`,icon:{kind:`icon`,value:`lucide:x`},tone:`danger`}]})}}),ingredients_free:e.row({scope:`nest`,multiple:!0,label:`kitchen.food_recipe.fields.ingredients_free`,icon:`lucide:list`,rules:{unique:[`product`]},fields:{product:e.string({label:`kitchen.food_recipe.ingredient_free.product`,rules:{max:200}}),unit:e.unit({label:`kitchen.food_recipe.ingredient_free.unit`,options:`cooking`}),amount:e.amount({label:`kitchen.food_recipe.ingredient_free.amount`,unitFrom:`unit`,rules:{min:0}}),optional:e.boolean({label:`kitchen.food_recipe.ingredient_free.optional`})}}),prose:e.prose({label:`kitchen.food_recipe.fields.steps`,icon:`lucide:chef-hat`,fields:{steps:e.markdown({label:`kitchen.food_recipe.fields.steps_body`,rules:{max:5e3}})}}),properties:e.properties({columns:2,fields:{category:e.string({label:`kitchen.food_recipe.fields.category`,multiple:!0,strict:!0,noSearch:!0,ui:{span:6},options:[{value:`first`,title:`kitchen.food_recipe.options.category.first`},{value:`main`,title:`kitchen.food_recipe.options.category.main`},{value:`salad`,title:`kitchen.food_recipe.options.category.salad`},{value:`appetizer`,title:`kitchen.food_recipe.options.category.appetizer`},{value:`side`,title:`kitchen.food_recipe.options.category.side`},{value:`dessert`,title:`kitchen.food_recipe.options.category.dessert`},{value:`drink`,title:`kitchen.food_recipe.options.category.drink`},{value:`sauce`,title:`kitchen.food_recipe.options.category.sauce`}]}),difficulty:e.string({label:`kitchen.food_recipe.fields.difficulty`,strict:!0,noSearch:!0,ui:{span:6},options:[{value:`easy`,title:`kitchen.food_recipe.options.difficulty.easy`},{value:`medium`,title:`kitchen.food_recipe.options.difficulty.medium`},{value:`hard`,title:`kitchen.food_recipe.options.difficulty.hard`}]})}}),tags:e.tags({label:`kitchen.food_recipe.fields.tags`}),notes:e.text({label:`kitchen.food_recipe.fields.notes`,rules:{max:1e3}})}}),h=n({shelf:`preferences`,library:`kitchen`,label:`kitchen.preferences.label`,icon:`lucide:notebook-pen`,single:!0,agent:`One record. The household food habits, diets and allergies; where groceries are bought, what is bought there and in what volumes; which kitchen appliances exist and which do not. Read it before suggesting recipes, building a shopping list, or planning a menu. An appliance listed as absent is a fact, not a gap — do not propose recipes that need it.`,fields:{preferences:e.markdown({label:`kitchen.preferences.fields.preferences`,rules:{max:1e4}}),shops:e.markdown({label:`kitchen.preferences.fields.shops`,rules:{max:1e4}}),equipment:e.markdown({label:`kitchen.preferences.fields.equipment`,rules:{max:1e4}}),notes:e.text({label:`kitchen.preferences.fields.notes`,rules:{max:1e4}})}}),g=i({id:`kitchen`,version:`1.0.0`,dependsOn:[`things`],label:`kitchen.plugin.label`,description:`kitchen.plugin.description`,libraries:[{meta:r({id:`kitchen`,label:`kitchen.library.label`,icon:`lucide:cooking-pot`,agent:{description:`Food inventory and recipes — what is in stock, what is expiring, what can be cooked.`,instructions:`Read kitchen/preferences before creating, merging or renaming a product: it records how this household splits products from variants, which units each family of goods uses, and why. It governs — these rules are the mechanics, that record is the intent.`},starterHint:`what's expiring soon, or what can be cooked from what's in stock`}),shelves:[u,m,h]}],fieldContribs:[{library:`things`,shelf:`item`,field:`type`,options:[{value:`kitchenware`,title:`kitchen.contrib.type.kitchenware`}]}]});export{g as default};
@@ -1,8 +1,8 @@
1
- import{D as e,M as t,P as n,W as r,k as i,n as a,r as o}from"./fields-GPyF03tK.js";import{s}from"./shelf-CpE68_8d.js";import{t as c}from"./extend-BMkkNVfm.js";import{n as l,r as u}from"./plugin-CFEkHH3f.js";import{t as d}from"./settings-rQsBFoL2.js";var f=/^[A-Za-z]{2}\d{2}[A-Za-z0-9]{11,30}$/;function p(e){let t=e.toUpperCase().replace(/\s+/g,``),n=t.slice(4)+t.slice(0,4),r=``;for(let e of n){let t=e.charCodeAt(0);t>=65&&t<=90?r+=(t-55).toString():r+=e}let i=0;for(let e of r)i=(i*10+(e.charCodeAt(0)-48))%97;return i===1}function m(a){let o=a.required??!1,s=r().regex(f,{message:n(`pattern`,{messageKey:`core.presets.iban`})}).refine(p,{message:n(`pattern`,{messageKey:`core.presets.iban`})});return i(void 0,a,e({kind:`text`,label:a.label??``,required:o,prim:`text`,column:`text`,hints:{mask:`iban`,maskStore:`unmasked`},zod:t(s,o)},a.multiple??!1))}var h=/^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$/;function g(a){let o=a.required??!1,s=r().regex(h,{message:n(`pattern`,{messageKey:`finance.presets.bic`})});return i(void 0,a,e({kind:`text`,label:a.label??``,required:o,prim:`text`,column:`text`,hints:{},zod:t(s,o)},a.multiple??!1))}var _=s({shelf:`account`,library:`finance`,label:`finance.account.label`,icon:`lucide:landmark`,agent:`Firefly III account (read-only mirror). kind — account type.
1
+ import{D as e,R as t,T as n,j as r,k as i,n as a,r as o}from"./fields-CV3RQg0Y.js";import{a as s}from"./shelf-Cj_pNvd-.js";import{i as c,n as l}from"./plugin-Cjr7lgQH.js";import{t as u}from"./extend-yQ8zoqGc.js";import{t as d}from"./settings-Bo5IOwVg.js";var f=/^[A-Za-z]{2}\d{2}[A-Za-z0-9]{11,30}$/;function p(e){let t=e.toUpperCase().replace(/\s+/g,``),n=t.slice(4)+t.slice(0,4),r=``;for(let e of n){let t=e.charCodeAt(0);t>=65&&t<=90?r+=(t-55).toString():r+=e}let i=0;for(let e of r)i=(i*10+(e.charCodeAt(0)-48))%97;return i===1}function m(a){let o=t().regex(f,{message:r(`pattern`,{messageKey:`core.presets.iban`})}).refine(p,{message:r(`pattern`,{messageKey:`core.presets.iban`})});return e(void 0,a,n({kind:`text`,label:a.label??``,prim:`text`,column:`text`,hints:{mask:`iban`,maskStore:`unmasked`},zod:i(o)},a.multiple??!1))}var h=/^[A-Za-z]{6}[A-Za-z0-9]{2}([A-Za-z0-9]{3})?$/;function g(a){let o=t().regex(h,{message:r(`pattern`,{messageKey:`finance.presets.bic`})});return e(void 0,a,n({kind:`text`,label:a.label??``,prim:`text`,column:`text`,hints:{},zod:i(o)},a.multiple??!1))}var _=s({shelf:`account`,library:`finance`,label:`finance.account.label`,icon:`lucide:landmark`,agent:`Firefly III account (read-only mirror). kind — account type.
2
2
  current_balance — current balance. firefly_id — external key (do not edit).`,views:{list:[`kind`,`currency`,`current_balance`]},fields:{name:a.title({label:`core.fields.name`}),description:a.text({label:`finance.account.fields.description`,rules:{max:1e3}}),balance:a.balance({source:{current_balance:a.money({label:`finance.account.fields.current_balance`})}}),status:a.status({source:{kind:a.string({label:`finance.account.fields.kind`,strict:!0,noSearch:!0,options:[{value:`asset`,title:`finance.account.options.asset`},{value:`expense`,title:`finance.account.options.expense`},{value:`revenue`,title:`finance.account.options.revenue`},{value:`liability`,title:`finance.account.options.liability`},{value:`cash`,title:`finance.account.options.cash`}]})}}),sheet:a.sheet({fields:{account:{currency:a.currency({label:`finance.account.fields.currency`}),iban:m({label:`finance.account.fields.iban`})},bank:{bank:a.string({label:`finance.account.fields.bank`,rules:{max:120}}),bic:g({label:`finance.account.fields.bic`})}}}),firefly_id:a.string({label:`finance.account.fields.firefly_id`,rules:{max:32}}),notes:a.text({label:`finance.account.fields.notes`,rules:{max:2e3}})}}),v=s({shelf:`transaction`,library:`finance`,label:`finance.transaction.label`,icon:`lucide:arrow-left-right`,agent:`Firefly III transaction (read-only). Each split = a separate record.
3
3
  source/destination — accounts. firefly_id — split journal id (do not edit).`,views:{list:[`date`,`amount`,`kind`]},fields:{description:a.title({label:`finance.transaction.fields.description`}),flow:a.flow({amount:{amount:a.money({label:`finance.transaction.fields.amount`})},from:{source:a.relation({label:`finance.transaction.fields.source`,options:o({library:`finance`,shelf:`account`})})},to:{destination:a.relation({label:`finance.transaction.fields.destination`,options:o({library:`finance`,shelf:`account`})})},meta:{date:a.date({label:`finance.transaction.fields.date`,ui:{span:3}}),kind:a.string({label:`finance.transaction.fields.kind`,strict:!0,noSearch:!0,ui:{span:3},options:[{value:`withdrawal`,title:`finance.transaction.options.withdrawal`},{value:`deposit`,title:`finance.transaction.options.deposit`,tone:`success`},{value:`transfer`,title:`finance.transaction.options.transfer`}]}),category:a.string({label:`finance.transaction.fields.category`,rules:{max:100},ui:{span:3}}),currency:a.currency({label:`core.fields.currency`,ui:{span:3}})}}),firefly_id:a.string({label:`finance.transaction.fields.firefly_id`,rules:{max:32}}),notes:a.text({label:`finance.transaction.fields.notes`,rules:{max:2e3}})}}),y=s({shelf:`bill`,library:`finance`,label:`finance.bill.label`,icon:`lucide:receipt`,agent:`Recurring Firefly III payment (Bill = subscription, read-only).
4
- repeat — recurrence. next_expected — next expected date. firefly_id — do not edit.`,views:{list:[`amount_min`,`repeat`,`next_expected`,`active`]},fields:{name:a.title({label:`core.fields.name`}),description:a.text({label:`finance.bill.fields.description`,rules:{max:1e3}}),currency:a.currency({label:`core.fields.currency`}),sheet:a.sheet({fields:{amount:{amount_min:a.money({label:`finance.bill.fields.amount_min`}),amount_max:a.money({label:`finance.bill.fields.amount_max`})},schedule:{repeat:a.string({label:`finance.bill.fields.repeat`,strict:!0,noSearch:!0,options:[{value:`weekly`,title:`finance.bill.options.weekly`},{value:`monthly`,title:`finance.bill.options.monthly`},{value:`quarterly`,title:`finance.bill.options.quarterly`},{value:`yearly`,title:`finance.bill.options.yearly`}]})}}}),countdown:a.countdown({source:{next_expected:a.date({label:`finance.bill.fields.next_expected`})},caption:`units.days`}),active:a.boolean({label:`finance.bill.fields.active`}),firefly_id:a.string({label:`finance.bill.fields.firefly_id`,rules:{max:32}}),notes:a.text({label:`finance.bill.fields.notes`,rules:{max:2e3}})}}),b=e=>typeof e==`number`&&Number.isFinite(e)?e:Number.isFinite(Number(e))&&e!==null&&e!==``?Number(e):null,x=c({id:`item_financing`,label:`finance.item_financing.label`,icon:`lucide:credit-card`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{paymentStatus:{$in:[`installment`,`credit`]}},agent:`Installment/credit details for an item. creditor — who is owed (bank/store).
4
+ repeat — recurrence. next_expected — next expected date. firefly_id — do not edit.`,views:{list:[`amount_min`,`repeat`,`next_expected`,`active`]},fields:{name:a.title({label:`core.fields.name`}),description:a.text({label:`finance.bill.fields.description`,rules:{max:1e3}}),currency:a.currency({label:`core.fields.currency`}),sheet:a.sheet({fields:{amount:{amount_min:a.money({label:`finance.bill.fields.amount_min`}),amount_max:a.money({label:`finance.bill.fields.amount_max`})},schedule:{repeat:a.string({label:`finance.bill.fields.repeat`,strict:!0,noSearch:!0,options:[{value:`weekly`,title:`finance.bill.options.weekly`},{value:`monthly`,title:`finance.bill.options.monthly`},{value:`quarterly`,title:`finance.bill.options.quarterly`},{value:`yearly`,title:`finance.bill.options.yearly`}]})}}}),countdown:a.countdown({source:{next_expected:a.date({label:`finance.bill.fields.next_expected`})},caption:`units.days`}),active:a.boolean({label:`finance.bill.fields.active`}),firefly_id:a.string({label:`finance.bill.fields.firefly_id`,rules:{max:32}}),notes:a.text({label:`finance.bill.fields.notes`,rules:{max:2e3}})}}),b=e=>typeof e==`number`&&Number.isFinite(e)?e:Number.isFinite(Number(e))&&e!==null&&e!==``?Number(e):null,x=u({id:`item_financing`,label:`finance.item_financing.label`,icon:`lucide:credit-card`,attachTo:[{library:`things`,shelf:`item`}],showWhen:{paymentStatus:{$in:[`installment`,`credit`]}},agent:`Installment/credit details for an item. creditor — who is owed (bank/store).
5
5
  holder — which person the debt is registered to (relation people/person).
6
6
  total — full debt amount. monthly — monthly payment. termMonths/paidMonths — schedule.
7
7
  remaining — how much is left; COMPUTED (total − downPayment − monthly × paidMonths), never write it.
8
- nextPayment — payment reminder. paidOff — settled (manual: an early lump payoff is not in the schedule).`,fields:{creditor:a.string({label:`finance.item_financing.fields.creditor`,rules:{max:120}}),holder:a.relation({label:`finance.item_financing.fields.holder`,options:o({library:`people`,shelf:`person`})}),currency:a.currency({label:`core.fields.currency`,default:`UAH`}),sheet:a.sheet({fields:{principal:{total:a.money({label:`finance.item_financing.fields.total`,mutate:[`remaining`]}),downPayment:a.money({label:`finance.item_financing.fields.downPayment`,mutate:[`remaining`]})},outstanding:{monthly:a.money({label:`finance.item_financing.fields.monthly`,mutate:[`remaining`]}),remaining:a.money({label:`finance.item_financing.fields.remaining`,value:({record:e})=>{let t=b(e.total);if(t==null)return null;let n=(b(e.monthly)??0)*(Number(e.paidMonths)||0),r=t-(b(e.downPayment)??0)-n;return Math.max(0,Math.round(r*100)/100)}})},term:{termMonths:a.int({label:`finance.item_financing.fields.termMonths`,rules:{min:0}}),paidMonths:a.int({label:`finance.item_financing.fields.paidMonths`,rules:{min:0},mutate:[`remaining`]}),rate:a.real({label:`finance.item_financing.fields.rate`,rules:{min:0}})}}}),startDate:a.date({label:`finance.item_financing.fields.startDate`}),nextPayment:a.reminder({label:`finance.item_financing.fields.nextPayment`,rules:{lead:3}}),paidOff:a.boolean({label:`finance.item_financing.fields.paidOff`}),notes:a.text({label:`finance.item_financing.fields.notes`,rules:{max:2e3}})}}),S={iban:m},C=l({id:`finance`,version:`1.0.0`,dependsOn:[`things`,`people`],libraries:[{meta:u({id:`finance`,label:`finance.library.label`,icon:`lucide:wallet`,agent:{description:`Bank accounts, bills, and transactions — mirrored from Firefly.`,instructions:`Data is mirrored from Firefly (firefly_id). Do NOT edit current_balance manually — new operations live as a transaction (kind: withdrawal/deposit/transfer). bill.next_expected — next payment date.`},starterHint:`bills due soon, or how this month compares with the last`}),shelves:[_,v,y]}],extends_:[x],settings:d({label:`finance.settings.label`,fields:{firefly_url:a.string({label:`finance.settings.firefly_url`,required:!0}),token:a.password({label:`finance.settings.token`,required:!0}),button:a.button({label:`finance.settings.test_button`,value:`finance.testConnection`,icon:`lucide:wifi`}),button2:a.button({label:`finance.settings.sync_button`,value:`finance.sync`,icon:`lucide:refresh-cw`}),wise_csv:a.file({label:`finance.settings.wise_csv`}),wise_account:a.relation({label:`finance.settings.wise_account`,options:o({library:`finance`,shelf:`account`})}),button3:a.button({label:`finance.settings.wise_import_button`,value:`finance.importWise`,icon:`lucide:upload`})}})});export{C as n,m as r,S as t};
8
+ nextPayment — payment reminder. paidOff — settled (manual: an early lump payoff is not in the schedule).`,fields:{creditor:a.string({label:`finance.item_financing.fields.creditor`,rules:{max:120}}),holder:a.relation({label:`finance.item_financing.fields.holder`,options:o({library:`people`,shelf:`person`})}),currency:a.currency({label:`core.fields.currency`,default:`UAH`}),sheet:a.sheet({fields:{principal:{total:a.money({label:`finance.item_financing.fields.total`,mutate:[`remaining`]}),downPayment:a.money({label:`finance.item_financing.fields.downPayment`,mutate:[`remaining`]})},outstanding:{monthly:a.money({label:`finance.item_financing.fields.monthly`,mutate:[`remaining`]}),remaining:a.money({label:`finance.item_financing.fields.remaining`,value:({record:e})=>{let t=b(e.total);if(t==null)return null;let n=(b(e.monthly)??0)*(Number(e.paidMonths)||0),r=t-(b(e.downPayment)??0)-n;return Math.max(0,Math.round(r*100)/100)}})},term:{termMonths:a.int({label:`finance.item_financing.fields.termMonths`,rules:{min:0}}),paidMonths:a.int({label:`finance.item_financing.fields.paidMonths`,rules:{min:0},mutate:[`remaining`]}),rate:a.real({label:`finance.item_financing.fields.rate`,rules:{min:0}})}}}),startDate:a.date({label:`finance.item_financing.fields.startDate`}),nextPayment:a.reminder({label:`finance.item_financing.fields.nextPayment`,rules:{lead:3}}),paidOff:a.boolean({label:`finance.item_financing.fields.paidOff`}),notes:a.text({label:`finance.item_financing.fields.notes`,rules:{max:2e3}})}}),S={iban:m},C=l({id:`finance`,version:`1.0.0`,dependsOn:[`things`,`people`],label:`finance.plugin.label`,description:`finance.plugin.description`,libraries:[{meta:c({id:`finance`,label:`finance.library.label`,icon:`lucide:wallet`,agent:{description:`Bank accounts, bills, and transactions — mirrored from Firefly.`,instructions:`Data is mirrored from Firefly (firefly_id). Do NOT edit current_balance manually — new operations live as a transaction (kind: withdrawal/deposit/transfer). bill.next_expected — next payment date.`},starterHint:`bills due soon, or how this month compares with the last`}),shelves:[_,v,y]}],extends_:[x],settings:d({label:`finance.settings.label`,fields:{firefly_url:a.string({label:`finance.settings.firefly_url`}),token:a.password({label:`finance.settings.token`}),button:a.button({label:`finance.settings.test_button`,value:`finance.testConnection`,icon:`lucide:wifi`}),button2:a.button({label:`finance.settings.sync_button`,value:`finance.sync`,icon:`lucide:refresh-cw`}),wise_csv:a.file({label:`finance.settings.wise_csv`}),wise_account:a.relation({label:`finance.settings.wise_account`,options:o({library:`finance`,shelf:`account`})}),button3:a.button({label:`finance.settings.wise_import_button`,value:`finance.importWise`,icon:`lucide:upload`})}})});export{C as n,m as r,S as t};
@@ -0,0 +1 @@
1
+ import{n as e}from"./fields-CV3RQg0Y.js";import{n as t}from"./plugin-Cjr7lgQH.js";import{t as n}from"./settings-Bo5IOwVg.js";var r=t({id:`telegram`,version:`1.0.0`,dependsOn:[],label:`telegram.plugin.label`,description:`telegram.plugin.description`,settings:n({label:`telegram.settings.label`,fields:{api_id:e.int({label:`telegram.settings.api_id`}),api_hash:e.password({label:`telegram.settings.api_hash`}),bot_token:e.password({label:`telegram.settings.bot_token`}),phone:e.tel({label:`telegram.settings.phone`}),reasoning_display:e.string({label:`telegram.settings.reasoning_display`,default:`collapsible`,strict:!0,noSearch:!0,options:[{value:`off`,title:`telegram.settings.reasoning_display_off`},{value:`collapsible`,title:`telegram.settings.reasoning_display_collapsible`},{value:`separate`,title:`telegram.settings.reasoning_display_separate`}]})}})});export{r as default};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ScanSummary-xxY2oZVM.js","assets/react-vendor-CzSUaSLk.js","assets/rolldown-runtime-QTnfLwEv.js","assets/i18n-vendor-T6EnJ_TL.js"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t}from"./i18n-vendor-T6EnJ_TL.js";import{p as n,t as r}from"./react-vendor-CzSUaSLk.js";import{Bn as i,Hn as a,Nt as o,V as s,Vn as c,Z as l,ii as u}from"./src-1AsWJbID.js";import{t as d}from"./input-BFMNMo6y.js";import{a as f,c as p,n as m,o as h,t as g}from"./data-size-BMG0D59K.js";var _=e(t(),1);function v(e){let t=e.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/);if(t){let e=t.slice(1).map(Number);return e.every(e=>e>=0&&e<=255)?{v:4,a:e}:null}try{let t=e;if(e.includes(`::`)){let[n,r]=e.split(`::`),i=n?n.split(`:`):[],a=r?r.split(`:`):[],o=8-i.length-a.length;t=[...i,...Array(o).fill(`0`),...a].join(`:`)}let n=t.split(`:`);if(n.length!==8)return null;let r=n.map(e=>parseInt(e,16));return r.some(e=>isNaN(e)||e<0||e>65535)?null:{v:6,a:r}}catch{return null}}function y(e){return e.v===4?e.a.join(`.`):e.a.map(e=>e.toString(16)).join(`:`)}function b(e){let t=e.lastIndexOf(`/`);if(t===-1)return null;let n=e.slice(0,t),r=e.slice(t+1),i=parseInt(r,10),a=v(n);if(!a||isNaN(i))return null;let o=a.v===4?32:128;return i<0||i>o?null:{...a,p:i}}function x(e){return`${y(e)}/${e.p}`}var S=r(),C=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/plugin-devices/src/fields/ui.tsx`;function w({value:e,onChange:t,parse:n,format:r,placeholder:i}){let a=(0,_.useMemo)(()=>{if(e&&typeof e==`object`)return e;if(typeof e!=`string`)return null;try{return JSON.parse(e)}catch{return null}},[e]),o=typeof e==`string`?e:``,[s,c]=(0,_.useState)(a?r(a):o);(0,_.useEffect)(()=>{c(a?r(a):o)},[o,a]);let l=e=>{let r=e.trim(),i=n(r);t(i?JSON.stringify(i):r)};return(0,S.jsxDEV)(d,{value:s,placeholder:i,onChange:e=>c(e.target.value),onBlur:()=>l(s),onKeyDown:e=>{e.key===`Enter`&&l(s)}},void 0,!1,{fileName:C,lineNumber:67,columnNumber:5},this)}function T(e,t){return(0,S.jsxDEV)(a,{items:o(e,[]),content:e=>{let n=typeof e==`string`?o(e,null):e;return n&&typeof n==`object`?t(n):String(e)}},void 0,!1,{fileName:C,lineNumber:84,columnNumber:5},this)}function E(e,t){let n=typeof e==`string`?o(e,null):e??null;if(n&&typeof n==`object`)return(0,S.jsxDEV)(`code`,{className:`font-mono text-sm`,children:t(n)},void 0,!1,{fileName:C,lineNumber:103,columnNumber:46},this);let r=String(e??``);return r?(0,S.jsxDEV)(`span`,{className:`text-muted-foreground`,children:r},void 0,!1,{fileName:C,lineNumber:105,columnNumber:16},this):(0,S.jsxDEV)(c,{},void 0,!1,{fileName:C,lineNumber:105,columnNumber:71},this)}function D({value:e}){return E(e,y)}function O({value:e}){return E(e,x)}function k(e){return(0,S.jsxDEV)(s,{field:e.field,value:e.value,label:e.label,error:e.error,mode:e.mode,geom:`inline`,bare:e.bare,view:t=>e.field.hints.multiple===!0?T(t,e=>y(e)):(()=>{let e=o(t,null);if(e)return(0,S.jsxDEV)(`code`,{className:`font-mono text-sm`,children:y(e)},void 0,!1,{fileName:C,lineNumber:131,columnNumber:34},this);let n=String(t??``);return n?(0,S.jsxDEV)(`span`,{className:`text-muted-foreground`,children:n},void 0,!1,{fileName:C,lineNumber:133,columnNumber:28},this):(0,S.jsxDEV)(c,{},void 0,!1,{fileName:C,lineNumber:133,columnNumber:83},this)})(),edit:(t,n)=>e.field.hints.multiple===!0?(0,S.jsxDEV)(l,{value:String(t),onChange:n,validate:e=>v(e.trim())!==null,serialize:e=>{let t=v(e.trim());return t?JSON.stringify(t):null},display:e=>{try{return y(JSON.parse(e))}catch{return e}},renderInput:(e,t,n)=>(0,S.jsxDEV)(d,{value:e,placeholder:`192.168.1.1`,onChange:e=>t(e.target.value),className:`flex-1`,onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),n())}},void 0,!1,{fileName:C,lineNumber:154,columnNumber:15},this)},void 0,!1,{fileName:C,lineNumber:138,columnNumber:11},this):(0,S.jsxDEV)(w,{value:t,onChange:n,parse:v,format:y,placeholder:`192.168.1.1`},void 0,!1,{fileName:C,lineNumber:169,columnNumber:11},this)},void 0,!1,{fileName:C,lineNumber:118,columnNumber:5},this)}function A({value:e}){let t=null;try{t=y(JSON.parse(String(e)))}catch{t=null}return t===null?(0,S.jsxDEV)(`span`,{className:`truncate`,children:`—`},void 0,!1,{fileName:C,lineNumber:191,columnNumber:26},this):(0,S.jsxDEV)(`span`,{className:`truncate font-mono`,children:t},void 0,!1,{fileName:C,lineNumber:191,columnNumber:64},this)}var j={kinds:[`ip`],voice:`data`,Page:k,Inline:A,Value:D};function M(e){return(0,S.jsxDEV)(s,{field:e.field,value:e.value,label:e.label,error:e.error,mode:e.mode,geom:`inline`,bare:e.bare,view:t=>e.field.hints.multiple===!0?T(t,e=>x(e)):(()=>{let e=o(t,null);if(e)return(0,S.jsxDEV)(`code`,{className:`font-mono text-sm`,children:x(e)},void 0,!1,{fileName:C,lineNumber:220,columnNumber:34},this);let n=String(t??``);return n?(0,S.jsxDEV)(`span`,{className:`text-muted-foreground`,children:n},void 0,!1,{fileName:C,lineNumber:222,columnNumber:28},this):(0,S.jsxDEV)(c,{},void 0,!1,{fileName:C,lineNumber:222,columnNumber:83},this)})(),edit:(t,n)=>e.field.hints.multiple===!0?(0,S.jsxDEV)(l,{value:String(t),onChange:n,validate:e=>b(e.trim())!==null,serialize:e=>{let t=b(e.trim());return t?JSON.stringify(t):null},display:e=>{try{return x(JSON.parse(e))}catch{return e}},renderInput:(e,t,n)=>(0,S.jsxDEV)(d,{value:e,placeholder:`192.168.1.0/24`,onChange:e=>t(e.target.value),className:`flex-1`,onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),n())}},void 0,!1,{fileName:C,lineNumber:243,columnNumber:15},this)},void 0,!1,{fileName:C,lineNumber:227,columnNumber:11},this):(0,S.jsxDEV)(w,{value:t,onChange:n,parse:b,format:x,placeholder:`192.168.1.0/24`},void 0,!1,{fileName:C,lineNumber:258,columnNumber:11},this)},void 0,!1,{fileName:C,lineNumber:207,columnNumber:5},this)}function N({value:e}){let t=null;try{t=x(JSON.parse(String(e)))}catch{t=null}return t===null?(0,S.jsxDEV)(`span`,{className:`truncate`,children:`—`},void 0,!1,{fileName:C,lineNumber:280,columnNumber:26},this):(0,S.jsxDEV)(`span`,{className:`truncate font-mono`,children:t},void 0,!1,{fileName:C,lineNumber:280,columnNumber:64},this)}var P={kinds:[`cidr`],voice:`data`,Page:M,Inline:N,Value:O};function F({field:e,value:t,onChange:n}){let r=p(e),a=t===``?``:Number(t),[o,s]=(0,_.useState)(()=>a!==``&&Number(a)>0?m(Number(a),r)[0]:e.hints.unit??`GB`),c=f(r,o),l=a===``?``:Number((Number(a)/c).toFixed(4)),u=e=>Math.round(e*c);return(0,S.jsxDEV)(`div`,{className:`flex gap-2 min-w-0`,children:[(0,S.jsxDEV)(d,{type:`number`,className:`flex-1 min-w-0`,min:0,value:l,onChange:e=>n(e.target.value===``?``:String(u(Number(e.target.value))))},void 0,!1,{fileName:C,lineNumber:304,columnNumber:7},this),(0,S.jsxDEV)(i,{value:o,onChange:s,items:g[r].map(([e])=>({value:e,title:e})),triggerClassName:`w-24 justify-between gap-1 px-2 font-normal`},void 0,!1,{fileName:C,lineNumber:311,columnNumber:7},this)]},void 0,!0,{fileName:C,lineNumber:303,columnNumber:5},this)}function I({value:e,system:t}){let n=h(e,t);return n?(0,S.jsxDEV)(`span`,{children:n},void 0,!1,{fileName:C,lineNumber:326,columnNumber:14},this):(0,S.jsxDEV)(c,{},void 0,!1,{fileName:C,lineNumber:326,columnNumber:33},this)}function L(e){let t=p(e.field);return(0,S.jsxDEV)(s,{field:e.field,value:e.value,label:e.label,error:e.error,mode:e.mode,geom:`inline`,width:`w-48`,bare:e.bare,view:e=>(0,S.jsxDEV)(I,{value:e,system:t},void 0,!1,{fileName:C,lineNumber:341,columnNumber:20},this),edit:(t,n)=>(0,S.jsxDEV)(F,{field:e.field,value:String(t??``),onChange:n},void 0,!1,{fileName:C,lineNumber:343,columnNumber:9},this)},void 0,!1,{fileName:C,lineNumber:332,columnNumber:5},this)}function R({field:e,value:t}){return(0,S.jsxDEV)(I,{value:t,system:p(e)},void 0,!1,{fileName:C,lineNumber:350,columnNumber:10},this)}var z=u({shelf:{library:`devices`,shelf:`network`},renderers:[j,P,{kinds:[`dataSize`],Page:L,Inline:R}],templates:{"devices.scan.summary":()=>n(()=>import(`./ScanSummary-xxY2oZVM.js`),__vite__mapDeps([0,1,2,3]))}});export{z as default};
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/GeoMap-B1DFGu6_.js","assets/rolldown-runtime-QTnfLwEv.js","assets/i18n-vendor-T6EnJ_TL.js","assets/react-vendor-CzSUaSLk.js","assets/GeoMap-vh-t_kPv.css"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,t as n}from"./i18n-vendor-T6EnJ_TL.js";import{p as r,r as i,t as a,u as o}from"./react-vendor-CzSUaSLk.js";import{Fr as s,Jt as c,U as l,Vr as u,an as d,ht as f,ii as p,j as m,qt as h,wt as g}from"./src-1AsWJbID.js";import{y as _}from"./fields-CV3RQg0Y.js";import{r as v,t as y}from"./input-BFMNMo6y.js";import{l as b}from"./phone-input-BZ9vGYpI.js";import{s as x,t as S}from"./shelf-Cj_pNvd-.js";var C=v(`locate-fixed`,[[`line`,{x1:`2`,x2:`5`,y1:`12`,y2:`12`,key:`bvdh0s`}],[`line`,{x1:`19`,x2:`22`,y1:`12`,y2:`12`,key:`1tbv5k`}],[`line`,{x1:`12`,x2:`12`,y1:`2`,y2:`5`,key:`11lu5j`}],[`line`,{x1:`12`,x2:`12`,y1:`19`,y2:`22`,key:`x3vr5v`}],[`circle`,{cx:`12`,cy:`12`,r:`7`,key:`fim9np`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]),w=e(t(),1);function T(e,t){return Math.floor((e+180)/360*2**t)}function E(e,t){let n=e*Math.PI/180;return Math.floor((1-Math.log(Math.tan(n)+1/Math.cos(n))/Math.PI)/2*2**t)}function D(e,t,n=13){return`https://tile.openstreetmap.org/${n}/${T(t,n)}/${E(e,n)}.png`}function O(e){let t=_(e.parts??[]);return{latKey:t.lat??`lat`,lngKey:t.lng??`lng`,labelKey:t.label??`label`}}function k(e,t){let{latKey:n,lngKey:r,labelKey:i}=O(t),a=e&&typeof e==`object`?e:(()=>{try{let t=JSON.parse(String(e??``));return t&&typeof t==`object`?t:null}catch{return null}})();return a?{lat:a[n],lng:a[r],label:a[i]}:{}}var A=e=>Number(e.toFixed(6)),j=(e,t)=>{if(e.lat==null&&e.lng==null&&!e.label)return``;let{latKey:n,lngKey:r,labelKey:i}=O(t);return{[n]:e.lat,[r]:e.lng,[i]:e.label}},M=a(),N=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/plugin-geo/src/geo-field.tsx`;function P(e){return e.lat!=null||e.lng!=null||e.label!=null}var F=(0,w.lazy)(()=>r(()=>import(`./GeoMap-B1DFGu6_.js`),__vite__mapDeps([0,1,2,3,4])));function I({g:e,onOpen:t}){let{t:r}=n();return e.lat==null||e.lng==null?(0,M.jsxDEV)(`button`,{type:`button`,onClick:t,className:`flex h-24 w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-border text-sm text-muted-foreground hover:border-ring`,children:[(0,M.jsxDEV)(u,{size:16},void 0,!1,{fileName:N,lineNumber:37,columnNumber:9},this),` `,r(`geo.pick`)]},void 0,!0,{fileName:N,lineNumber:32,columnNumber:7},this):(0,M.jsxDEV)(`button`,{type:`button`,onClick:t,title:e.label??`${e.lat}, ${e.lng}`,className:`relative block h-24 w-full overflow-hidden rounded-lg border border-border hover:border-ring`,children:[(0,M.jsxDEV)(`img`,{src:D(e.lat,e.lng),alt:``,loading:`lazy`,className:`h-full w-full object-cover`},void 0,!1,{fileName:N,lineNumber:48,columnNumber:7},this),(0,M.jsxDEV)(u,{size:22,fill:`currentColor`,className:`pointer-events-none absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-full text-destructive drop-shadow`},void 0,!1,{fileName:N,lineNumber:49,columnNumber:7},this)]},void 0,!0,{fileName:N,lineNumber:42,columnNumber:5},this)}function L({field:e,value:t,commit:r,editable:i,label:a,onClose:o}){let{t:c}=n(),[u,d]=(0,w.useState)(``),[f,p]=(0,w.useState)(!1),m=e=>e===``?void 0:Number(e),_=e.parts?.find(e=>e.role===`lat`),v=e.parts?.find(e=>e.role===`lng`),x=_!=null&&_.mode!==`stored`||v!=null&&v.mode!==`stored`,S=e.parts?.find(e=>e.role===`label`),T=S!=null&&S.mode!==`stored`,E=i&&!x,{draft:D,setDraft:O,save:I,clear:L,clearable:R,error:z,busy:B}=l({field:e,seed:t,commit:r??(async()=>void 0),remove:i&&P(k(t,e))?()=>``:void 0,onDone:o}),V=(0,w.useMemo)(()=>k(D,e),[D,e]),H=t=>O(j(t,e));function U(){navigator.geolocation&&navigator.geolocation.getCurrentPosition(e=>H({...V,lat:A(e.coords.latitude),lng:A(e.coords.longitude)}),()=>{},{enableHighAccuracy:!0})}async function W(){if(u.trim()){p(!0);try{let e=await(await fetch(`https://nominatim.openstreetmap.org/search?format=json&limit=1&q=${encodeURIComponent(u)}`)).json();Array.isArray(e)&&e[0]&&H({lat:A(+e[0].lat),lng:A(+e[0].lon),label:V.label||e[0].display_name})}catch{}p(!1)}}return(0,M.jsxDEV)(g,{open:!0,onOpenChange:e=>!e&&o(),title:a,children:(0,M.jsxDEV)(`div`,{className:`flex min-h-0 flex-col gap-2`,children:[E&&(0,M.jsxDEV)(`div`,{className:`flex items-center gap-2`,children:[(0,M.jsxDEV)(y,{placeholder:c(`geo.searchPlaceholder`),value:u,onChange:e=>d(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),W())},className:`flex-1`},void 0,!1,{fileName:N,lineNumber:137,columnNumber:13},this),(0,M.jsxDEV)(b,{type:`button`,variant:`secondary`,size:`icon`,disabled:f,onClick:W,title:c(`geo.search`),children:(0,M.jsxDEV)(s,{size:16},void 0,!1,{fileName:N,lineNumber:157,columnNumber:15},this)},void 0,!1,{fileName:N,lineNumber:149,columnNumber:13},this),(0,M.jsxDEV)(b,{type:`button`,variant:`secondary`,size:`icon`,onClick:U,title:c(`geo.myLocation`),children:(0,M.jsxDEV)(C,{size:16},void 0,!1,{fileName:N,lineNumber:160,columnNumber:15},this)},void 0,!1,{fileName:N,lineNumber:159,columnNumber:13},this)]},void 0,!0,{fileName:N,lineNumber:136,columnNumber:11},this),(0,M.jsxDEV)(w.Suspense,{fallback:(0,M.jsxDEV)(`div`,{className:`h-[60dvh] rounded-lg border border-border bg-card/40`},void 0,!1,{fileName:N,lineNumber:164,columnNumber:29},this),children:(0,M.jsxDEV)(`div`,{className:`[&>div]:h-[60dvh]`,children:(0,M.jsxDEV)(F,{lat:V.lat,lng:V.lng,interactive:E,onPick:E?(e,t)=>H({...V,lat:e,lng:t}):void 0},void 0,!1,{fileName:N,lineNumber:166,columnNumber:13},this)},void 0,!1,{fileName:N,lineNumber:165,columnNumber:11},this)},void 0,!1,{fileName:N,lineNumber:164,columnNumber:9},this),(0,M.jsxDEV)(h,{error:z},void 0,!1,{fileName:N,lineNumber:174,columnNumber:9},this),i?(0,M.jsxDEV)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center`,children:[(0,M.jsxDEV)(`div`,{className:`grid flex-1 grid-cols-1 gap-2 sm:grid-cols-[7rem_7rem_1fr]`,children:[x?(0,M.jsxDEV)(`div`,{className:`flex h-9 items-center rounded-lg border border-transparent px-3 text-sm text-muted-foreground`,children:V.lat??`—`},void 0,!1,{fileName:N,lineNumber:180,columnNumber:17},this):(0,M.jsxDEV)(y,{type:`number`,step:`any`,placeholder:`lat`,value:V.lat??``,onChange:e=>H({...V,lat:m(e.target.value)})},void 0,!1,{fileName:N,lineNumber:184,columnNumber:17},this),x?(0,M.jsxDEV)(`div`,{className:`flex h-9 items-center rounded-lg border border-transparent px-3 text-sm text-muted-foreground`,children:V.lng??`—`},void 0,!1,{fileName:N,lineNumber:193,columnNumber:17},this):(0,M.jsxDEV)(y,{type:`number`,step:`any`,placeholder:`lng`,value:V.lng??``,onChange:e=>H({...V,lng:m(e.target.value)})},void 0,!1,{fileName:N,lineNumber:197,columnNumber:17},this),T?(0,M.jsxDEV)(`div`,{className:`flex h-9 items-center rounded-lg border border-transparent px-3 text-sm text-muted-foreground`,children:V.label??`—`},void 0,!1,{fileName:N,lineNumber:206,columnNumber:17},this):(0,M.jsxDEV)(y,{placeholder:c(`geo.label`),value:V.label??``,onChange:e=>H({...V,label:e.target.value||void 0})},void 0,!1,{fileName:N,lineNumber:210,columnNumber:17},this)]},void 0,!0,{fileName:N,lineNumber:178,columnNumber:13},this),R&&(0,M.jsxDEV)(b,{type:`button`,variant:`destructiveOutline`,disabled:B,onClick:()=>void L(),className:`sm:self-auto`,children:c(`actions.clear`)},void 0,!1,{fileName:N,lineNumber:218,columnNumber:15},this),(0,M.jsxDEV)(b,{type:`button`,disabled:B,onClick:()=>void I(),className:`sm:self-auto`,children:c(`actions.save`)},void 0,!1,{fileName:N,lineNumber:228,columnNumber:13},this)]},void 0,!0,{fileName:N,lineNumber:176,columnNumber:11},this):V.lat!=null&&V.lng!=null&&(0,M.jsxDEV)(`a`,{className:`text-sm text-primary hover:underline`,target:`_blank`,rel:`noreferrer`,href:`https://www.openstreetmap.org/?mlat=${V.lat}&mlon=${V.lng}#map=15/${V.lat}/${V.lng}`,children:V.label??`${V.lat.toFixed(5)}, ${V.lng?.toFixed(5)}`},void 0,!1,{fileName:N,lineNumber:235,columnNumber:13},this)]},void 0,!0,{fileName:N,lineNumber:134,columnNumber:7},this)},void 0,!1,{fileName:N,lineNumber:133,columnNumber:5},this)}function R({field:e,value:t,commit:n,editable:r,label:i}){let a=(0,w.useMemo)(()=>k(t,e),[t,e]),[o,s]=(0,w.useState)(!1);return(0,M.jsxDEV)(`div`,{className:`flex flex-col gap-1`,children:[(0,M.jsxDEV)(I,{g:a,onOpen:()=>s(!0)},void 0,!1,{fileName:N,lineNumber:267,columnNumber:7},this),a.label&&(0,M.jsxDEV)(`span`,{className:`text-sm break-words`,children:a.label},void 0,!1,{fileName:N,lineNumber:273,columnNumber:19},this),a.lat!=null&&a.lng!=null&&(0,M.jsxDEV)(`span`,{className:`text-[11px] text-muted-foreground ${d(e)}`.trim(),"data-testid":`geo-point`,children:[a.lat.toFixed(5),`, `,a.lng.toFixed(5)]},void 0,!0,{fileName:N,lineNumber:275,columnNumber:9},this),o&&(0,M.jsxDEV)(L,{field:e,value:t,commit:n,editable:r,label:i,onClose:()=>s(!1)},void 0,!1,{fileName:N,lineNumber:280,columnNumber:9},this)]},void 0,!0,{fileName:N,lineNumber:266,columnNumber:5},this)}function z(e){let t=f(),n=t?.writable?t.write:void 0,r=!!n&&!(e.field.hints.noEditControl===!0&&e.mode===`view`),i=(0,M.jsxDEV)(R,{field:e.field,value:e.value,commit:n,editable:r,label:e.label},void 0,!1,{fileName:N,lineNumber:297,columnNumber:16},this);return e.bare?i:(0,M.jsxDEV)(`div`,{className:`group/field w-56`,children:[e.label!==void 0&&(0,M.jsxDEV)(c,{label:e.label},void 0,!1,{fileName:N,lineNumber:301,columnNumber:33},this),i,(0,M.jsxDEV)(h,{error:e.error},void 0,!1,{fileName:N,lineNumber:303,columnNumber:7},this)]},void 0,!0,{fileName:N,lineNumber:300,columnNumber:5},this)}function B({value:e,field:t}){let n=k(e,t);return(0,M.jsxDEV)(`span`,{className:`truncate`,children:n.label??(n.lat==null?`—`:`${n.lat.toFixed(3)}, ${n.lng?.toFixed(3)}`)},void 0,!1,{fileName:N,lineNumber:311,columnNumber:5},this)}var V={kinds:[`geo`],editor:`own`,Page:z,Inline:B};function H(e,t){let n=x(e.fields);return t.filter(e=>n[e]?.kind===`geo`)}function U(e,t){let n=H(e,t);return n.length===1?n[0]:null}function W(e,t){let n=x(e.fields),r=t[0];if(!r||!n[r])return`views.list: shelf has no text field for its title (titleKey fell back to "id")`;let i=H(e,t);return i.length===0?`views.list does not contain a kind:"geo" field`:i.length>1?`views.list contains multiple geo fields: ${i.join(`, `)}`:null}var G=`/home/grigorii/Projects/GitHub/grigorii-horos/coffer/packages/plugin-geo/src/map-view.tsx`,K=(0,w.lazy)(()=>r(()=>import(`./GeoMap-B1DFGu6_.js`).then(e=>({default:e.MarkersMap})),__vite__mapDeps([0,1,2,3,4])));function q({rows:e,shelf:t,keys:r,hrefBase:a}){let{t:s}=n(),c=o(),[l,u]=(0,w.useState)(!1),d=x(t.fields),f=U(t,r),p=r[0],{points:h,without:g}=(0,w.useMemo)(()=>{let t=[],n=[];for(let r of e){let e=f?S(d[f],f,r):void 0;e&&typeof e.lat==`number`&&typeof e.lng==`number`?t.push({id:String(r.id),lat:e.lat,lng:e.lng,title:String(S(d[p],p,r)??r.id)}):n.push(r)}return{points:t,without:n}},[e,f,p,d]);return(0,M.jsxDEV)(`div`,{className:`p-4`,children:[(0,M.jsxDEV)(w.Suspense,{fallback:(0,M.jsxDEV)(`div`,{className:`h-64 rounded-lg border border-border`},void 0,!1,{fileName:G,lineNumber:48,columnNumber:27},this),children:(0,M.jsxDEV)(K,{points:h,onPick:e=>c(`${a}/${e}`)},void 0,!1,{fileName:G,lineNumber:49,columnNumber:9},this)},void 0,!1,{fileName:G,lineNumber:48,columnNumber:7},this),g.length>0&&(0,M.jsxDEV)(`div`,{className:`mt-3`,children:[(0,M.jsxDEV)(`button`,{type:`button`,onClick:()=>u(e=>!e),className:`text-sm text-muted-foreground hover:text-foreground transition-colors`,children:s(`geo.withoutCoords`,{count:g.length})},void 0,!1,{fileName:G,lineNumber:53,columnNumber:11},this),l&&(0,M.jsxDEV)(`ul`,{className:`mt-2 flex flex-col gap-1`,children:g.map(e=>(0,M.jsxDEV)(`li`,{children:(0,M.jsxDEV)(i,{to:`${a}/${e.id}`,className:`text-sm text-foreground hover:text-primary`,children:(0,M.jsxDEV)(m,{field:d[p],value:S(d[p],p,e)},void 0,!1,{fileName:G,lineNumber:65,columnNumber:21},this)},void 0,!1,{fileName:G,lineNumber:64,columnNumber:19},this)},String(e.id),!1,{fileName:G,lineNumber:63,columnNumber:17},this))},void 0,!1,{fileName:G,lineNumber:61,columnNumber:13},this)]},void 0,!0,{fileName:G,lineNumber:52,columnNumber:9},this)]},void 0,!0,{fileName:G,lineNumber:47,columnNumber:5},this)}var J=p({renderers:[V],listViews:[{kind:`map`,View:q,check:W}],translations:{uk:{geo:{plugin:{label:`Карти`,description:`Координати, пошук місць і вибір на карті.`},searchPlaceholder:`Пошук адреси…`,search:`Знайти`,myLocation:`Моє місцеположення`,label:`Підпис`,pick:`Обрати місце`,withoutCoords:`Без координат: {{count}}`}},ru:{geo:{plugin:{label:`Карты`,description:`Координаты, поиск мест и выбор на карте.`},searchPlaceholder:`Поиск адреса…`,search:`Найти`,myLocation:`Моё местоположение`,label:`Подпись`,pick:`Выбрать место`,withoutCoords:`Без координат: {{count}}`}},en:{geo:{plugin:{label:`Maps`,description:`Coordinates, place search and map picking.`},searchPlaceholder:`Search address…`,search:`Search`,myLocation:`My location`,label:`Label`,pick:`Pick location`,withoutCoords:`Without coordinates: {{count}}`}}}});export{J as default};