@feedmepos/mf-order-setting 0.0.91 → 0.0.93

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 (108) hide show
  1. package/dist/DisplaySystemView-BMRCs7o8.js +8891 -0
  2. package/dist/{KioskDevicesView-Bz6seroM.js → KioskDevicesView-BCZOqou3.js} +1 -1
  3. package/dist/{KioskDevicesView.vue_vue_type_script_setup_true_lang-I39sE8Pe.js → KioskDevicesView.vue_vue_type_script_setup_true_lang-4wFO9co5.js} +3 -3
  4. package/dist/{KioskSettingView-Cajjh4Zm.js → KioskSettingView-DIvpRwFV.js} +3 -3
  5. package/dist/{KioskView-BPSbsMi5.js → KioskView-w4txC9m2.js} +5 -5
  6. package/dist/{OrderSettingsView-jPxZ3JDM.js → OrderSettingsView-BPuBA2QC.js} +28615 -27747
  7. package/dist/{app-DIhv5ssA.js → app-xZAaURng.js} +4594 -3733
  8. package/dist/app.js +1 -1
  9. package/dist/common/order-platform/index.d.ts +20 -0
  10. package/dist/featureFlag-Cbj0uMaM.js +846 -0
  11. package/dist/frontend/mf-order/src/api/brandkit/index.d.ts +3 -0
  12. package/dist/frontend/mf-order/src/api/reservation/index.d.ts +8 -0
  13. package/dist/frontend/mf-order/src/app.d.ts +752 -0
  14. package/dist/frontend/mf-order/src/composables/featureFlag.d.ts +7 -0
  15. package/dist/frontend/mf-order/src/composables/useBusinessFeatureFlag.d.ts +4 -0
  16. package/dist/frontend/mf-order/src/composables/useLegacyOdsAccess.d.ts +4 -0
  17. package/dist/frontend/mf-order/src/composables/useMiniProgramPermission.d.ts +5 -0
  18. package/dist/frontend/mf-order/src/main.d.ts +752 -0
  19. package/dist/frontend/mf-order/src/modules/display-system/legacy-ods/interface.d.ts +80 -0
  20. package/dist/frontend/mf-order/src/stores/order-setting/index.d.ts +3 -3
  21. package/dist/frontend/mf-order/src/stores/restaurant/index.d.ts +3 -0
  22. package/dist/frontend/mf-order/src/views/display-system/legacy-ods/ColorOverrideDialog.vue.d.ts +26 -0
  23. package/dist/frontend/mf-order/src/views/display-system/legacy-ods/ColorSelection.vue.d.ts +15 -0
  24. package/dist/frontend/mf-order/src/views/display-system/legacy-ods/LegacyOdsEditorDialog.vue.d.ts +24 -0
  25. package/dist/frontend/mf-order/src/views/display-system/legacy-ods/LegacyOdsTemplateList.vue.d.ts +4 -0
  26. package/dist/frontend/mf-order/src/views/display-system/view-selection.d.ts +18 -0
  27. package/dist/frontend/mf-order/src/views/order-settings/reservation/CopySettingsSheet.vue.d.ts +186 -0
  28. package/dist/frontend/mf-order/src/views/order-settings/reservation/CustomTimePicker.vue.d.ts +11 -0
  29. package/dist/frontend/mf-order/src/views/order-settings/reservation/ReservationSetting.vue.d.ts +2 -0
  30. package/dist/frontend/mf-order/tsconfig.app.tsbuildinfo +1 -1
  31. package/dist/{index-vaSLX6r3.js → index-BAFwfvqv.js} +2 -2
  32. package/dist/{index-Clp_YRJ2.js → index-BxQKdXyN.js} +1 -1
  33. package/dist/{index-CmqNrkNl.js → index-Cipbdi6i.js} +1 -1
  34. package/dist/order.dto-yLICIGDQ.js +41528 -0
  35. package/dist/package/entity/delivery/delivery.dto.d.ts +7 -0
  36. package/dist/package/entity/food-court/food-court.dto.d.ts +315 -264
  37. package/dist/package/entity/food-court/order-v2.do.d.ts +231 -0
  38. package/dist/package/entity/food-court/order-v2.do.spec.d.ts +1 -0
  39. package/dist/package/entity/incoming-order/incoming-order-to-bill.dto.d.ts +15 -6
  40. package/dist/package/entity/index.d.ts +7 -0
  41. package/dist/package/entity/index.frontend.d.ts +2 -0
  42. package/dist/package/entity/member/member.dto.d.ts +2 -2
  43. package/dist/package/entity/order/dine-in/dine-in.do.d.ts +44 -9
  44. package/dist/package/entity/order/dine-in/dine-in.dto.d.ts +17 -3
  45. package/dist/package/entity/order/menu/menu.dto.d.ts +33 -3
  46. package/dist/package/entity/order/order-item/order-item.dto.d.ts +18 -18
  47. package/dist/package/entity/order/order.do.d.ts +87 -12
  48. package/dist/package/entity/order/order.dto.d.ts +762 -358
  49. package/dist/package/entity/order/order.enum.d.ts +1 -1
  50. package/dist/package/entity/order-platform/foodpanda/foodpanda-order.dto.d.ts +7 -0
  51. package/dist/package/entity/order-platform/grabfood/grabfood-order.do.d.ts +7 -0
  52. package/dist/package/entity/order-platform/menu.dto.d.ts +10 -10
  53. package/dist/package/entity/order-platform/order-platform.dto.d.ts +92 -0
  54. package/dist/package/entity/order-platform/shopeefood/shopeefood-order.do.d.ts +7 -0
  55. package/dist/package/entity/order-platform/tng/tng-menu.do.d.ts +6 -6
  56. package/dist/package/entity/order-setting/order-setting.do.d.ts +866 -5
  57. package/dist/package/entity/order-setting/order-setting.dto.d.ts +10 -10
  58. package/dist/package/entity/order-setting/reservationV2/reservation.do.d.ts +1269 -0
  59. package/dist/package/entity/order-setting/sms/sms.do.d.ts +3 -3
  60. package/dist/package/entity/order-setting/sms/sms.dto.d.ts +3 -3
  61. package/dist/package/entity/queue/queue.dto.d.ts +175 -121
  62. package/dist/package/entity/reservation/reservation-pos.do.d.ts +222 -0
  63. package/dist/package/entity/reservation/reservation.do.d.ts +205 -0
  64. package/dist/package/entity/reservation/reservation.dto.d.ts +428 -0
  65. package/dist/package/entity/reservation/reservation.enum.d.ts +3 -0
  66. package/dist/package/entity/reservation/reservation.utils.d.ts +152 -0
  67. package/dist/package/entity/restaurant/restaurant.dto.d.ts +39 -24
  68. package/dist/package/entity/user/user.do.d.ts +2 -2
  69. package/dist/package/entity/websocket/websocket.dto.d.ts +161 -21
  70. package/dist/package/entity/websocket/websocket.enum.d.ts +1 -1
  71. package/dist/style.css +1 -1
  72. package/env.d.ts +2 -0
  73. package/package.json +3 -2
  74. package/src/api/brandkit/index.ts +24 -0
  75. package/src/api/reservation/index.ts +25 -0
  76. package/src/assets/images/not-found.png +0 -0
  77. package/src/composables/featureFlag.ts +22 -0
  78. package/src/composables/useBusinessFeatureFlag.ts +44 -0
  79. package/src/composables/useLegacyOdsAccess.ts +35 -0
  80. package/src/composables/useMiniProgramPermission.ts +19 -0
  81. package/src/composables/useQrOrderingEnabled.ts +1 -21
  82. package/src/locales/en-US.json +188 -0
  83. package/src/locales/ja-JP.json +188 -0
  84. package/src/locales/th-TH.json +188 -0
  85. package/src/locales/zh-CN.json +188 -0
  86. package/src/modules/display-system/legacy-ods/interface.ts +108 -0
  87. package/src/router/routes.ts +1 -1
  88. package/src/views/display-system/DisplaySystemView.vue +82 -11
  89. package/src/views/display-system/legacy-ods/ColorOverrideDialog.vue +223 -0
  90. package/src/views/display-system/legacy-ods/ColorSelection.vue +67 -0
  91. package/src/views/display-system/legacy-ods/LegacyOdsEditorDialog.spec.ts +185 -0
  92. package/src/views/display-system/legacy-ods/LegacyOdsEditorDialog.vue +1677 -0
  93. package/src/views/display-system/legacy-ods/LegacyOdsTemplateList.spec.ts +124 -0
  94. package/src/views/display-system/legacy-ods/LegacyOdsTemplateList.vue +297 -0
  95. package/src/views/display-system/legacy-ods/brandkit.spec.ts +67 -0
  96. package/src/views/display-system/view-selection.spec.ts +93 -0
  97. package/src/views/display-system/view-selection.ts +54 -0
  98. package/src/views/order-settings/OrderSettingsView.vue +9 -2
  99. package/src/views/order-settings/delivery/delivery.spec.ts +21 -0
  100. package/src/views/order-settings/delivery/delivery.ts +2 -51
  101. package/src/views/order-settings/dine-in/DineInSetting.vue +11 -1
  102. package/src/views/order-settings/reservation/CopySettingsSheet.vue +256 -0
  103. package/src/views/order-settings/reservation/CustomTimePicker.vue +311 -0
  104. package/src/views/order-settings/reservation/ReservationSetting.vue +1549 -0
  105. package/vitest.config.ts +2 -1
  106. package/dist/DisplaySystemView-n7Kqdw-h.js +0 -6564
  107. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +0 -9
  108. package/dist/order.dto-DV1qL3Q_.js +0 -40301
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .integration-details[data-v-64de12e4]{display:flex;flex-direction:column;gap:.625rem;padding:1rem;margin-top:1rem;border:1px solid #e5e7eb;border-radius:.5rem}.integration-details--owned[data-v-64de12e4]{border-color:var(--fm-color-primary-oats);box-shadow:inset .25rem 0 0 var(--fm-color-primary)}.integration-details__header[data-v-64de12e4]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem}.integration-details__title[data-v-64de12e4]{display:flex;align-items:center;gap:.375rem}.integration-details__store-label[data-v-64de12e4]{padding:.25rem .625rem;color:var(--fm-color-primary);background:var(--fm-color-primary-oats);border-radius:999px}.integration-details__row[data-v-64de12e4]{display:grid;grid-template-columns:10rem minmax(0,1fr);align-items:center;gap:1rem}.integration-details__value[data-v-64de12e4]{display:flex;min-width:0;align-items:center;gap:.5rem}.integration-details__action[data-v-64de12e4]{display:inline-flex;flex:0 0 auto}.integration-details__value>code[data-v-64de12e4]{flex:1 1 auto}.integration-details__summary[data-v-64de12e4]{display:flex;justify-content:flex-end;margin-top:.25rem}.integration-details__message[data-v-64de12e4]{max-height:9rem;overflow-y:auto;white-space:pre-wrap}code[data-v-64de12e4]{min-width:0;overflow-wrap:anywhere}@media (max-width: 460px){.integration-details__row[data-v-64de12e4]{grid-template-columns:1fr;gap:.25rem}.integration-details__header[data-v-64de12e4]{align-items:flex-start}}.store-section[data-v-64f1ea7c]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-64f1ea7c]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-64f1ea7c]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.store-card__title[data-v-64f1ea7c]{min-width:0;word-break:break-all}.store-card__actions[data-v-64f1ea7c]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-64f1ea7c]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-64f1ea7c]{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:1rem}.store-field>span[data-v-64f1ea7c]:first-child{color:var(--fm-color-neutral-gray-400)}.store-field>span[data-v-64f1ea7c]:last-child{word-break:break-word}.store-sheet-body[data-v-64f1ea7c]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}@media (max-width: 460px){.store-field[data-v-64f1ea7c]{grid-template-columns:1fr}}.store-section[data-v-fe141f25]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-fe141f25]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-fe141f25]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.25rem}.store-card__title[data-v-fe141f25]{min-width:0;word-break:break-all}.store-card__actions[data-v-fe141f25]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-fe141f25]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-fe141f25]{display:grid;grid-template-columns:9rem minmax(0,1fr);align-items:start;-moz-column-gap:1rem;column-gap:1rem;row-gap:.125rem}.store-field>span[data-v-fe141f25]:last-child{word-break:break-word}.store-sheet-body[data-v-fe141f25]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}.store-sheet-activate[data-v-fe141f25]{padding-top:1.25rem;border-top:1px solid #e5e7eb}.store-sheet-activate__hint[data-v-fe141f25]{margin-top:.5rem}@media (max-width: 460px){.store-field[data-v-fe141f25]{grid-template-columns:1fr}}.store-section[data-v-b94bbdb0]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-b94bbdb0]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-b94bbdb0]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.store-card__title[data-v-b94bbdb0]{min-width:0;word-break:break-all}.store-card__actions[data-v-b94bbdb0]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-b94bbdb0]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-b94bbdb0]{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:1rem}.store-field>span[data-v-b94bbdb0]:first-child{color:var(--fm-color-neutral-gray-400)}.store-field>span[data-v-b94bbdb0]:last-child{word-break:break-word}.store-sheet-body[data-v-b94bbdb0]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}@media (max-width: 460px){.store-field[data-v-b94bbdb0]{grid-template-columns:1fr}}[data-v-91393c58] .fm-checkbox--wrapper:has(input:disabled){pointer-events:none}[data-v-a959025e] .flex.flex-col.gap-8>:first-child,[data-v-a959025e] .flex.flex-col.gap-8>:last-child{display:none}.toggle[data-v-5266c20e]{position:relative;flex-shrink:0;width:52px;height:32px;padding:0;border:none;border-radius:9999px;background:var(--fm-color-neutral-gray-200);cursor:pointer;transition:background-color .2s ease-out}.toggle[data-v-5266c20e]:focus{outline:none}.toggle[data-v-5266c20e]:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--fm-color-primary) 40%,transparent)}.toggle--on[data-v-5266c20e]{background:var(--fm-color-primary)}.toggle__thumb[data-v-5266c20e]{position:absolute;top:50%;left:8px;width:18px;height:18px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #0003;transform:translateY(-50%);transition:all .2s ease-out}.toggle--on .toggle__thumb[data-v-5266c20e]{left:24px;width:24px;height:24px}.toggle:active .toggle__thumb[data-v-5266c20e]{transform:translateY(-50%) scale(1.1)}.delivery-company-filter-toolbar[data-v-e2763a83]{display:flex;flex-direction:row;justify-content:space-between}@media (max-width: 647px){.delivery-company-filter-toolbar[data-v-e2763a83]{flex-direction:column;flex-wrap:wrap}}.preview-frame[data-v-bd8d2976]{position:relative;width:100%;overflow:hidden;border:1px solid #d1d5db;border-radius:12px;aspect-ratio:16 / 9;background:#111827;box-shadow:0 16px 40px #0f172a1f}.preview-iframe[data-v-bd8d2976]{display:block;width:100%;height:100%;border:0;background:#f3f4f6}.preview-status[data-v-bd8d2976]{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-content:center;gap:12px;background:#f9fafbf0;color:#4b5563;text-align:center;font-size:13px}.preview-status p[data-v-bd8d2976]{margin:0}.preview-status[data-v-bd8d2976] button{justify-self:center}.preview-loading[data-v-bd8d2976]{display:grid;justify-items:center;gap:10px}.preview-loading span[data-v-bd8d2976]{width:24px;height:24px;border:3px solid #fed7aa;border-top-color:#ef661f;border-radius:50%;animation:preview-spin-bd8d2976 .8s linear infinite}@keyframes preview-spin-bd8d2976{to{transform:rotate(360deg)}}.canvas-area[data-v-cdd742c6]{position:relative;display:flex;min-width:0;min-height:0;flex-direction:column}.canvas-area-card[data-v-cdd742c6]{display:flex;flex:1;min-width:0;min-height:0;flex-direction:column;gap:8px;overflow:visible;border:1.5px dashed rgb(255 255 255 / 55%);border-radius:10px;padding:6px;background:#11182752;text-align:left}.canvas-area-card[data-v-cdd742c6]:hover{background:#1118276b}.canvas-area-active[data-v-cdd742c6]{border-style:solid;border-color:#f97316;background:#f973164d;box-shadow:0 0 0 3px #f973161f}.canvas-area-context[data-v-cdd742c6]{border-style:solid;border-color:#fed7aa;background:#fdba7433}.canvas-area-droppable[data-v-cdd742c6]{border-color:#f97316;background:#f973165c}.canvas-area-drop-over[data-v-cdd742c6]{border-style:solid;box-shadow:0 0 0 3px #f9731633}.canvas-area-head[data-v-cdd742c6]{display:flex;align-items:center;gap:8px}.canvas-area-name[data-v-cdd742c6],.canvas-area-share[data-v-cdd742c6]{color:#f9fafb;text-shadow:0 1px 3px rgb(0 0 0 / 70%);font-weight:700}.canvas-area-name[data-v-cdd742c6]{font-size:10px;letter-spacing:.06em;text-transform:uppercase}.canvas-area-share[data-v-cdd742c6]{margin-left:auto;font-size:12px;font-variant-numeric:tabular-nums}.canvas-area-remove[data-v-cdd742c6]{display:grid;flex:0 0 auto;place-items:center;border-radius:999px;padding:2px;background:#1118278c;color:#f9fafb;opacity:0;transition:opacity .1s ease}.canvas-area-remove[data-v-cdd742c6]:hover{background:#fef2f2;color:#dc2626}.canvas-edge[data-v-cdd742c6]{position:absolute;display:grid;place-items:center;width:20px;height:20px;border-radius:999px;background:#fff;box-shadow:0 0 0 1.5px #d1d5db;color:#9ca3af;opacity:0;transition:opacity .1s ease;z-index:1}.canvas-area:hover .canvas-edge[data-v-cdd742c6],.canvas-area:focus-within .canvas-edge[data-v-cdd742c6],.canvas-area:hover .canvas-area-remove[data-v-cdd742c6],.canvas-area:focus-within .canvas-area-remove[data-v-cdd742c6]{opacity:1}.canvas-edge[data-v-cdd742c6]:hover{box-shadow:0 0 0 1.5px #f97316;color:#f97316}.canvas-edge-right[data-v-cdd742c6]{top:50%;right:-10px;transform:translateY(-50%)}.canvas-edge-bottom[data-v-cdd742c6]{bottom:-10px;left:50%;transform:translate(-50%)}.canvas-chips[data-v-cdd742c6]{display:flex;min-height:0;flex:1;flex-direction:column}.canvas-chip[data-v-cdd742c6]{display:flex;align-items:center;align-self:flex-start;max-width:100%;gap:6px;border:1px solid #e5e7eb;border-radius:8px;padding:6px 8px;background:#ffffffeb;color:#374151;font-size:12px;text-align:left;cursor:grab}.canvas-chip[data-v-cdd742c6]:hover{border-color:#fdba74}.canvas-chip-active[data-v-cdd742c6]{border-color:#f97316;box-shadow:inset 4px 0 #f97316,0 0 0 3px #f973161f;font-weight:600}.canvas-chip-active .canvas-chip-grip[data-v-cdd742c6]{color:#f97316}.canvas-chip-context[data-v-cdd742c6]{border-color:#fed7aa;background:#fffdfa}.canvas-chip[data-v-cdd742c6]:active{cursor:grabbing}.canvas-chip-grip[data-v-cdd742c6]{flex:0 0 auto;color:#9ca3af}.canvas-chip-label[data-v-cdd742c6]{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-chip-swap[data-v-cdd742c6]{display:grid;flex:0 0 auto;place-items:center;margin-left:2px;border-radius:6px;padding:2px;color:#9ca3af;opacity:0;transition:opacity .1s ease}.canvas-chip:hover .canvas-chip-swap[data-v-cdd742c6],.canvas-chip:focus-within .canvas-chip-swap[data-v-cdd742c6]{opacity:1}.canvas-chip-swap[data-v-cdd742c6]:hover{background:#fff;color:#f97316}.canvas-area-empty[data-v-cdd742c6]{display:grid;flex:1;place-items:center;border:1px dashed rgb(255 255 255 / 60%);border-radius:8px;background:transparent;color:#f3f4f6;font-size:11px;font-family:inherit;cursor:pointer}.canvas-area-empty[data-v-cdd742c6]:hover{border-color:#f97316;color:#f97316}@media (hover: none),(pointer: coarse){.canvas-edge[data-v-cdd742c6],.canvas-area-remove[data-v-cdd742c6],.canvas-chip-swap[data-v-cdd742c6]{opacity:1}}.canvas[data-v-eb790981]{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;min-height:0}.canvas-row[data-v-eb790981]{flex-direction:row}.canvas-column[data-v-eb790981]{flex-direction:column}.canvas-group[data-v-eb790981]{position:relative;display:flex;min-width:0;min-height:0}.canvas-divider[data-v-eb790981]{position:absolute;z-index:2;display:grid;place-items:center;touch-action:none}.divider-vertical[data-v-eb790981]{top:0;bottom:0;width:10px;transform:translate(-50%);cursor:col-resize}.divider-horizontal[data-v-eb790981]{left:0;right:0;height:10px;transform:translateY(-50%);cursor:row-resize}.canvas-divider-grip[data-v-eb790981]{border-radius:999px;background:#d1d5db}.divider-vertical .canvas-divider-grip[data-v-eb790981]{height:34px;width:3px}.divider-horizontal .canvas-divider-grip[data-v-eb790981]{height:3px;width:34px}.canvas-divider:hover .canvas-divider-grip[data-v-eb790981]{background:#f97316}.module-picker[data-v-2892f182]{display:flex;flex-direction:column;gap:18px}.module-picker-hint[data-v-2892f182]{margin:0;color:#6b7280;font-size:12px}.module-picker-group[data-v-2892f182]{display:flex;flex-direction:column;gap:8px}.module-picker-group-label[data-v-2892f182]{margin:0;color:#9ca3af;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.module-picker-grid[data-v-2892f182]{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}.module-picker-card[data-v-2892f182]{display:flex;flex-direction:column;align-items:center;gap:8px;border:1px solid #e5e7eb;border-radius:10px;padding:14px 10px;background:#fff;color:#374151;font-size:13px;text-align:center;cursor:pointer}.module-picker-card[data-v-2892f182]:hover{border-color:#f97316;background:#fffbf5}.module-picker-icon[data-v-2892f182]{display:grid;height:36px;width:36px;place-items:center;border-radius:8px;background:#f3f4f6;color:#4b5563}.module-picker-label[data-v-2892f182]{line-height:1.3;overflow-wrap:anywhere}.media-field[data-v-839ff846]{display:flex;flex-direction:column;gap:6px}.media-label[data-v-839ff846]{color:#4b5563;font-size:12px}.media-thumb[data-v-839ff846]{height:72px;width:100%;border-radius:8px;border:1px solid #e5e7eb;-o-object-fit:cover;object-fit:cover}.media-empty[data-v-839ff846]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#9ca3af;font-size:12px}.media-warning[data-v-839ff846]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#b54708;font-size:12px}.media-actions[data-v-839ff846]{display:flex;gap:6px}.inspector[data-v-4cc442cf]{display:flex;flex-direction:column;gap:14px}.inspector-scope[data-v-4cc442cf]{align-self:stretch}.inspector-breadcrumb[data-v-4cc442cf]{display:flex;align-items:center;gap:2px;color:#6b7280;font-size:11px}.inspector-section[data-v-4cc442cf]{display:flex;flex-direction:column;gap:10px;border-top:1px solid #e5e7eb;padding-top:12px}.inspector-section-title[data-v-4cc442cf]{color:#9ca3af;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.inspector-note[data-v-4cc442cf]{color:#6b7280;font-size:11px;line-height:1.45}.inspector-warning[data-v-4cc442cf]{display:flex;align-items:flex-start;gap:6px;border-radius:8px;background:#fffbeb;padding:8px 10px;color:#92400e;font-size:12px}.inspector-list[data-v-4cc442cf]{display:flex;flex-direction:column;gap:8px}.inspector-list-head[data-v-4cc442cf]{display:flex;align-items:baseline;gap:6px}.inspector-list-count[data-v-4cc442cf]{border-radius:999px;background:#f3f4f6;padding:0 6px;color:#6b7280;font-size:10px;font-variant-numeric:tabular-nums}.inspector-item[data-v-4cc442cf]{display:flex;flex-direction:column;gap:10px;border:1px solid #e5e7eb;border-radius:10px;padding:10px;background:#fcfcfd}.inspector-item-head[data-v-4cc442cf]{display:flex;align-items:center;gap:2px}.inspector-item-name[data-v-4cc442cf]{flex:1;color:#6b7280;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.inspector-item-action[data-v-4cc442cf]{display:grid;flex:0 0 auto;place-items:center;border-radius:6px;padding:2px;color:#9ca3af}.inspector-item-action[data-v-4cc442cf]:hover:not(:disabled){background:#fff7ed;color:#f97316}.inspector-item-action[data-v-4cc442cf]:disabled{opacity:.35}.inspector-list-add[data-v-4cc442cf]{display:flex;gap:6px}.media-field[data-v-4cc442cf]{display:flex;flex-direction:column;gap:6px}.media-label[data-v-4cc442cf]{color:#4b5563;font-size:12px}.media-thumb[data-v-4cc442cf]{height:72px;width:100%;border-radius:8px;border:1px solid #e5e7eb;-o-object-fit:cover;object-fit:cover}.media-empty[data-v-4cc442cf]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#9ca3af;font-size:12px}.media-actions[data-v-4cc442cf]{display:flex;gap:6px}.editor-head[data-v-a673333e]{display:flex;shrink:0;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid #e5e7eb;padding:12px 20px}.editor-identity[data-v-a673333e]{display:flex;min-width:0;align-items:center;gap:10px}.editor-name[data-v-a673333e]{width:min(320px,40vw)}.editor-orientation[data-v-a673333e]{width:160px}.editor-error[data-v-a673333e]{flex-shrink:0;margin:12px 16px 0;border-radius:8px;background:#fef2f2;padding:8px 12px;color:#b91c1c;font-size:13px}.rail-scale[data-v-a673333e]{display:flex;flex-direction:column;gap:6px;margin-bottom:18px;border-bottom:1px solid #e5e7eb;padding-bottom:16px}.rail-scale-label[data-v-a673333e]{color:#4b5563;font-size:12px;font-weight:600}.rail-scale-hint[data-v-a673333e]{margin:0;color:#6b7280;font-size:11px;line-height:1.4}.rail-scale-warning[data-v-a673333e]{margin:0;border-radius:8px;padding:6px 8px;color:#9a3412;background:#fff7ed;font-size:11px;line-height:1.4}.editor-body[data-v-a673333e]{display:grid;min-height:0;flex:1;grid-template-columns:268px minmax(0,1fr) 320px}.editor-rail[data-v-a673333e],.editor-inspector[data-v-a673333e]{min-height:0;overflow:auto;padding:16px}.editor-rail[data-v-a673333e]{border-right:1px solid #e5e7eb;background:#f9fafb}.editor-inspector[data-v-a673333e]{border-left:1px solid #e5e7eb;background:#f9fafb}.editor-stage[data-v-a673333e]{display:flex;min-height:0;flex-direction:column;gap:12px;overflow:auto;padding:16px}.stage-preview[data-v-a673333e]{display:flex;min-height:0;flex:1;align-items:center;justify-content:center}.preview-box[data-v-a673333e]{position:relative;margin:0 auto}.preview-box.preview-landscape[data-v-a673333e]{width:100%;max-height:72vh;aspect-ratio:16 / 9}.preview-box.preview-portrait[data-v-a673333e]{height:72vh;max-width:100%;aspect-ratio:9 / 16}.preview-frame[data-v-a673333e]{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;border:1px solid #e5e7eb;border-radius:12px;background:#101828}.preview-frame[data-v-a673333e]>*{width:100%;height:100%}.preview-edit-overlay[data-v-a673333e]{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;pointer-events:none;transition:opacity .15s ease}.preview-box:hover .preview-edit-overlay[data-v-a673333e],.preview-box:focus-within .preview-edit-overlay[data-v-a673333e],.preview-edit-overlay.preview-edit-overlay-active[data-v-a673333e]{opacity:1;pointer-events:auto}@media (hover: none),(pointer: coarse){.preview-edit-overlay[data-v-a673333e]{opacity:1;pointer-events:auto}}.layout-bar[data-v-a673333e]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.layout-bar-title[data-v-a673333e]{display:flex;min-width:0;flex-direction:column;gap:2px}.layout-title[data-v-a673333e]{color:#111827;font-size:13px;font-weight:600}.layout-hint[data-v-a673333e]{color:#9ca3af;font-size:11px}.layout-actions[data-v-a673333e]{display:flex;flex-shrink:0;align-items:center;gap:6px}.layout-conflict[data-v-a673333e]{display:flex;align-items:flex-start;gap:6px;border-radius:8px;background:#fffbeb;padding:8px 10px;color:#92400e;font-size:12px;cursor:pointer}.preset-row[data-v-a673333e]{display:flex;flex-wrap:wrap;gap:8px;border-radius:10px;background:#f9fafb;padding:10px}.preset-card[data-v-a673333e]{display:flex;width:108px;flex-direction:column;gap:6px;border:1px solid #d1d5db;border-radius:10px;padding:8px;background:#fff;text-align:left}.preset-card[data-v-a673333e]:hover{border-color:#f97316;background:#fff7ed}.preset-diagram[data-v-a673333e]{display:flex;height:34px;gap:3px;border-radius:6px;background:#f3f4f6;padding:3px}.preset-row-dir[data-v-a673333e]{flex-direction:row}.preset-column-dir[data-v-a673333e]{flex-direction:column}.preset-cell[data-v-a673333e]{flex-basis:0;border-radius:4px;background:#fdba74}.preset-label[data-v-a673333e]{color:#374151;font-size:11px;line-height:1.3}@media (max-width: 1280px){.editor-body[data-v-a673333e]{grid-template-columns:220px minmax(0,1fr)}.editor-inspector[data-v-a673333e]{grid-column:1 / -1;border-left:0;border-top:1px solid #e5e7eb}}.layout-split[data-v-5595b416]{display:flex;min-width:0;min-height:0;flex:1;gap:6px}.layout-row[data-v-5595b416]{flex-direction:row}.layout-column[data-v-5595b416]{flex-direction:column}.layout-zone[data-v-5595b416]{display:flex;min-width:0;min-height:36px;flex:1;flex-direction:row;align-items:center;gap:8px;overflow:hidden;border:1.5px dashed #d1d5db;border-radius:10px;padding:6px 10px;background:#fff;text-align:left;transition:border-color .12s ease,background .12s ease}.layout-zone[data-v-5595b416]:hover{border-color:#fdba74;background:#fffbf5}.layout-zone-selected[data-v-5595b416]{border-style:solid;border-color:#f97316;background:#fff7ed;box-shadow:inset 0 0 0 1px #f97316}.layout-zone-index[data-v-5595b416]{flex:none;color:#6b7280;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.layout-zone-blocks[data-v-5595b416]{display:flex;min-width:0;gap:4px}.layout-zone-chip[data-v-5595b416]{display:inline-flex;max-width:100%;align-items:center;gap:4px;border-radius:999px;background:#f3f4f6;padding:3px 8px;color:#374151;font-size:11px}.display-toolbar[data-v-a2dda95a]{display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid #e5e7eb;padding-bottom:14px}.display-controls[data-v-a2dda95a]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:12px}.display-restaurant-select[data-v-a2dda95a]{width:min(360px,100%)}.display-outlet[data-v-a2dda95a]{display:flex;align-items:center;gap:16px}.display-entitlement[data-v-a2dda95a]{color:#6b7280;font-size:12px;white-space:nowrap}.restriction-note[data-v-a2dda95a]{margin-top:12px;border:1px solid #fed7aa;border-radius:10px;padding:10px 12px;color:#9a3412;background:#fff7ed;font-size:13px}.empty-state[data-v-a2dda95a]{display:grid;justify-items:center;gap:6px;border:1px dashed #d1d5db;border-radius:12px;padding:56px 20px;color:#6b7280;text-align:center}.empty-state strong[data-v-a2dda95a]{color:#111827}.layout-thumb[data-v-a2dda95a]{display:flex;height:auto;min-height:96px;margin-top:16px;border-radius:10px;background:#f3f4f6;padding:5px;pointer-events:none}.thumb-caption[data-v-a2dda95a]{margin-top:8px;color:#6b7280;font-size:11px}.resource-card[data-v-a2dda95a]{border:1px solid #e5e7eb;border-radius:12px;padding:20px;background:#fff;box-shadow:0 2px 8px #0000000a}.mode-badge[data-v-a2dda95a],.status-badge[data-v-a2dda95a]{border-radius:999px;padding:3px 8px;background:#f3f4f6;font-size:11px;font-weight:700}.status-badge.active[data-v-a2dda95a]{color:#166534;background:#dcfce7}.status-badge.disabled[data-v-a2dda95a]{color:#991b1b;background:#fee2e2}.status-badge.unlicensed[data-v-a2dda95a]{color:#b42318;background:#fef3f2;border:1px solid #fecdca}.online-dot[data-v-a2dda95a]{color:#6b7280;font-size:11px}.online-dot[data-v-a2dda95a]:before{display:inline-block;width:7px;height:7px;margin-right:5px;border-radius:50%;background:#9ca3af;content:""}.online-dot.online[data-v-a2dda95a]{color:#15803d}.online-dot.online[data-v-a2dda95a]:before{background:#22c55e}.meta-grid[data-v-a2dda95a]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:18px;border-top:1px solid #f0f0f0;padding-top:16px}.meta-grid dt[data-v-a2dda95a]{color:#6b7280;font-size:11px}.meta-grid dd[data-v-a2dda95a]{overflow:hidden;margin-top:2px;font-size:12px;text-overflow:ellipsis;white-space:nowrap}@media (max-width:640px){.display-toolbar[data-v-a2dda95a]{align-items:flex-start}.display-controls[data-v-a2dda95a]{align-items:stretch;flex-direction:column}.display-outlet[data-v-a2dda95a]{align-items:stretch;flex-direction:column;gap:8px}.display-restaurant-select[data-v-a2dda95a]{width:100%}}
1
+ @charset "UTF-8";.integration-details[data-v-64de12e4]{display:flex;flex-direction:column;gap:.625rem;padding:1rem;margin-top:1rem;border:1px solid #e5e7eb;border-radius:.5rem}.integration-details--owned[data-v-64de12e4]{border-color:var(--fm-color-primary-oats);box-shadow:inset .25rem 0 0 var(--fm-color-primary)}.integration-details__header[data-v-64de12e4]{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:.5rem}.integration-details__title[data-v-64de12e4]{display:flex;align-items:center;gap:.375rem}.integration-details__store-label[data-v-64de12e4]{padding:.25rem .625rem;color:var(--fm-color-primary);background:var(--fm-color-primary-oats);border-radius:999px}.integration-details__row[data-v-64de12e4]{display:grid;grid-template-columns:10rem minmax(0,1fr);align-items:center;gap:1rem}.integration-details__value[data-v-64de12e4]{display:flex;min-width:0;align-items:center;gap:.5rem}.integration-details__action[data-v-64de12e4]{display:inline-flex;flex:0 0 auto}.integration-details__value>code[data-v-64de12e4]{flex:1 1 auto}.integration-details__summary[data-v-64de12e4]{display:flex;justify-content:flex-end;margin-top:.25rem}.integration-details__message[data-v-64de12e4]{max-height:9rem;overflow-y:auto;white-space:pre-wrap}code[data-v-64de12e4]{min-width:0;overflow-wrap:anywhere}@media (max-width: 460px){.integration-details__row[data-v-64de12e4]{grid-template-columns:1fr;gap:.25rem}.integration-details__header[data-v-64de12e4]{align-items:flex-start}}.store-section[data-v-64f1ea7c]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-64f1ea7c]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-64f1ea7c]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.store-card__title[data-v-64f1ea7c]{min-width:0;word-break:break-all}.store-card__actions[data-v-64f1ea7c]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-64f1ea7c]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-64f1ea7c]{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:1rem}.store-field>span[data-v-64f1ea7c]:first-child{color:var(--fm-color-neutral-gray-400)}.store-field>span[data-v-64f1ea7c]:last-child{word-break:break-word}.store-sheet-body[data-v-64f1ea7c]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}@media (max-width: 460px){.store-field[data-v-64f1ea7c]{grid-template-columns:1fr}}.store-section[data-v-fe141f25]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-fe141f25]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-fe141f25]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1.25rem}.store-card__title[data-v-fe141f25]{min-width:0;word-break:break-all}.store-card__actions[data-v-fe141f25]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-fe141f25]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-fe141f25]{display:grid;grid-template-columns:9rem minmax(0,1fr);align-items:start;-moz-column-gap:1rem;column-gap:1rem;row-gap:.125rem}.store-field>span[data-v-fe141f25]:last-child{word-break:break-word}.store-sheet-body[data-v-fe141f25]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}.store-sheet-activate[data-v-fe141f25]{padding-top:1.25rem;border-top:1px solid #e5e7eb}.store-sheet-activate__hint[data-v-fe141f25]{margin-top:.5rem}@media (max-width: 460px){.store-field[data-v-fe141f25]{grid-template-columns:1fr}}.store-section[data-v-b94bbdb0]{border-top:1px solid #e5e7eb;padding-top:1.5rem}.store-card[data-v-b94bbdb0]{padding:1.25rem;margin-bottom:1rem}.store-card__top[data-v-b94bbdb0]{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.store-card__title[data-v-b94bbdb0]{min-width:0;word-break:break-all}.store-card__actions[data-v-b94bbdb0]{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:.5rem;flex-shrink:0}.store-card__fields[data-v-b94bbdb0]{display:flex;flex-direction:column;gap:.625rem}.store-field[data-v-b94bbdb0]{display:grid;grid-template-columns:9rem minmax(0,1fr);gap:1rem}.store-field>span[data-v-b94bbdb0]:first-child{color:var(--fm-color-neutral-gray-400)}.store-field>span[data-v-b94bbdb0]:last-child{word-break:break-word}.store-sheet-body[data-v-b94bbdb0]{display:flex;flex-direction:column;gap:1rem;padding-top:.5rem}@media (max-width: 460px){.store-field[data-v-b94bbdb0]{grid-template-columns:1fr}}[data-v-91393c58] .fm-checkbox--wrapper:has(input:disabled){pointer-events:none}[data-v-a959025e] .flex.flex-col.gap-8>:first-child,[data-v-a959025e] .flex.flex-col.gap-8>:last-child{display:none}.toggle[data-v-5266c20e]{position:relative;flex-shrink:0;width:52px;height:32px;padding:0;border:none;border-radius:9999px;background:var(--fm-color-neutral-gray-200);cursor:pointer;transition:background-color .2s ease-out}.toggle[data-v-5266c20e]:focus{outline:none}.toggle[data-v-5266c20e]:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb,var(--fm-color-primary) 40%,transparent)}.toggle--on[data-v-5266c20e]{background:var(--fm-color-primary)}.toggle__thumb[data-v-5266c20e]{position:absolute;top:50%;left:8px;width:18px;height:18px;border-radius:9999px;background:#fff;box-shadow:0 1px 2px #0003;transform:translateY(-50%);transition:all .2s ease-out}.toggle--on .toggle__thumb[data-v-5266c20e]{left:24px;width:24px;height:24px}.toggle:active .toggle__thumb[data-v-5266c20e]{transform:translateY(-50%) scale(1.1)}.delivery-company-filter-toolbar[data-v-e2763a83]{display:flex;flex-direction:row;justify-content:space-between}@media (max-width: 647px){.delivery-company-filter-toolbar[data-v-e2763a83]{flex-direction:column;flex-wrap:wrap}}.scrollbar-thin[data-v-09464e01]::-webkit-scrollbar{width:6px}.scrollbar-thin[data-v-09464e01]::-webkit-scrollbar-track{background:transparent;border-radius:3px;margin:4px 0}.scrollbar-thin[data-v-09464e01]::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:3px}.scrollbar-thin[data-v-09464e01]::-webkit-scrollbar-thumb:hover{background:#9ca3af}.time-picker-field[data-v-09464e01]{width:100%;height:40px;border-width:1.5px;border-style:solid;border-color:#d1d5db;border-radius:.625rem;padding:8px 36px 8px 12px;font-size:.95rem;line-height:1.25rem;font-weight:500;transition:all .2s;background-color:#fff;outline:none;box-sizing:border-box}.time-picker-field[data-v-09464e01]:hover{border-color:#9ca3af}.time-picker-field[data-v-09464e01]:focus{border-color:#f97316!important;background-color:#fff7ed!important}.preview-frame[data-v-bd8d2976]{position:relative;width:100%;overflow:hidden;border:1px solid #d1d5db;border-radius:12px;aspect-ratio:16 / 9;background:#111827;box-shadow:0 16px 40px #0f172a1f}.preview-iframe[data-v-bd8d2976]{display:block;width:100%;height:100%;border:0;background:#f3f4f6}.preview-status[data-v-bd8d2976]{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-content:center;gap:12px;background:#f9fafbf0;color:#4b5563;text-align:center;font-size:13px}.preview-status p[data-v-bd8d2976]{margin:0}.preview-status[data-v-bd8d2976] button{justify-self:center}.preview-loading[data-v-bd8d2976]{display:grid;justify-items:center;gap:10px}.preview-loading span[data-v-bd8d2976]{width:24px;height:24px;border:3px solid #fed7aa;border-top-color:#ef661f;border-radius:50%;animation:preview-spin-bd8d2976 .8s linear infinite}@keyframes preview-spin-bd8d2976{to{transform:rotate(360deg)}}.canvas-area[data-v-cdd742c6]{position:relative;display:flex;min-width:0;min-height:0;flex-direction:column}.canvas-area-card[data-v-cdd742c6]{display:flex;flex:1;min-width:0;min-height:0;flex-direction:column;gap:8px;overflow:visible;border:1.5px dashed rgb(255 255 255 / 55%);border-radius:10px;padding:6px;background:#11182752;text-align:left}.canvas-area-card[data-v-cdd742c6]:hover{background:#1118276b}.canvas-area-active[data-v-cdd742c6]{border-style:solid;border-color:#f97316;background:#f973164d;box-shadow:0 0 0 3px #f973161f}.canvas-area-context[data-v-cdd742c6]{border-style:solid;border-color:#fed7aa;background:#fdba7433}.canvas-area-droppable[data-v-cdd742c6]{border-color:#f97316;background:#f973165c}.canvas-area-drop-over[data-v-cdd742c6]{border-style:solid;box-shadow:0 0 0 3px #f9731633}.canvas-area-head[data-v-cdd742c6]{display:flex;align-items:center;gap:8px}.canvas-area-name[data-v-cdd742c6],.canvas-area-share[data-v-cdd742c6]{color:#f9fafb;text-shadow:0 1px 3px rgb(0 0 0 / 70%);font-weight:700}.canvas-area-name[data-v-cdd742c6]{font-size:10px;letter-spacing:.06em;text-transform:uppercase}.canvas-area-share[data-v-cdd742c6]{margin-left:auto;font-size:12px;font-variant-numeric:tabular-nums}.canvas-area-remove[data-v-cdd742c6]{display:grid;flex:0 0 auto;place-items:center;border-radius:999px;padding:2px;background:#1118278c;color:#f9fafb;opacity:0;transition:opacity .1s ease}.canvas-area-remove[data-v-cdd742c6]:hover{background:#fef2f2;color:#dc2626}.canvas-edge[data-v-cdd742c6]{position:absolute;display:grid;place-items:center;width:20px;height:20px;border-radius:999px;background:#fff;box-shadow:0 0 0 1.5px #d1d5db;color:#9ca3af;opacity:0;transition:opacity .1s ease;z-index:1}.canvas-area:hover .canvas-edge[data-v-cdd742c6],.canvas-area:focus-within .canvas-edge[data-v-cdd742c6],.canvas-area:hover .canvas-area-remove[data-v-cdd742c6],.canvas-area:focus-within .canvas-area-remove[data-v-cdd742c6]{opacity:1}.canvas-edge[data-v-cdd742c6]:hover{box-shadow:0 0 0 1.5px #f97316;color:#f97316}.canvas-edge-right[data-v-cdd742c6]{top:50%;right:-10px;transform:translateY(-50%)}.canvas-edge-bottom[data-v-cdd742c6]{bottom:-10px;left:50%;transform:translate(-50%)}.canvas-chips[data-v-cdd742c6]{display:flex;min-height:0;flex:1;flex-direction:column}.canvas-chip[data-v-cdd742c6]{display:flex;align-items:center;align-self:flex-start;max-width:100%;gap:6px;border:1px solid #e5e7eb;border-radius:8px;padding:6px 8px;background:#ffffffeb;color:#374151;font-size:12px;text-align:left;cursor:grab}.canvas-chip[data-v-cdd742c6]:hover{border-color:#fdba74}.canvas-chip-active[data-v-cdd742c6]{border-color:#f97316;box-shadow:inset 4px 0 #f97316,0 0 0 3px #f973161f;font-weight:600}.canvas-chip-active .canvas-chip-grip[data-v-cdd742c6]{color:#f97316}.canvas-chip-context[data-v-cdd742c6]{border-color:#fed7aa;background:#fffdfa}.canvas-chip[data-v-cdd742c6]:active{cursor:grabbing}.canvas-chip-grip[data-v-cdd742c6]{flex:0 0 auto;color:#9ca3af}.canvas-chip-label[data-v-cdd742c6]{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.canvas-chip-swap[data-v-cdd742c6]{display:grid;flex:0 0 auto;place-items:center;margin-left:2px;border-radius:6px;padding:2px;color:#9ca3af;opacity:0;transition:opacity .1s ease}.canvas-chip:hover .canvas-chip-swap[data-v-cdd742c6],.canvas-chip:focus-within .canvas-chip-swap[data-v-cdd742c6]{opacity:1}.canvas-chip-swap[data-v-cdd742c6]:hover{background:#fff;color:#f97316}.canvas-area-empty[data-v-cdd742c6]{display:grid;flex:1;place-items:center;border:1px dashed rgb(255 255 255 / 60%);border-radius:8px;background:transparent;color:#f3f4f6;font-size:11px;font-family:inherit;cursor:pointer}.canvas-area-empty[data-v-cdd742c6]:hover{border-color:#f97316;color:#f97316}@media (hover: none),(pointer: coarse){.canvas-edge[data-v-cdd742c6],.canvas-area-remove[data-v-cdd742c6],.canvas-chip-swap[data-v-cdd742c6]{opacity:1}}.canvas[data-v-eb790981]{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;min-height:0}.canvas-row[data-v-eb790981]{flex-direction:row}.canvas-column[data-v-eb790981]{flex-direction:column}.canvas-group[data-v-eb790981]{position:relative;display:flex;min-width:0;min-height:0}.canvas-divider[data-v-eb790981]{position:absolute;z-index:2;display:grid;place-items:center;touch-action:none}.divider-vertical[data-v-eb790981]{top:0;bottom:0;width:10px;transform:translate(-50%);cursor:col-resize}.divider-horizontal[data-v-eb790981]{left:0;right:0;height:10px;transform:translateY(-50%);cursor:row-resize}.canvas-divider-grip[data-v-eb790981]{border-radius:999px;background:#d1d5db}.divider-vertical .canvas-divider-grip[data-v-eb790981]{height:34px;width:3px}.divider-horizontal .canvas-divider-grip[data-v-eb790981]{height:3px;width:34px}.canvas-divider:hover .canvas-divider-grip[data-v-eb790981]{background:#f97316}.module-picker[data-v-2892f182]{display:flex;flex-direction:column;gap:18px}.module-picker-hint[data-v-2892f182]{margin:0;color:#6b7280;font-size:12px}.module-picker-group[data-v-2892f182]{display:flex;flex-direction:column;gap:8px}.module-picker-group-label[data-v-2892f182]{margin:0;color:#9ca3af;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.module-picker-grid[data-v-2892f182]{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}.module-picker-card[data-v-2892f182]{display:flex;flex-direction:column;align-items:center;gap:8px;border:1px solid #e5e7eb;border-radius:10px;padding:14px 10px;background:#fff;color:#374151;font-size:13px;text-align:center;cursor:pointer}.module-picker-card[data-v-2892f182]:hover{border-color:#f97316;background:#fffbf5}.module-picker-icon[data-v-2892f182]{display:grid;height:36px;width:36px;place-items:center;border-radius:8px;background:#f3f4f6;color:#4b5563}.module-picker-label[data-v-2892f182]{line-height:1.3;overflow-wrap:anywhere}.media-field[data-v-839ff846]{display:flex;flex-direction:column;gap:6px}.media-label[data-v-839ff846]{color:#4b5563;font-size:12px}.media-thumb[data-v-839ff846]{height:72px;width:100%;border-radius:8px;border:1px solid #e5e7eb;-o-object-fit:cover;object-fit:cover}.media-empty[data-v-839ff846]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#9ca3af;font-size:12px}.media-warning[data-v-839ff846]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#b54708;font-size:12px}.media-actions[data-v-839ff846]{display:flex;gap:6px}.inspector[data-v-4cc442cf]{display:flex;flex-direction:column;gap:14px}.inspector-scope[data-v-4cc442cf]{align-self:stretch}.inspector-breadcrumb[data-v-4cc442cf]{display:flex;align-items:center;gap:2px;color:#6b7280;font-size:11px}.inspector-section[data-v-4cc442cf]{display:flex;flex-direction:column;gap:10px;border-top:1px solid #e5e7eb;padding-top:12px}.inspector-section-title[data-v-4cc442cf]{color:#9ca3af;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.inspector-note[data-v-4cc442cf]{color:#6b7280;font-size:11px;line-height:1.45}.inspector-warning[data-v-4cc442cf]{display:flex;align-items:flex-start;gap:6px;border-radius:8px;background:#fffbeb;padding:8px 10px;color:#92400e;font-size:12px}.inspector-list[data-v-4cc442cf]{display:flex;flex-direction:column;gap:8px}.inspector-list-head[data-v-4cc442cf]{display:flex;align-items:baseline;gap:6px}.inspector-list-count[data-v-4cc442cf]{border-radius:999px;background:#f3f4f6;padding:0 6px;color:#6b7280;font-size:10px;font-variant-numeric:tabular-nums}.inspector-item[data-v-4cc442cf]{display:flex;flex-direction:column;gap:10px;border:1px solid #e5e7eb;border-radius:10px;padding:10px;background:#fcfcfd}.inspector-item-head[data-v-4cc442cf]{display:flex;align-items:center;gap:2px}.inspector-item-name[data-v-4cc442cf]{flex:1;color:#6b7280;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.inspector-item-action[data-v-4cc442cf]{display:grid;flex:0 0 auto;place-items:center;border-radius:6px;padding:2px;color:#9ca3af}.inspector-item-action[data-v-4cc442cf]:hover:not(:disabled){background:#fff7ed;color:#f97316}.inspector-item-action[data-v-4cc442cf]:disabled{opacity:.35}.inspector-list-add[data-v-4cc442cf]{display:flex;gap:6px}.media-field[data-v-4cc442cf]{display:flex;flex-direction:column;gap:6px}.media-label[data-v-4cc442cf]{color:#4b5563;font-size:12px}.media-thumb[data-v-4cc442cf]{height:72px;width:100%;border-radius:8px;border:1px solid #e5e7eb;-o-object-fit:cover;object-fit:cover}.media-empty[data-v-4cc442cf]{display:grid;height:72px;place-items:center;border:1px dashed #d1d5db;border-radius:8px;color:#9ca3af;font-size:12px}.media-actions[data-v-4cc442cf]{display:flex;gap:6px}.editor-head[data-v-a673333e]{display:flex;shrink:0;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid #e5e7eb;padding:12px 20px}.editor-identity[data-v-a673333e]{display:flex;min-width:0;align-items:center;gap:10px}.editor-name[data-v-a673333e]{width:min(320px,40vw)}.editor-orientation[data-v-a673333e]{width:160px}.editor-error[data-v-a673333e]{flex-shrink:0;margin:12px 16px 0;border-radius:8px;background:#fef2f2;padding:8px 12px;color:#b91c1c;font-size:13px}.rail-scale[data-v-a673333e]{display:flex;flex-direction:column;gap:6px;margin-bottom:18px;border-bottom:1px solid #e5e7eb;padding-bottom:16px}.rail-scale-label[data-v-a673333e]{color:#4b5563;font-size:12px;font-weight:600}.rail-scale-hint[data-v-a673333e]{margin:0;color:#6b7280;font-size:11px;line-height:1.4}.rail-scale-warning[data-v-a673333e]{margin:0;border-radius:8px;padding:6px 8px;color:#9a3412;background:#fff7ed;font-size:11px;line-height:1.4}.editor-body[data-v-a673333e]{display:grid;min-height:0;flex:1;grid-template-columns:268px minmax(0,1fr) 320px}.editor-rail[data-v-a673333e],.editor-inspector[data-v-a673333e]{min-height:0;overflow:auto;padding:16px}.editor-rail[data-v-a673333e]{border-right:1px solid #e5e7eb;background:#f9fafb}.editor-inspector[data-v-a673333e]{border-left:1px solid #e5e7eb;background:#f9fafb}.editor-stage[data-v-a673333e]{display:flex;min-height:0;flex-direction:column;gap:12px;overflow:auto;padding:16px}.stage-preview[data-v-a673333e]{display:flex;min-height:0;flex:1;align-items:center;justify-content:center}.preview-box[data-v-a673333e]{position:relative;margin:0 auto}.preview-box.preview-landscape[data-v-a673333e]{width:100%;max-height:72vh;aspect-ratio:16 / 9}.preview-box.preview-portrait[data-v-a673333e]{height:72vh;max-width:100%;aspect-ratio:9 / 16}.preview-frame[data-v-a673333e]{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;border:1px solid #e5e7eb;border-radius:12px;background:#101828}.preview-frame[data-v-a673333e]>*{width:100%;height:100%}.preview-edit-overlay[data-v-a673333e]{position:absolute;top:0;right:0;bottom:0;left:0;opacity:0;pointer-events:none;transition:opacity .15s ease}.preview-box:hover .preview-edit-overlay[data-v-a673333e],.preview-box:focus-within .preview-edit-overlay[data-v-a673333e],.preview-edit-overlay.preview-edit-overlay-active[data-v-a673333e]{opacity:1;pointer-events:auto}@media (hover: none),(pointer: coarse){.preview-edit-overlay[data-v-a673333e]{opacity:1;pointer-events:auto}}.layout-bar[data-v-a673333e]{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}.layout-bar-title[data-v-a673333e]{display:flex;min-width:0;flex-direction:column;gap:2px}.layout-title[data-v-a673333e]{color:#111827;font-size:13px;font-weight:600}.layout-hint[data-v-a673333e]{color:#9ca3af;font-size:11px}.layout-actions[data-v-a673333e]{display:flex;flex-shrink:0;align-items:center;gap:6px}.layout-conflict[data-v-a673333e]{display:flex;align-items:flex-start;gap:6px;border-radius:8px;background:#fffbeb;padding:8px 10px;color:#92400e;font-size:12px;cursor:pointer}.preset-row[data-v-a673333e]{display:flex;flex-wrap:wrap;gap:8px;border-radius:10px;background:#f9fafb;padding:10px}.preset-card[data-v-a673333e]{display:flex;width:108px;flex-direction:column;gap:6px;border:1px solid #d1d5db;border-radius:10px;padding:8px;background:#fff;text-align:left}.preset-card[data-v-a673333e]:hover{border-color:#f97316;background:#fff7ed}.preset-diagram[data-v-a673333e]{display:flex;height:34px;gap:3px;border-radius:6px;background:#f3f4f6;padding:3px}.preset-row-dir[data-v-a673333e]{flex-direction:row}.preset-column-dir[data-v-a673333e]{flex-direction:column}.preset-cell[data-v-a673333e]{flex-basis:0;border-radius:4px;background:#fdba74}.preset-label[data-v-a673333e]{color:#374151;font-size:11px;line-height:1.3}@media (max-width: 1280px){.editor-body[data-v-a673333e]{grid-template-columns:220px minmax(0,1fr)}.editor-inspector[data-v-a673333e]{grid-column:1 / -1;border-left:0;border-top:1px solid #e5e7eb}}.layout-split[data-v-5595b416]{display:flex;min-width:0;min-height:0;flex:1;gap:6px}.layout-row[data-v-5595b416]{flex-direction:row}.layout-column[data-v-5595b416]{flex-direction:column}.layout-zone[data-v-5595b416]{display:flex;min-width:0;min-height:36px;flex:1;flex-direction:row;align-items:center;gap:8px;overflow:hidden;border:1.5px dashed #d1d5db;border-radius:10px;padding:6px 10px;background:#fff;text-align:left;transition:border-color .12s ease,background .12s ease}.layout-zone[data-v-5595b416]:hover{border-color:#fdba74;background:#fffbf5}.layout-zone-selected[data-v-5595b416]{border-style:solid;border-color:#f97316;background:#fff7ed;box-shadow:inset 0 0 0 1px #f97316}.layout-zone-index[data-v-5595b416]{flex:none;color:#6b7280;font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase}.layout-zone-blocks[data-v-5595b416]{display:flex;min-width:0;gap:4px}.layout-zone-chip[data-v-5595b416]{display:inline-flex;max-width:100%;align-items:center;gap:4px;border-radius:999px;background:#f3f4f6;padding:3px 8px;color:#374151;font-size:11px}.vacp-color-picker{max-inline-size:var(--vacp-width-color-space, 300px);padding:var(--vacp-spacing, 6px);display:grid;grid-gap:var(--vacp-spacing, 6px);grid-template-columns:1fr min-content;font-size:var(--vacp-font-size, .8em);font-family:var(--vacp-font-family, -apple-system, BlinkMacSystemFont, Segoe UI, Arial, sans-serif);color:var(--vacp-color-text, currentColor);background-color:var(--vacp-color-background, #fff)}.vacp-color-picker,.vacp-color-picker *,.vacp-color-picker *:before,.vacp-color-picker *:after{box-sizing:border-box}.vacp-color-picker :focus{outline:2px solid var(--vacp-color-focus, #19f)}.vacp-color-picker button::-moz-focus-inner{border:none;padding:0}:where(.vacp-color-picker) button{inline-size:calc(var(--vacp-spacing, 6px) * 6);block-size:calc(var(--vacp-spacing, 6px) * 6);margin:0;padding:var(--vacp-spacing, 6px);display:flex;align-items:center;justify-content:center;border:var(--vacp-width-border, 1px) solid transparent;border-radius:50%;font:inherit;color:var(--vacp-color-text-input, currentColor);background-color:var(--vacp-color-background-input, #fff)}:where(.vacp-color-picker) button:focus{border-color:var(--vacp-color-border, #000)}:where(.vacp-color-picker) button:enabled:hover{background-color:#0002}.vacp-color-space{grid-column:1/-1;overflow:hidden;aspect-ratio:1/.6}.vacp-color-space-thumb{--vacp-thumb-size: calc(var(--vacp-spacing, 6px) * 4);inline-size:var(--vacp-thumb-size);block-size:var(--vacp-thumb-size);margin-inline-start:calc(-1 * var(--vacp-thumb-size) / 2);margin-block-end:calc(-1 * var(--vacp-thumb-size) / 2);border:3px solid #fff;border-radius:50%;box-shadow:0 0 0 var(--vacp-width-border, 1px) var(--vacp-color-border, #000);transform:rotate(0)}.vacp-color-space-thumb:focus{outline-color:transparent;box-shadow:0 0 0 var(--vacp-width-border, 1px) var(--vacp-color-border, #000),0 0 0 calc(var(--vacp-width-border, 1px) + 2px) var(--vacp-color-focus, #19f)}.vacp-range-input-label{--vacp-slider-track-height: calc(var(--vacp-spacing, 6px) * 3);--vacp-slider-thumb-size: calc(var(--vacp-spacing, 6px) * 4 - var(--vacp-width-border, 1px) * 2);display:block}.vacp-range-input-group{display:flex;flex-direction:column;justify-content:center}.vacp-range-input-group>:not(:first-child){margin-block-start:var(--vacp-spacing, 6px)}.vacp-range-input,.vacp-range-input::-webkit-slider-thumb{-webkit-appearance:none}.vacp-range-input{display:block;inline-size:100%;block-size:var(--vacp-slider-track-height);margin-inline:0;margin-block:calc(var(--vacp-spacing, 6px) / 2 + 1px);padding:0;border:none;background:none}.vacp-range-input:focus{outline:none}.vacp-range-input::-moz-focus-outer{border:none}.vacp-range-input--alpha{background-color:#fff;background-image:linear-gradient(45deg,#eee 25%,transparent 25%,transparent 75%,#eee 75%,#eee),linear-gradient(45deg,#eee 25%,transparent 25%,transparent 75%,#eee 75%,#eee);background-size:calc(var(--vacp-spacing, 6px) * 2) calc(var(--vacp-spacing, 6px) * 2);background-position:0 0,var(--vacp-spacing, 6px) var(--vacp-spacing, 6px)}.vacp-range-input::-moz-range-track{box-sizing:border-box;inline-size:100%;block-size:var(--vacp-slider-track-height);border:var(--vacp-width-border, 1px) solid var(--vacp-color-border, #000)}.vacp-range-input::-webkit-slider-runnable-track{box-sizing:border-box;inline-size:100%;block-size:var(--vacp-slider-track-height);border:var(--vacp-width-border, 1px) solid var(--vacp-color-border, #000)}.vacp-range-input::-ms-track{box-sizing:border-box;inline-size:100%;block-size:var(--vacp-slider-track-height);border:var(--vacp-width-border, 1px) solid var(--vacp-color-border, #000)}.vacp-range-input:focus::-moz-range-track{outline:2px solid var(--vacp-color-focus, #19f)}.vacp-range-input:focus::-webkit-slider-runnable-track{outline:2px solid var(--vacp-color-focus, #19f)}.vacp-range-input:focus::-ms-track{outline:2px solid var(--vacp-color-focus, #19f)}.vacp-range-input--alpha::-moz-range-track{background-image:linear-gradient(to right,transparent,var(--vacp-color))}.vacp-range-input--alpha::-webkit-slider-runnable-track{background-image:linear-gradient(to right,transparent,var(--vacp-color))}.vacp-range-input--alpha::-ms-track{background-image:linear-gradient(to right,transparent,var(--vacp-color))}.vacp-range-input--hue::-moz-range-track{background-image:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.vacp-range-input--hue::-webkit-slider-runnable-track{background-image:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.vacp-range-input--hue::-ms-track{background-image:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red)}.vacp-range-input::-moz-range-thumb{box-sizing:border-box;inline-size:var(--vacp-slider-thumb-size);block-size:var(--vacp-slider-thumb-size);border:3px solid #fff;border-radius:50%;background-color:transparent;box-shadow:0 0 0 var(--vacp-width-border, 1px) var(--vacp-color-border, #000);isolation:isolate}.vacp-range-input::-webkit-slider-thumb{box-sizing:border-box;inline-size:var(--vacp-slider-thumb-size);block-size:var(--vacp-slider-thumb-size);margin-block-start:calc(-1 * var(--vacp-spacing, 6px) / 2);border:3px solid #fff;border-radius:50%;background-color:transparent;box-shadow:0 0 0 var(--vacp-width-border, 1px) var(--vacp-color-border, #000);isolation:isolate}.vacp-range-input::-ms-thumb{box-sizing:border-box;inline-size:var(--vacp-slider-thumb-size);block-size:var(--vacp-slider-thumb-size);margin-block-start:calc(-1 * var(--vacp-spacing, 6px) / 2);border:3px solid #fff;border-radius:50%;background-color:transparent;box-shadow:0 0 0 var(--vacp-width-border, 1px) var(--vacp-color-border, #000);isolation:isolate}.vacp-actions{justify-self:center;align-self:center;display:flex;gap:var(--vacp-spacing, 6px);align-items:center}.vacp-color-inputs{grid-column:1/-1;display:flex;align-items:center}.vacp-color-inputs>:not(:first-child){margin-inline-start:var(--vacp-spacing, 6px)}.vacp-color-input-group{flex-grow:1;display:grid;grid-auto-flow:column;-moz-column-gap:var(--vacp-spacing, 6px);column-gap:var(--vacp-spacing, 6px)}.vacp-color-input-label{text-align:center}.vacp-color-input{width:100%;margin:0;margin-block-start:calc(var(--vacp-spacing, 6px) / 2);padding:var(--vacp-spacing, 6px);border:var(--vacp-width-border, 1px) solid var(--vacp-color-border, #000);font:inherit;text-align:center;color:inherit;color:var(--vacp-color-text-input, currentColor);background-color:var(--vacp-color-background-input, #fff)}.vacp-format-switch-button{flex-shrink:0}.vacp-visually-hidden{position:absolute;overflow:hidden;clip:rect(0 0 0 0);inline-size:1px;block-size:1px;margin:-1px;padding:0;border:0;white-space:nowrap}.fade-enter-from[data-v-8a6a557f]{opacity:0}.fade-enter-to[data-v-8a6a557f],.fade-leave-from[data-v-8a6a557f]{opacity:1}.fade-leave-to[data-v-8a6a557f]{opacity:0}.fade-enter-active[data-v-8a6a557f],.fade-leave-active[data-v-8a6a557f]{transition:opacity .5s ease}.empty-state[data-v-89811f78]{display:grid;justify-items:center;gap:6px;border:1px dashed #d1d5db;border-radius:12px;padding:56px 20px;color:#6b7280;text-align:center}.empty-state strong[data-v-89811f78]{color:#111827}.resource-card[data-v-89811f78]{border:1px solid #e5e7eb;border-radius:12px;padding:20px;background:#fff;box-shadow:0 2px 8px #0000000a}.default-badge[data-v-89811f78]{border-radius:999px;padding:3px 8px;background:#f3f4f6;font-size:11px;font-weight:700}.display-toolbar[data-v-7d7f3bb9]{display:flex;align-items:center;justify-content:space-between;gap:16px;border-bottom:1px solid #e5e7eb;padding-bottom:14px}.display-actions[data-v-7d7f3bb9]{display:flex;flex-shrink:0;align-items:center;gap:8px}.display-controls[data-v-7d7f3bb9]{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:12px}.display-restaurant-select[data-v-7d7f3bb9]{width:min(360px,100%)}.display-outlet[data-v-7d7f3bb9]{display:flex;align-items:center;gap:16px}.display-entitlement[data-v-7d7f3bb9]{color:#6b7280;font-size:12px;white-space:nowrap}.restriction-note[data-v-7d7f3bb9]{margin-top:12px;border:1px solid #fed7aa;border-radius:10px;padding:10px 12px;color:#9a3412;background:#fff7ed;font-size:13px}.empty-state[data-v-7d7f3bb9]{display:grid;justify-items:center;gap:6px;border:1px dashed #d1d5db;border-radius:12px;padding:56px 20px;color:#6b7280;text-align:center}.empty-state strong[data-v-7d7f3bb9]{color:#111827}.layout-thumb[data-v-7d7f3bb9]{display:flex;height:auto;min-height:96px;margin-top:16px;border-radius:10px;background:#f3f4f6;padding:5px;pointer-events:none}.thumb-caption[data-v-7d7f3bb9]{margin-top:8px;color:#6b7280;font-size:11px}.resource-card[data-v-7d7f3bb9]{border:1px solid #e5e7eb;border-radius:12px;padding:20px;background:#fff;box-shadow:0 2px 8px #0000000a}.mode-badge[data-v-7d7f3bb9],.status-badge[data-v-7d7f3bb9]{border-radius:999px;padding:3px 8px;background:#f3f4f6;font-size:11px;font-weight:700}.status-badge.active[data-v-7d7f3bb9]{color:#166534;background:#dcfce7}.status-badge.disabled[data-v-7d7f3bb9]{color:#991b1b;background:#fee2e2}.status-badge.unlicensed[data-v-7d7f3bb9]{color:#b42318;background:#fef3f2;border:1px solid #fecdca}.online-dot[data-v-7d7f3bb9]{color:#6b7280;font-size:11px}.online-dot[data-v-7d7f3bb9]:before{display:inline-block;width:7px;height:7px;margin-right:5px;border-radius:50%;background:#9ca3af;content:""}.online-dot.online[data-v-7d7f3bb9]{color:#15803d}.online-dot.online[data-v-7d7f3bb9]:before{background:#22c55e}.meta-grid[data-v-7d7f3bb9]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:18px;border-top:1px solid #f0f0f0;padding-top:16px}.meta-grid dt[data-v-7d7f3bb9]{color:#6b7280;font-size:11px}.meta-grid dd[data-v-7d7f3bb9]{overflow:hidden;margin-top:2px;font-size:12px;text-overflow:ellipsis;white-space:nowrap}@media (max-width:640px){.display-toolbar[data-v-7d7f3bb9]{align-items:flex-start}.display-controls[data-v-7d7f3bb9]{align-items:stretch;flex-direction:column}.display-outlet[data-v-7d7f3bb9]{align-items:stretch;flex-direction:column;gap:8px}.display-restaurant-select[data-v-7d7f3bb9]{width:100%}}
package/env.d.ts CHANGED
@@ -97,3 +97,5 @@ declare const appEndpoint: {
97
97
  eInvoiceBackend: string | undefined
98
98
  mdmPortal: string
99
99
  }
100
+
101
+ declare module 'vue-accessible-color-picker/styles'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feedmepos/mf-order-setting",
3
- "version": "0.0.91",
3
+ "version": "0.0.93",
4
4
  "type": "module",
5
5
  "module": "./dist/app.js",
6
6
  "license": "UNLICENSED",
@@ -10,7 +10,7 @@
10
10
  }
11
11
  },
12
12
  "dependencies": {
13
- "@feedmepos/core": "^2.15.52",
13
+ "@feedmepos/core": "^2.15.56",
14
14
  "@feedmepos/entity": "0.0.20",
15
15
  "@feedmepos/feature-flag": "^0.0.15",
16
16
  "@feedmepos/hrm-permission": "^1.0.13",
@@ -32,6 +32,7 @@
32
32
  "pinia": "^2.1.7",
33
33
  "semver": "^7.7.1",
34
34
  "vue": "^3.3.8",
35
+ "vue-accessible-color-picker": "^5.2.0",
35
36
  "vue-i18n": "^10.0.5",
36
37
  "vue-router": "^4.2.5",
37
38
  "zod-openapi": "^4.1.0"
@@ -1,4 +1,5 @@
1
1
  import axios from 'axios'
2
+ import type { BrandKit, OdsConfigEntry } from '@/modules/display-system/legacy-ods/interface'
2
3
 
3
4
  export interface DisplayBrandKitColors {
4
5
  primary?: string
@@ -39,3 +40,26 @@ export async function getRestaurantDisplayBrandKit(
39
40
  throw error
40
41
  }
41
42
  }
43
+
44
+ export async function getBusinessBrandkit(
45
+ businessId: string,
46
+ namespace: string
47
+ ): Promise<BrandKit> {
48
+ const response = await axios.get<BrandKit>(
49
+ `${brandKitBaseUrl(namespace)}/metadata/${encodeURIComponent(businessId)}/brandkit`
50
+ )
51
+ return response.data
52
+ }
53
+
54
+ export async function saveBusinessOds(
55
+ businessId: string,
56
+ ods: OdsConfigEntry[],
57
+ namespace: string
58
+ ): Promise<void> {
59
+ // The metadata endpoint replaces the entire document, including unrelated layouts and colors.
60
+ const brandkit = await getBusinessBrandkit(businessId, namespace)
61
+ await axios.post(
62
+ `${brandKitBaseUrl(namespace)}/metadata/${encodeURIComponent(businessId)}/brandkit`,
63
+ { ...brandkit, ods }
64
+ )
65
+ }
@@ -0,0 +1,25 @@
1
+ import { baseClientInstance, getData } from '@/api'
2
+ import type { FdoOrderReservationSettingsV2 } from '@entity'
3
+
4
+ // reservation-backend portal routes. The portal host's ingress rewrites
5
+ // `/reservation(.*)` to `/portal/reservation$1` on reservation-backend.
6
+ async function getReservationSetting(restaurantId: string): Promise<FdoOrderReservationSettingsV2> {
7
+ const result = await baseClientInstance().get(`/reservation/restaurant/${restaurantId}/setting`)
8
+ return getData<FdoOrderReservationSettingsV2>(result)
9
+ }
10
+
11
+ async function updateReservationSetting(
12
+ restaurantId: string,
13
+ payload: FdoOrderReservationSettingsV2
14
+ ): Promise<FdoOrderReservationSettingsV2> {
15
+ const result = await baseClientInstance().put(
16
+ `/reservation/restaurant/${restaurantId}/setting`,
17
+ payload
18
+ )
19
+ return getData<FdoOrderReservationSettingsV2>(result)
20
+ }
21
+
22
+ export const ReservationApi = {
23
+ getReservationSetting,
24
+ updateReservationSetting
25
+ }
Binary file
@@ -0,0 +1,22 @@
1
+ import { useFeatureFlag } from '@feedmepos/feature-flag'
2
+
3
+ const FLAGSMITH_URL = 'https://flag.feedmeapi.com/api/v1/'
4
+ const FLAGSMITH_KEY_BY_NAMESPACE = {
5
+ dev: 'MaGoXrEWuEJNpWgKTqseee',
6
+ prod: '6GhcttsJ9Rj9cTevcdrpin'
7
+ } as const
8
+
9
+ let initPromise: Promise<void> | null = null
10
+
11
+ export function ensureInit(
12
+ ff: ReturnType<typeof useFeatureFlag>,
13
+ namespace: keyof typeof FLAGSMITH_KEY_BY_NAMESPACE
14
+ ): Promise<void> {
15
+ if (ff.isInitialized.value) return Promise.resolve()
16
+ if (!initPromise) {
17
+ initPromise = ff
18
+ .init({ apiKey: FLAGSMITH_KEY_BY_NAMESPACE[namespace], url: FLAGSMITH_URL })
19
+ .catch(() => undefined) // init failure => fail open
20
+ }
21
+ return initPromise
22
+ }
@@ -0,0 +1,44 @@
1
+ import { ref, watch } from 'vue'
2
+ import { useCoreStore } from '@feedmepos/mf-common'
3
+ import { useFeatureFlag } from '@feedmepos/feature-flag'
4
+ import { ensureInit } from './featureFlag'
5
+
6
+ export function isFeatureEnabled(value: unknown): boolean {
7
+ try {
8
+ const parsed = typeof value === 'string' ? JSON.parse(value) : value
9
+ return (
10
+ parsed === true || parsed === 'true' || parsed?.enabled === true || parsed?.enabled === 'true'
11
+ )
12
+ } catch {
13
+ return value === true || value === 'true'
14
+ }
15
+ }
16
+
17
+ export function useBusinessFeatureFlag(key: string) {
18
+ const core = useCoreStore()
19
+ const ff = useFeatureFlag()
20
+ const value = ref(false)
21
+
22
+ watch(
23
+ [() => core.currentBusiness.value?._id, () => core.namespace.value],
24
+ async ([businessId, namespace], _, onCleanup) => {
25
+ let cancelled = false
26
+ onCleanup(() => {
27
+ cancelled = true
28
+ })
29
+ value.value = false
30
+ if (!businessId) return
31
+ await ensureInit(ff, namespace === 'dev' ? 'dev' : 'prod')
32
+ if (!ff.isInitialized.value || cancelled) return
33
+ try {
34
+ const raw = await ff.getBusinessFlagValue<unknown>(businessId, key, false)
35
+ if (!cancelled) value.value = isFeatureEnabled(raw)
36
+ } catch {
37
+ if (!cancelled) value.value = false
38
+ }
39
+ },
40
+ { immediate: true }
41
+ )
42
+
43
+ return { value }
44
+ }
@@ -0,0 +1,35 @@
1
+ import { computed } from 'vue'
2
+ import { useCoreStore } from '@feedmepos/mf-common'
3
+ import { useBusinessFeatureFlag } from './useBusinessFeatureFlag'
4
+
5
+ export function useLegacyOdsAccess() {
6
+ const core = useCoreStore()
7
+ const isFeedmeInternal = computed(() => {
8
+ const role = core.sessionUser.value?.role as
9
+ | {
10
+ isAdmin?: boolean
11
+ isStaff?: boolean
12
+ isAgent?: boolean
13
+ name?: string
14
+ type?: string
15
+ key?: string
16
+ }
17
+ | string
18
+ | undefined
19
+ const roleName = typeof role === 'string' ? role : (role?.name ?? role?.type ?? role?.key)
20
+ return Boolean(
21
+ (typeof role === 'object' && (role?.isAdmin || role?.isStaff || role?.isAgent)) ||
22
+ ['admin', 'staff', 'agent'].includes(String(roleName).toLowerCase())
23
+ )
24
+ })
25
+ const { value: isOdsTemplateSettingsEnabled } = useBusinessFeatureFlag(
26
+ 'order_ods_template_settings'
27
+ )
28
+ const { value: isAdvancedCustomizationEnabled } = useBusinessFeatureFlag(
29
+ 'order_ods_advanced_customization'
30
+ )
31
+ const canAccessOdsTemplateSettings = computed(
32
+ () => isFeedmeInternal.value || isOdsTemplateSettingsEnabled.value
33
+ )
34
+ return { canAccessOdsTemplateSettings, isAdvancedCustomizationEnabled }
35
+ }
@@ -0,0 +1,19 @@
1
+ import { computed } from 'vue'
2
+ import { useCoreStore } from '@feedmepos/mf-common'
3
+ import { Permission, checkAccess, type CaslPermission } from '@feedmepos/hrm-permission'
4
+
5
+ export const miniProgramBrandkitPermission = (
6
+ action: (typeof Permission.Action)[keyof typeof Permission.Action]
7
+ ): CaslPermission => ({ action, subject: Permission.Subject.Business.miniProgram_brandkit })
8
+
9
+ export function useMiniProgramPermission() {
10
+ const core = useCoreStore()
11
+ const canManageBrandkit = computed(
12
+ () =>
13
+ checkAccess(
14
+ [miniProgramBrandkitPermission(Permission.Action.manage)],
15
+ (core.sessionUser.value?.permissions ?? []) as Parameters<typeof checkAccess>[1]
16
+ ).granted
17
+ )
18
+ return { canManageBrandkit }
19
+ }
@@ -1,6 +1,7 @@
1
1
  import { computed, watch, type ComputedRef } from 'vue'
2
2
  import { useFeatureFlag } from '@feedmepos/feature-flag'
3
3
  import { useCoreStore } from '@feedmepos/mf-common'
4
+ import { ensureInit } from './featureFlag'
4
5
 
5
6
  /**
6
7
  * Whether QR / online ordering is enabled for the currently-selected restaurant,
@@ -19,27 +20,6 @@ import { useCoreStore } from '@feedmepos/mf-common'
19
20
  */
20
21
  const QR_ORDERING_FLAG_KEY = 'ordering_enable_qr'
21
22
 
22
- const FLAGSMITH_URL = 'https://flag.feedmeapi.com/api/v1/'
23
- const FLAGSMITH_KEY_BY_NAMESPACE = {
24
- dev: 'MaGoXrEWuEJNpWgKTqseee',
25
- prod: '6GhcttsJ9Rj9cTevcdrpin'
26
- } as const
27
-
28
- let initPromise: Promise<void> | null = null
29
-
30
- function ensureInit(
31
- ff: ReturnType<typeof useFeatureFlag>,
32
- namespace: keyof typeof FLAGSMITH_KEY_BY_NAMESPACE
33
- ): Promise<void> {
34
- if (ff.isInitialized.value) return Promise.resolve()
35
- if (!initPromise) {
36
- initPromise = ff
37
- .init({ apiKey: FLAGSMITH_KEY_BY_NAMESPACE[namespace], url: FLAGSMITH_URL })
38
- .catch(() => undefined) // init failure => fail open
39
- }
40
- return initPromise
41
- }
42
-
43
23
  export function useQrOrderingEnabled(): ComputedRef<boolean> {
44
24
  const ff = useFeatureFlag()
45
25
  const { currentRestaurant, namespace } = useCoreStore()
@@ -66,6 +66,8 @@
66
66
  "acceptedPayment": "Accepted Payment",
67
67
  "acceptQueue": "Accept queue",
68
68
  "acceptQueueSublabel": "Customer can use queue in FeedMe app",
69
+ "acceptReservation": "Accept reservation",
70
+ "acceptReservationSublabel": "Customers can book a table. FeedMe admin only",
69
71
  "actiavteFeedmeExpress": "Activate FeedMe Express",
70
72
  "activated": "Activated",
71
73
  "activatedDate": "Activated date",
@@ -398,6 +400,25 @@
398
400
  "padDigit": "Pad Digit",
399
401
  "paid": "Paid",
400
402
  "paxMax": "Pax Max",
403
+ "reservation": "Reservation",
404
+ "reservationStatus": "Reservation Status",
405
+ "reservationAvailability": "Reservation Availability",
406
+ "notificationSettings": "Notification Settings",
407
+ "smsEnabled": "Enable SMS Notifications",
408
+ "smsEnabledDescription": "Send SMS notifications to customers for reservation updates",
409
+ "emailEnabled": "Enable Email Notifications",
410
+ "emailEnabledDescription": "Send email notifications to customers for reservation updates",
411
+ "notifyOnConfirm": "Notify on Confirmation",
412
+ "notifyOnConfirmDescription": "Send notifications when a reservation is confirmed",
413
+ "notifyOnCancel": "Notify on Cancellation",
414
+ "notifyOnCancelDescription": "Send notifications when a reservation is cancelled",
415
+ "draftHoldTimeMinutes": "Draft Hold Time (Minutes)",
416
+ "posCanOverbook": "POS Can Overbook",
417
+ "posCanOverbookDescription": "Allow POS to create reservations even when capacity is full",
418
+ "saveAllChanges": "Save All Changes",
419
+ "settingUpdated": "Settings updated successfully",
420
+ "validationError": "Validation Error",
421
+ "ok": "OK",
401
422
  "paxMin": "Pax Min",
402
423
  "payAtCounter": "Pay at Counter",
403
424
  "paymentMethod": "Payment Method",
@@ -659,6 +680,173 @@
659
680
  }
660
681
  },
661
682
  "displaySystem": {
683
+ "legacyOds": {
684
+ "addConfiguration": "Add Configuration",
685
+ "duplicate": "Duplicate",
686
+ "duplicateConfiguration": "Duplicate Configuration",
687
+ "duplicateConfirmation": "Duplicate {label}? The copy will be added as a non-default configuration.",
688
+ "deleteConfiguration": "Delete Configuration",
689
+ "deleteConfirmation": "Delete {label}? Restaurants it covers will use the default configuration.",
690
+ "copyLabel": "{label} Copy",
691
+ "description": "Configure how orders are displayed on the ODS screen. Each configuration can target specific restaurants or serve as the default for all unassigned restaurants.",
692
+ "noConfigsYet": "No ODS configurations yet",
693
+ "noConfigsDescription": "Add a configuration to customize the ODS display for your restaurants.",
694
+ "default": "Default",
695
+ "configNumber": "Config #{index}",
696
+ "allRestaurantsDefault": "All restaurants (default)",
697
+ "noRestaurantsSelected": "No restaurants selected",
698
+ "odsConfiguration": "ODS Configuration",
699
+ "label": "Label",
700
+ "defaultConfiguration": "Default configuration",
701
+ "defaultWarning": "Another configuration is already set as default. Saving will replace it as the default.",
702
+ "restaurantInfo": "This configuration applies to all restaurants not matched by a specific entry.",
703
+ "selectRestaurants": "Select restaurants",
704
+ "displaySettings": "Display Settings",
705
+ "groupOrdersBy": "Group Orders By",
706
+ "groupByStatus": "Status",
707
+ "groupByType": "Type",
708
+ "statusBoardLayout": "Status Board Layout",
709
+ "layoutHorizontal": "Horizontal",
710
+ "layoutVertical": "Vertical",
711
+ "statusColumnCount": "Status Column Count",
712
+ "slidingInterval": "Sliding Interval",
713
+ "showDeliveryIcons": "Show Delivery Icons",
714
+ "showOrderCount": "Show Order Count",
715
+ "showEstimatedTime": "Show Estimated Time",
716
+ "showOrderTypeTabs": "Show Order Type Tabs",
717
+ "showProgressBar": "Show Progress Bar",
718
+ "showCurrentOrder": "Show Latest Ready Order",
719
+ "hideCollectedOrders": "Hide Collected Orders",
720
+ "colorOverride": "Color Override",
721
+ "colorOverrideTitle": "ODS Color Override",
722
+ "colorOverrideDescription": "Override default brand colors for the ODS display.",
723
+ "layoutSettings": "Layout Settings",
724
+ "backgroundImage": "Background Image",
725
+ "sidePanelImage": "Side Panel Image",
726
+ "boardWidth": "Board Width (%)",
727
+ "boardAlignment": "Board Alignment",
728
+ "alignLeft": "Left",
729
+ "alignCenter": "Center",
730
+ "alignRight": "Right",
731
+ "disable": "Disable",
732
+ "defaultImage1": "Default image 1",
733
+ "defaultImage2": "Default image 2",
734
+ "customImage": "Custom image",
735
+ "changeImage": "Change image",
736
+ "chooseImage": "Choose from media library",
737
+ "odsPreview": "ODS Preview",
738
+ "openInNewTab": "Open in new tab",
739
+ "previewUnavailable": "Preview unavailable",
740
+ "displaySettingsDescription": "Control how orders are grouped and displayed on the ODS board.",
741
+ "groupOrdersByDescription": "Choose how orders are grouped on the display.",
742
+ "statusBoardLayoutDescription": "Arrange the preparing and ready sections side-by-side (horizontal) or stacked (vertical).",
743
+ "statusColumnCountDescription": "Number of columns within each status section.",
744
+ "slidingIntervalDescription": "Auto-rotation interval for the status board in seconds.",
745
+ "showDeliveryIconsDescription": "Display delivery platform icons next to order numbers.",
746
+ "showOrderCountDescription": "Display order count, drink/food statistics in the preparing section header.",
747
+ "showEstimatedTimeDescription": "Display estimated waiting time in the preparing section header.",
748
+ "showOrderTypeTabsDescription": "Display the In Restaurant / Delivery tabs at the top of the order board.",
749
+ "showProgressBarDescription": "Display a progress bar on the ODS board.",
750
+ "showCurrentOrderDescription": "Display the latest ready order on the ODS board.",
751
+ "hideCollectedOrdersDescription": "Remove an order from the ODS board after every sent item has been collected.",
752
+ "colorOverrideConfigDescription": "Override brand colors specifically for this ODS configuration.",
753
+ "colorsOverridden": "{count} color(s) overridden",
754
+ "configure": "Configure",
755
+ "layoutSettingsDescription": "Configure background, side panel, and board sizing.",
756
+ "backgroundImageDescription": "Choose a built-in background or upload a custom image.",
757
+ "sidePanelImageDescription": "Decorative image panel beside the board.",
758
+ "backgroundDisabled": "Background image is disabled.",
759
+ "sidePanelDisabled": "Side panel is disabled.",
760
+ "position": "Position",
761
+ "widthPercent": "Width (%)",
762
+ "boardWidthDescription": "Width of the order board as a percentage of available space.",
763
+ "boardAlignmentDescription": "Align the order board when width is less than 100%.",
764
+ "defaultImage": "Default image",
765
+ "custom": "Custom",
766
+ "selectPreset": "Preset Templates",
767
+ "selectPresetDescription": "Choose a ready-made ODS setup.",
768
+ "preset1": "Preset 1",
769
+ "preset2": "Preset 2",
770
+ "previewDescription": "Live preview at 1920 x 1080.",
771
+ "statusTemplate": "Status Template",
772
+ "statusTemplateDescription": "Choose a pre-built template for the horizontal status board layout. Non-default templates use a fixed design with hardcoded colors.",
773
+ "templateDefault": "Default",
774
+ "templateBorderedCard": "Bordered Card",
775
+ "templateFloatingTab": "Floating Tab",
776
+ "templateCenteredPill": "Centered Pill",
777
+ "footerMode": "Footer Mode",
778
+ "footerModeDescription": "Choose what appears at the bottom of the ODS screen. 'FeedMe' shows the default branded footer. 'Settings Icon' hides the footer and shows a floating gear icon that auto-hides after 10 seconds.",
779
+ "footerModeFeedme": "FeedMe",
780
+ "footerModeSettingsIcon": "Settings Icon",
781
+ "color": {
782
+ "primary": {
783
+ "title": "Primary Color",
784
+ "description": "Defines the core visual identity; used for key brand elements."
785
+ },
786
+ "secondary": {
787
+ "title": "Secondary Color",
788
+ "description": "Supports the primary color in backgrounds and secondary elements."
789
+ },
790
+ "accent": {
791
+ "title": "Accent Color",
792
+ "description": "Used for emphasis and highlighting important interactive elements."
793
+ }
794
+ },
795
+ "typography": {
796
+ "onPrimary": {
797
+ "title": "Typo on Primary Color",
798
+ "description": "Ensures clear text visibility when placed over primary-colored backgrounds."
799
+ },
800
+ "primary": {
801
+ "title": "Primary Color",
802
+ "description": "Used for main body text and headings throughout the interface."
803
+ },
804
+ "secondary": {
805
+ "title": "Secondary Color",
806
+ "description": "Applies to supporting content such as descriptions and labels."
807
+ },
808
+ "tertiary": {
809
+ "title": "Tertiary Color",
810
+ "description": "For low-emphasis text like metadata, system notes, or disclaimers."
811
+ }
812
+ },
813
+ "neutralColors": {
814
+ "light": {
815
+ "title": "Neutral color - light",
816
+ "description": "Used for subtle background areas, separators, or low-emphasis surfaces."
817
+ },
818
+ "mid": {
819
+ "title": "Neutral color - mid",
820
+ "description": "Supports visual structure and is applied to dividers and medium-emphasis UI elements."
821
+ },
822
+ "dark": {
823
+ "title": "Neutral color - dark",
824
+ "description": "Provides strong contrast for high-emphasis elements and helps establish hierarchy."
825
+ }
826
+ },
827
+ "backgroundColors": {
828
+ "base": {
829
+ "title": "Base",
830
+ "description": "The default interface surface; supports layout and content clarity."
831
+ },
832
+ "elevated": {
833
+ "title": "Elevated",
834
+ "description": "Used for layered components like cards and modals to create depth."
835
+ }
836
+ },
837
+ "cancel": "Cancel",
838
+ "confirm": "Confirm",
839
+ "edit": "Edit",
840
+ "delete": "Delete",
841
+ "resetToDefault": "Reset to default",
842
+ "close": "Close",
843
+ "save": "Save",
844
+ "saved": "Settings saved",
845
+ "title": "ODS templates (POS v7)",
846
+ "switchToLegacy": "Switch to POS v7 ODS templates",
847
+ "switchToDisplaySystem": "Switch to Display System (POS v8)",
848
+ "openLegacyTab": "Manage ODS templates for POS v7"
849
+ },
662
850
  "addTemplate": "New display template",
663
851
  "editTemplate": "Edit display template",
664
852
  "templates": "Templates",