@flamingo-stack/openframe-frontend-core 0.0.703 → 0.0.704-snapshot.20261006133653
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.
- package/dist/{chunk-3L7KCOGO.cjs → chunk-2QEUFXNS.cjs} +30 -30
- package/dist/{chunk-BMJUKS6S.cjs → chunk-3256UJXS.cjs} +47 -47
- package/dist/{chunk-GZYLZ4MB.js → chunk-4S7TJYRQ.js} +3 -3
- package/dist/{chunk-ENGBNKUJ.js → chunk-5EFZO5EB.js} +675 -569
- package/dist/{chunk-TCZCMD5Q.js → chunk-5HBHO5TB.js} +1 -1
- package/dist/{chunk-BOUPNYUV.js → chunk-64HOMVYC.js} +5 -5
- package/dist/{chunk-YR6JPJF4.js → chunk-6XIF2Z7I.js} +4 -4
- package/dist/{chunk-NU724ZVN.cjs → chunk-7GHB2IK6.cjs} +121 -121
- package/dist/{chunk-GX3OUTFO.cjs → chunk-7ZYIC7NA.cjs} +69 -55
- package/dist/{chunk-53AC23ZN.js → chunk-A6WVQKOZ.js} +24 -24
- package/dist/{chunk-4OGAXAEG.cjs → chunk-ABU3TGXA.cjs} +3 -3
- package/dist/{chunk-RTXTGLGB.cjs → chunk-ACV4DFQ3.cjs} +4 -4
- package/dist/{chunk-RLDAYA2A.cjs → chunk-BH6PJP66.cjs} +29 -29
- package/dist/{chunk-BRXOGCH3.cjs → chunk-BIZNSF3U.cjs} +3 -3
- package/dist/{chunk-2A4XES7R.cjs → chunk-BM5MVGH3.cjs} +3 -3
- package/dist/{chunk-6YCXA7CN.js → chunk-CH5232HV.js} +20 -19
- package/dist/{chunk-UIBSSVON.cjs → chunk-D7BTSVMS.cjs} +2 -2
- package/dist/{chunk-YBGEPKC2.cjs → chunk-F7Y2ZS5U.cjs} +6 -6
- package/dist/{chunk-5V6O73EH.js → chunk-FLKJYMVB.js} +3 -3
- package/dist/{chunk-NMGX2ZTU.js → chunk-IFUQVZF4.js} +17 -17
- package/dist/{chunk-2NE3DNXY.js → chunk-IKCQK67U.js} +2 -2
- package/dist/{chunk-KFDP3DUL.cjs → chunk-IXPUM3AW.cjs} +98 -98
- package/dist/{chunk-QGTDWFT6.js → chunk-IZHZMBIX.js} +2469 -1928
- package/dist/{chunk-67CXGPTW.cjs → chunk-JKEEFQOX.cjs} +505 -72
- package/dist/{chunk-NYSYSKSH.cjs → chunk-M6HTJTFH.cjs} +15 -15
- package/dist/{chunk-OGLCD3UL.js → chunk-MFFCUVWG.js} +6 -6
- package/dist/{chunk-KJ5LWATV.js → chunk-MKXO4Q5P.js} +7 -7
- package/dist/{chunk-EMCQGFXD.cjs → chunk-MMOODW57.cjs} +28 -27
- package/dist/{chunk-Q76ZTHNV.js → chunk-MP2C3LJ4.js} +1 -1
- package/dist/{chunk-J4K5JOLI.js → chunk-MV4HYG3B.js} +25 -11
- package/dist/{chunk-2T6QWNXU.js → chunk-NDESEPW5.js} +99 -11
- package/dist/{chunk-HHFPQNP3.js → chunk-NJDHFC55.js} +15 -15
- package/dist/{chunk-HUOLB7ZN.cjs → chunk-OHFS7VOU.cjs} +9 -9
- package/dist/{chunk-7632TNE7.js → chunk-OSNIZNVH.js} +7 -7
- package/dist/{chunk-UTW4SQDI.js → chunk-OUHMD6EU.js} +10 -10
- package/dist/{chunk-MXHJROXJ.cjs → chunk-P23CRLU4.cjs} +1245 -1139
- package/dist/{chunk-64O4L7WN.js → chunk-PDWVPI3S.js} +11 -55
- package/dist/{chunk-DAW6TDZB.js → chunk-PFC2HWQA.js} +30 -16
- package/dist/{chunk-G55W76S6.js → chunk-POZ7F77D.js} +12 -13
- package/dist/{chunk-PJP5SMOU.js → chunk-PPEZGUL7.js} +500 -67
- package/dist/{chunk-SFGXIFYO.cjs → chunk-QC7Q3XCE.cjs} +24 -24
- package/dist/{chunk-MDBHZBW7.cjs → chunk-RKV5B7EU.cjs} +92 -4
- package/dist/{chunk-5VPIC5MD.cjs → chunk-SAAZEWUR.cjs} +12 -12
- package/dist/{chunk-IIMICN7L.cjs → chunk-TYWLNCNH.cjs} +4 -48
- package/dist/{chunk-HYLIQMZH.cjs → chunk-UBP5RNGK.cjs} +33 -33
- package/dist/{chunk-HUMWQMCU.js → chunk-UT4YHQZW.js} +3 -3
- package/dist/{chunk-BSEIEWM5.cjs → chunk-V3H26CNS.cjs} +28 -14
- package/dist/{chunk-NGJCWEYX.cjs → chunk-VHCACDKP.cjs} +46 -46
- package/dist/{chunk-SL2FOFT2.js → chunk-VMAZCLX4.js} +7 -7
- package/dist/{chunk-5FFNNJM7.js → chunk-VR2ZLFCP.js} +1 -1
- package/dist/{chunk-NCTYD7HL.js → chunk-VYWMEL5F.js} +14 -14
- package/dist/{chunk-HY5YL3U5.cjs → chunk-XBWE423R.cjs} +1994 -1453
- package/dist/{chunk-XCIFHW4E.cjs → chunk-XOYH2YQE.cjs} +2 -2
- package/dist/{chunk-S6V7A5FS.cjs → chunk-ZQZFIE2K.cjs} +32 -33
- package/dist/components/case-studies/index.cjs +24 -24
- package/dist/components/case-studies/index.js +10 -10
- package/dist/components/chat/chat-archive-page.d.ts +3 -3
- package/dist/components/chat/chat-archive-page.d.ts.map +1 -1
- package/dist/components/chat/chat-input.d.ts.map +1 -1
- package/dist/components/chat/chat-nav-sidebar.d.ts +4 -0
- package/dist/components/chat/chat-nav-sidebar.d.ts.map +1 -1
- package/dist/components/chat/chat-panel-header.d.ts +3 -2
- package/dist/components/chat/chat-panel-header.d.ts.map +1 -1
- package/dist/components/chat/embeddable-chat.d.ts +36 -2
- package/dist/components/chat/embeddable-chat.d.ts.map +1 -1
- package/dist/components/chat/index.cjs +14 -6
- package/dist/components/chat/index.d.ts +4 -1
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +13 -5
- package/dist/components/chat/mingo-archive-list.d.ts +17 -0
- package/dist/components/chat/mingo-archive-list.d.ts.map +1 -0
- package/dist/components/chat/mingo-chat-header.d.ts +31 -0
- package/dist/components/chat/mingo-chat-header.d.ts.map +1 -0
- package/dist/components/chat/mingo-chat-rail.d.ts +54 -0
- package/dist/components/chat/mingo-chat-rail.d.ts.map +1 -0
- package/dist/components/chat/model-display.d.ts.map +1 -1
- package/dist/components/contact/contact-form.d.ts.map +1 -1
- package/dist/components/contact/index.cjs +11 -11
- package/dist/components/contact/index.js +10 -10
- package/dist/components/content-loading-container.d.ts +1 -1
- package/dist/components/content-loading-container.d.ts.map +1 -1
- package/dist/components/docs/index.cjs +14 -14
- package/dist/components/docs/index.js +13 -13
- package/dist/components/docs/skeletons.d.ts.map +1 -1
- package/dist/components/embeds/index.cjs +11 -11
- package/dist/components/embeds/index.js +10 -10
- package/dist/components/faq/index.cjs +12 -12
- package/dist/components/faq/index.js +11 -11
- package/dist/components/features/figma-prototype-viewer.d.ts.map +1 -1
- package/dist/components/features/index.cjs +10 -10
- package/dist/components/features/index.js +9 -9
- package/dist/components/features/media-gallery-manager.d.ts.map +1 -1
- package/dist/components/features/parallax-image-showcase.d.ts.map +1 -1
- package/dist/components/features/policy-configuration-panel.d.ts.map +1 -1
- package/dist/components/features/section-selector.d.ts.map +1 -1
- package/dist/components/help-center-pages/index.cjs +119 -119
- package/dist/components/help-center-pages/index.js +39 -39
- package/dist/components/help-center-pages/trust-center-sections.d.ts +2 -2
- package/dist/components/help-center-pages/trust-center-sections.d.ts.map +1 -1
- package/dist/components/index.cjs +94 -86
- package/dist/components/index.js +32 -24
- package/dist/components/layout/article-detail-layout.d.ts +1 -1
- package/dist/components/layout/article-detail-layout.d.ts.map +1 -1
- package/dist/components/layout/page-container.d.ts.map +1 -1
- package/dist/components/layout/title-block.d.ts +2 -2
- package/dist/components/layout/title-block.d.ts.map +1 -1
- package/dist/components/loading/page-layout-skeleton.d.ts.map +1 -1
- package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/booking-form.d.ts +4 -4
- package/dist/components/meeting-scheduler/booking-form.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/context-panel.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.cjs +127 -127
- package/dist/components/meeting-scheduler/index.d.ts +2 -2
- package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.js +50 -50
- package/dist/components/navigation/app-header.d.ts +4 -0
- package/dist/components/navigation/app-header.d.ts.map +1 -1
- package/dist/components/navigation/app-layout-side-panel.d.ts +142 -0
- package/dist/components/navigation/app-layout-side-panel.d.ts.map +1 -0
- package/dist/components/navigation/app-layout.d.ts +11 -1
- package/dist/components/navigation/app-layout.d.ts.map +1 -1
- package/dist/components/navigation/header-mingo-button.d.ts +4 -1
- package/dist/components/navigation/header-mingo-button.d.ts.map +1 -1
- package/dist/components/navigation/index.cjs +13 -13
- package/dist/components/navigation/index.d.ts +1 -0
- package/dist/components/navigation/index.d.ts.map +1 -1
- package/dist/components/navigation/index.js +12 -12
- package/dist/components/navigation/navigation-sidebar.d.ts +8 -1
- package/dist/components/navigation/navigation-sidebar.d.ts.map +1 -1
- package/dist/components/navigation/sliding-sidebar.d.ts.map +1 -1
- package/dist/components/onboarding-guides/index.cjs +14 -14
- package/dist/components/onboarding-guides/index.js +13 -13
- package/dist/components/persistent-filter-controls.d.ts.map +1 -1
- package/dist/components/related-content/index.cjs +7 -7
- package/dist/components/related-content/index.js +6 -6
- package/dist/components/shared/detail-page-skeleton.d.ts.map +1 -1
- package/dist/components/tickets/help-center-create-form.d.ts +4 -4
- package/dist/components/tickets/index.cjs +15 -15
- package/dist/components/tickets/index.js +14 -14
- package/dist/components/ui/announcement-bar-view.d.ts.map +1 -1
- package/dist/components/ui/breadcrumb.d.ts.map +1 -1
- package/dist/components/ui/checkbox-block.d.ts.map +1 -1
- package/dist/components/ui/dashboard-info-card.d.ts +1 -1
- package/dist/components/ui/dashboard-info-card.d.ts.map +1 -1
- package/dist/components/ui/data-table/data-table-body.d.ts +2 -2
- package/dist/components/ui/data-table/data-table-skeleton.d.ts +2 -2
- package/dist/components/ui/data-table/data-table-skeleton.d.ts.map +1 -1
- package/dist/components/ui/data-table/utils.d.ts +2 -2
- package/dist/components/ui/dialog.d.ts.map +1 -1
- package/dist/components/ui/drawer.d.ts.map +1 -1
- package/dist/components/ui/entity-image.d.ts +2 -2
- package/dist/components/ui/file-manager/index.cjs +36 -36
- package/dist/components/ui/file-manager/index.js +3 -3
- package/dist/components/ui/filter-modal.d.ts.map +1 -1
- package/dist/components/ui/index.cjs +18 -10
- package/dist/components/ui/index.js +17 -9
- package/dist/components/ui/info-card-row.d.ts.map +1 -1
- package/dist/components/ui/menubar.d.ts +1 -1
- package/dist/components/ui/menubar.d.ts.map +1 -1
- package/dist/components/ui/modal-v2.d.ts.map +1 -1
- package/dist/components/ui/modal.d.ts.map +1 -1
- package/dist/components/ui/no-data/no-data-actions.d.ts.map +1 -1
- package/dist/components/ui/no-data/no-data-styles.d.ts +1 -1
- package/dist/components/ui/no-data/no-data-styles.d.ts.map +1 -1
- package/dist/components/ui/page-actions.d.ts.map +1 -1
- package/dist/components/ui/sheet.d.ts.map +1 -1
- package/dist/components/ui/table/table-skeleton.d.ts +1 -1
- package/dist/components/ui/table/table-skeleton.d.ts.map +1 -1
- package/dist/hooks/index.cjs +23 -9
- package/dist/hooks/index.js +24 -10
- package/dist/hooks/ui/index.d.ts +1 -0
- package/dist/hooks/ui/index.d.ts.map +1 -1
- package/dist/hooks/ui/use-content-breakpoint.d.ts +32 -0
- package/dist/hooks/ui/use-content-breakpoint.d.ts.map +1 -0
- package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts +2 -2
- package/dist/hooks/ui/use-isomorphic-layout-effect.d.ts.map +1 -1
- package/dist/hooks/ui/use-media-query.d.ts.map +1 -1
- package/dist/index.cjs +39 -17
- package/dist/index.js +41 -19
- package/dist/styles/layout-steps.d.ts +30 -0
- package/dist/styles/layout-steps.d.ts.map +1 -0
- package/dist/tailwind.config.cjs +36 -11
- package/dist/tailwind.config.js +36 -11
- package/eslint-config/README.md +9 -0
- package/eslint-config/base.js +17 -1
- package/eslint-config/layout-variants.js +57 -0
- package/package.json +3 -1
- package/src/ODS_TOKEN_RULES.md +40 -0
- package/src/components/chat/chat-archive-page.tsx +9 -7
- package/src/components/chat/chat-input.tsx +5 -1
- package/src/components/chat/chat-nav-sidebar.tsx +10 -4
- package/src/components/chat/chat-panel-header.tsx +8 -5
- package/src/components/chat/embeddable-chat.tsx +675 -485
- package/src/components/chat/index.ts +4 -0
- package/src/components/chat/mingo-archive-list.tsx +108 -0
- package/src/components/chat/mingo-chat-header.tsx +104 -0
- package/src/components/chat/mingo-chat-rail.tsx +361 -0
- package/src/components/chat/model-display.tsx +8 -1
- package/src/components/contact/contact-form.tsx +11 -9
- package/src/components/content-loading-container.tsx +4 -2
- package/src/components/docs/doc-viewer.tsx +7 -7
- package/src/components/docs/skeletons.tsx +7 -4
- package/src/components/dynamic-skeleton.tsx +1 -1
- package/src/components/embeds/claude-embed.tsx +1 -1
- package/src/components/embeds/embed-viewer-frame.tsx +4 -4
- package/src/components/embeds/figma-embed.tsx +2 -2
- package/src/components/embeds/google-sheets-viewer.tsx +1 -1
- package/src/components/embeds/pdf-viewer.tsx +3 -3
- package/src/components/empty-state.tsx +6 -6
- package/src/components/faq/faq-section.tsx +2 -2
- package/src/components/faq-accordion.tsx +1 -1
- package/src/components/features/board/board-column-header.tsx +1 -1
- package/src/components/features/command-box.tsx +3 -3
- package/src/components/features/entity-video-section.tsx +2 -2
- package/src/components/features/figma-prototype-viewer.tsx +4 -1
- package/src/components/features/media-gallery-manager.tsx +3 -1
- package/src/components/features/parallax-image-showcase.tsx +9 -6
- package/src/components/features/policy-configuration-panel.tsx +9 -7
- package/src/components/features/provider-button.tsx +1 -1
- package/src/components/features/section-selector.tsx +11 -6
- package/src/components/features/select-button.tsx +4 -4
- package/src/components/features/seo-editor-preview.tsx +2 -2
- package/src/components/features/video-ratio-tabs.tsx +3 -3
- package/src/components/features/waitlist-form.tsx +1 -1
- package/src/components/help-center-pages/trust-center-page.tsx +1 -1
- package/src/components/help-center-pages/trust-center-sections.tsx +14 -14
- package/src/components/icon-display.tsx +1 -1
- package/src/components/layout/article-detail-layout.tsx +4 -2
- package/src/components/layout/list-page-layout.tsx +2 -2
- package/src/components/layout/page-container.tsx +26 -14
- package/src/components/layout/page-heading.tsx +1 -1
- package/src/components/layout/page-layout.tsx +1 -1
- package/src/components/layout/title-block.tsx +13 -13
- package/src/components/loading/card-skeleton.tsx +11 -11
- package/src/components/loading/category-vendor-selector-skeleton.tsx +1 -1
- package/src/components/loading/content-skeleton.tsx +6 -6
- package/src/components/loading/device-card-skeleton.tsx +1 -1
- package/src/components/loading/margin-report-skeleton.tsx +7 -7
- package/src/components/loading/msp-profile-form-skeleton.tsx +3 -3
- package/src/components/loading/organization-card-skeleton.tsx +2 -2
- package/src/components/loading/page-layout-skeleton.tsx +80 -68
- package/src/components/loading/unified-skeleton.tsx +16 -6
- package/src/components/media-carousel.tsx +3 -3
- package/src/components/meeting-scheduler/booking-form.tsx +9 -8
- package/src/components/meeting-scheduler/context-panel.tsx +8 -6
- package/src/components/meeting-scheduler/directory.tsx +4 -4
- package/src/components/meeting-scheduler/index.tsx +15 -15
- package/src/components/meeting-scheduler/slot-picker.tsx +12 -12
- package/src/components/navigation/app-header.tsx +6 -0
- package/src/components/navigation/app-layout-side-panel.tsx +594 -0
- package/src/components/navigation/app-layout.tsx +69 -4
- package/src/components/navigation/header-mingo-button.tsx +13 -3
- package/src/components/navigation/index.ts +5 -0
- package/src/components/navigation/navigation-sidebar.tsx +17 -3
- package/src/components/navigation/sliding-sidebar.tsx +2 -1
- package/src/components/pagination.tsx +3 -3
- package/src/components/persistent-filter-controls.tsx +6 -2
- package/src/components/platform/ScriptArguments.tsx +1 -1
- package/src/components/platform/ScriptInfoSection.tsx +4 -4
- package/src/components/platform/SoftwareSourceBadge.tsx +1 -1
- package/src/components/shared/article-author-byline.tsx +1 -1
- package/src/components/shared/delivery/delivery-lists.tsx +2 -2
- package/src/components/shared/delivery/delivery-row.tsx +7 -7
- package/src/components/shared/delivery/delivery-table.tsx +3 -3
- package/src/components/shared/detail-page-skeleton.tsx +11 -5
- package/src/components/shared/dev-section/dev-card-row.tsx +6 -6
- package/src/components/shared/dev-section/dev-section-view.tsx +1 -1
- package/src/components/shared/product-release/product-release-card-skeleton.tsx +8 -8
- package/src/components/shared/product-release/product-release-card.tsx +9 -9
- package/src/components/shared/product-release/product-releases-view.tsx +1 -1
- package/src/components/shared/product-release/release-detail-page.tsx +5 -5
- package/src/components/shared/roadmap/roadmap-grid-skeleton.tsx +1 -1
- package/src/components/shared/roadmap/roadmap-grid.tsx +3 -3
- package/src/components/tickets/help-center-card.tsx +1 -1
- package/src/components/tickets/help-center-create-form.tsx +12 -12
- package/src/components/ui/announcement-bar-view.tsx +2 -10
- package/src/components/ui/benefit-card.tsx +18 -18
- package/src/components/ui/brand-association-grid.tsx +4 -4
- package/src/components/ui/breadcrumb.tsx +4 -1
- package/src/components/ui/card.tsx +1 -1
- package/src/components/ui/checkbox-block.tsx +9 -7
- package/src/components/ui/content-loader.tsx +3 -3
- package/src/components/ui/cursor-pagination.tsx +3 -3
- package/src/components/ui/dashboard-info-card.tsx +13 -9
- package/src/components/ui/data-attribution.tsx +2 -2
- package/src/components/ui/data-table/data-table-body.tsx +2 -2
- package/src/components/ui/data-table/data-table-header.tsx +15 -15
- package/src/components/ui/data-table/data-table-skeleton.tsx +6 -6
- package/src/components/ui/data-table/utils.ts +5 -5
- package/src/components/ui/dialog.tsx +4 -1
- package/src/components/ui/drawer.tsx +2 -1
- package/src/components/ui/duration-input.tsx +1 -1
- package/src/components/ui/entity-image.tsx +3 -3
- package/src/components/ui/feature-card.tsx +10 -10
- package/src/components/ui/file-manager/file-manager-action-bar.tsx +1 -1
- package/src/components/ui/file-manager/file-manager.tsx +1 -1
- package/src/components/ui/filter-modal.tsx +8 -1
- package/src/components/ui/highlight-card.tsx +7 -7
- package/src/components/ui/info-card-row.tsx +10 -6
- package/src/components/ui/modal-v2.tsx +7 -2
- package/src/components/ui/modal.tsx +3 -2
- package/src/components/ui/no-data/no-data-actions.tsx +10 -4
- package/src/components/ui/no-data/no-data-styles.ts +1 -1
- package/src/components/ui/no-data/no-data.tsx +1 -1
- package/src/components/ui/organization-card.tsx +1 -1
- package/src/components/ui/page-actions.tsx +34 -5
- package/src/components/ui/progress-bar.tsx +2 -2
- package/src/components/ui/query-report-table/query-report-table.tsx +1 -1
- package/src/components/ui/search-input.tsx +2 -2
- package/src/components/ui/service-card.tsx +2 -2
- package/src/components/ui/sheet.tsx +2 -1
- package/src/components/ui/skeleton.tsx +3 -3
- package/src/components/ui/stacked-rows-panel.tsx +4 -4
- package/src/components/ui/tab-navigation.tsx +2 -2
- package/src/components/ui/tab-selector.tsx +2 -2
- package/src/components/ui/table/table-header.tsx +3 -3
- package/src/components/ui/table/table-skeleton.tsx +3 -3
- package/src/components/ui/table/utils.ts +5 -5
- package/src/components/ui/tag-search-input.tsx +3 -3
- package/src/components/ui/tags-manager.tsx +5 -5
- package/src/components/ui/test-run.tsx +2 -2
- package/src/components/ui/ticket-info-section.tsx +1 -1
- package/src/components/ui/ticket-notes-section.tsx +1 -1
- package/src/components/ui/ticket-status-config-row.tsx +15 -15
- package/src/hooks/ui/index.ts +1 -0
- package/src/hooks/ui/use-content-breakpoint.ts +58 -0
- package/src/hooks/ui/use-media-query.ts +3 -2
- package/src/styles/app-globals.css +13 -0
- package/src/styles/index.css +2 -0
- package/src/styles/layout-steps.ts +14 -0
- package/src/styles/ods-colors.css +15 -0
- package/src/styles/ods-content-area-tokens.css +27 -0
- package/src/styles/ods-content-area.css +31 -0
- package/src/styles/ods-effects.css +4 -2
- package/src/styles/ods-responsive-tokens.css +14 -4
- package/tailwind.config.ts +42 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { useContentLgUp } from '../../../hooks/ui/use-content-breakpoint';
|
|
4
4
|
import { cn } from '../../../utils/cn';
|
|
5
5
|
import { Arrow01DownIcon } from '../../icons-v2-generated/arrows/arrow-01-down-icon';
|
|
6
6
|
import { Arrow01UpIcon } from '../../icons-v2-generated/arrows/arrow-01-up-icon';
|
|
@@ -72,12 +72,12 @@ export function TableHeader<T = TableRowData>({
|
|
|
72
72
|
);
|
|
73
73
|
};
|
|
74
74
|
|
|
75
|
-
const isLgUp =
|
|
75
|
+
const isLgUp = useContentLgUp() ?? false;
|
|
76
76
|
|
|
77
77
|
return (
|
|
78
78
|
<div
|
|
79
79
|
className={cn(
|
|
80
|
-
'relative hidden h-11 items-center gap-4 px-4 py-3 md:flex',
|
|
80
|
+
'relative hidden h-11 items-center gap-4 px-4 py-3 content-md:flex',
|
|
81
81
|
stickyHeader && `sticky z-10 bg-ods-bg ${stickyHeaderOffset || 'top-0'}`,
|
|
82
82
|
className,
|
|
83
83
|
)}
|
|
@@ -5,7 +5,7 @@ import type { TableCardSkeletonProps } from './types';
|
|
|
5
5
|
|
|
6
6
|
// INNER row heights: the bordered row card adds 1px top + bottom, so the
|
|
7
7
|
// outer block totals the designed 68px / 80px.
|
|
8
|
-
const ROW_HEIGHT_DESKTOP = 'h-[66px] md:h-[78px]';
|
|
8
|
+
const ROW_HEIGHT_DESKTOP = 'h-[66px] content-md:h-[78px]';
|
|
9
9
|
/**
|
|
10
10
|
* A `compact` row's floor. Compact rows are content-sized (`py-2`), but every
|
|
11
11
|
* row in one table renders the same cell shapes, so pinning a minimum makes the
|
|
@@ -47,7 +47,7 @@ export function TableCardSkeleton({
|
|
|
47
47
|
the two here made every compact table jump on its first paint. */}
|
|
48
48
|
<div
|
|
49
49
|
className={cn(
|
|
50
|
-
'hidden items-center gap-4 px-4 md:flex',
|
|
50
|
+
'hidden items-center gap-4 px-4 content-md:flex',
|
|
51
51
|
compact ? cn('py-2', COMPACT_ROW_MIN_HEIGHT) : cn('py-0', ROW_HEIGHT_DESKTOP),
|
|
52
52
|
rowClassName,
|
|
53
53
|
)}
|
|
@@ -81,7 +81,7 @@ export function TableCardSkeleton({
|
|
|
81
81
|
{/* Mobile Skeleton */}
|
|
82
82
|
<div
|
|
83
83
|
className={cn(
|
|
84
|
-
'flex items-center justify-start gap-3 px-3 md:hidden',
|
|
84
|
+
'flex items-center justify-start gap-3 px-3 content-md:hidden',
|
|
85
85
|
// Mirror the real row on mobile too: a compact row is
|
|
86
86
|
// content-sized with a floor, a normal row a fixed height.
|
|
87
87
|
// Hard-wiring ROW_HEIGHT_MOBILE made every COMPACT table jump
|
|
@@ -16,21 +16,21 @@ export function getHideClasses(hideAt?: TailwindBreakpoint | TailwindBreakpoint[
|
|
|
16
16
|
const maxBreakpointIndex = Math.max(...breakpoints.map(bp => breakpointOrder.indexOf(bp)));
|
|
17
17
|
|
|
18
18
|
// For single breakpoint: hide below, show at and above
|
|
19
|
-
// e.g., hideAt: 'md' -> 'hidden md:flex'
|
|
19
|
+
// e.g., hideAt: 'md' -> 'hidden content-md:flex'
|
|
20
20
|
if (breakpoints.length === 1) {
|
|
21
|
-
return `hidden
|
|
21
|
+
return `hidden content-${breakpoints[0]}:flex`;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// For multiple breakpoints: hide at specified breakpoints, show after the largest one
|
|
25
|
-
// e.g., hideAt: ['md', 'lg'] -> 'md:hidden lg:hidden xl:flex'
|
|
26
|
-
const hideClasses = breakpoints.map(bp =>
|
|
25
|
+
// e.g., hideAt: ['md', 'lg'] -> 'content-md:hidden content-lg:hidden content-xl:flex'
|
|
26
|
+
const hideClasses = breakpoints.map(bp => `content-${bp}:hidden`).join(' ');
|
|
27
27
|
|
|
28
28
|
// Find next breakpoint after the max to show the column
|
|
29
29
|
const nextBreakpointIndex = maxBreakpointIndex + 1;
|
|
30
30
|
const showBreakpoint = breakpointOrder[nextBreakpointIndex];
|
|
31
31
|
|
|
32
32
|
if (showBreakpoint) {
|
|
33
|
-
return `${hideClasses}
|
|
33
|
+
return `${hideClasses} content-${showBreakpoint}:flex`;
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
// If no next breakpoint (e.g., hideAt: '2xl'), just hide
|
|
@@ -149,7 +149,7 @@ export function TagSearchInput<T = string>({
|
|
|
149
149
|
{/* ---- Visible container ---- */}
|
|
150
150
|
<div
|
|
151
151
|
className={cn(
|
|
152
|
-
'flex h-11 cursor-text items-center rounded-[6px] border md:h-12',
|
|
152
|
+
'flex h-11 cursor-text items-center rounded-[6px] border content-md:h-12',
|
|
153
153
|
'transition-colors duration-200',
|
|
154
154
|
'border-ods-border bg-ods-card',
|
|
155
155
|
'has-[:focus]:border-ods-accent',
|
|
@@ -170,7 +170,7 @@ export function TagSearchInput<T = string>({
|
|
|
170
170
|
>
|
|
171
171
|
{/* Search icon — pinned left, responsive size */}
|
|
172
172
|
<div className="flex shrink-0 items-center pl-3">
|
|
173
|
-
<SearchIcon className="size-4 text-ods-text-secondary md:size-6" />
|
|
173
|
+
<SearchIcon className="size-4 text-ods-text-secondary content-md:size-6" />
|
|
174
174
|
</div>
|
|
175
175
|
|
|
176
176
|
{/* Middle zone: tags + input — overflow hidden so tags never push clear btn */}
|
|
@@ -234,7 +234,7 @@ export function TagSearchInput<T = string>({
|
|
|
234
234
|
className="flex shrink-0 cursor-pointer items-center justify-center pr-3 transition-opacity hover:opacity-70"
|
|
235
235
|
aria-label="Clear all"
|
|
236
236
|
>
|
|
237
|
-
<XmarkCircleIcon className="size-4 text-ods-text-secondary md:size-6" />
|
|
237
|
+
<XmarkCircleIcon className="size-4 text-ods-text-secondary content-md:size-6" />
|
|
238
238
|
</button>
|
|
239
239
|
)}
|
|
240
240
|
</div>
|
|
@@ -169,7 +169,7 @@ export function TagsManager({
|
|
|
169
169
|
<PopoverPrimitive.Anchor asChild>
|
|
170
170
|
<label
|
|
171
171
|
className={cn(
|
|
172
|
-
'flex min-h-11 w-full cursor-text flex-wrap items-center gap-2 rounded-[6px] border px-3 py-1 md:min-h-12',
|
|
172
|
+
'flex min-h-11 w-full cursor-text flex-wrap items-center gap-2 rounded-[6px] border px-3 py-1 content-md:min-h-12',
|
|
173
173
|
'transition-colors duration-200',
|
|
174
174
|
'border-ods-border bg-ods-card',
|
|
175
175
|
'group',
|
|
@@ -185,7 +185,7 @@ export function TagsManager({
|
|
|
185
185
|
{/* Search adornment */}
|
|
186
186
|
<span
|
|
187
187
|
className={cn(
|
|
188
|
-
'flex-shrink-0 text-ods-text-secondary transition-colors duration-200 [&_svg]:size-4 md:[&_svg]:size-6',
|
|
188
|
+
'flex-shrink-0 text-ods-text-secondary transition-colors duration-200 [&_svg]:size-4 content-md:[&_svg]:size-6',
|
|
189
189
|
open && 'text-ods-accent',
|
|
190
190
|
)}
|
|
191
191
|
>
|
|
@@ -237,7 +237,7 @@ export function TagsManager({
|
|
|
237
237
|
<button
|
|
238
238
|
type="button"
|
|
239
239
|
onClick={handleClearAll}
|
|
240
|
-
className="flex flex-shrink-0 items-center justify-center transition-opacity hover:opacity-70 [&_svg]:size-4 md:[&_svg]:size-6"
|
|
240
|
+
className="flex flex-shrink-0 items-center justify-center transition-opacity hover:opacity-70 [&_svg]:size-4 content-md:[&_svg]:size-6"
|
|
241
241
|
aria-label="Clear all tags"
|
|
242
242
|
>
|
|
243
243
|
<XmarkCircleIcon className="text-ods-text-secondary" />
|
|
@@ -319,7 +319,7 @@ export function TagsManager({
|
|
|
319
319
|
aria-selected={isSelected}
|
|
320
320
|
tabIndex={0}
|
|
321
321
|
className={cn(
|
|
322
|
-
'flex h-11 cursor-pointer items-center border-b border-ods-border px-4 transition-colors last:border-b-0 md:h-12',
|
|
322
|
+
'flex h-11 cursor-pointer items-center border-b border-ods-border px-4 transition-colors last:border-b-0 content-md:h-12',
|
|
323
323
|
'text-h4',
|
|
324
324
|
isSelected ? 'text-ods-accent' : 'text-ods-text-primary',
|
|
325
325
|
'group/item hover:bg-ods-bg-hover',
|
|
@@ -383,7 +383,7 @@ export function TagsManager({
|
|
|
383
383
|
aria-selected={false}
|
|
384
384
|
tabIndex={0}
|
|
385
385
|
className={cn(
|
|
386
|
-
'flex h-11 cursor-pointer items-center gap-2 px-4 transition-colors text-h4 md:h-12',
|
|
386
|
+
'flex h-11 cursor-pointer items-center gap-2 px-4 transition-colors text-h4 content-md:h-12',
|
|
387
387
|
'hover:bg-ods-bg-hover',
|
|
388
388
|
isCreating && 'pointer-events-none opacity-50',
|
|
389
389
|
)}
|
|
@@ -53,7 +53,7 @@ export function TestResultsSkeleton() {
|
|
|
53
53
|
<div className="animate-pulse overflow-hidden rounded-[6px] border border-ods-border bg-ods-card">
|
|
54
54
|
{/* Same INNER row heights as the DataTable (66/78px + the 1px card
|
|
55
55
|
border on each side = 68/80px total, per design). */}
|
|
56
|
-
<div className="flex h-[66px] items-center gap-[var(--spacing-system-mf)] px-[var(--spacing-system-mf)] md:h-[78px]">
|
|
56
|
+
<div className="flex h-[66px] items-center gap-[var(--spacing-system-mf)] px-[var(--spacing-system-mf)] content-md:h-[78px]">
|
|
57
57
|
{Array.from({ length: SKELETON_COLUMNS }).map((_, i) => (
|
|
58
58
|
<div key={`skeleton-cell-${i}`} className="w-[160px] shrink-0">
|
|
59
59
|
<div className="h-5 w-3/4 rounded-sm bg-ods-bg-surface" />
|
|
@@ -114,7 +114,7 @@ export function TestResultsTable({ rows, loading }: { rows: QueryResultRow[]; lo
|
|
|
114
114
|
<ScrollShadow axis="horizontal">
|
|
115
115
|
<div style={{ minWidth: Math.max(1, columnKeys.length) * RESULT_COLUMN_MIN_WIDTH }}>
|
|
116
116
|
<DataTable table={table}>
|
|
117
|
-
{/* "flex" overrides the header's default "hidden md:flex" so the
|
|
117
|
+
{/* "flex" overrides the header's default "hidden content-md:flex" so the
|
|
118
118
|
headers render on mobile too. */}
|
|
119
119
|
<DataTable.Header className="flex flex-col" />
|
|
120
120
|
<DataTable.Body loading={false} />
|
|
@@ -153,7 +153,7 @@ export function TicketInfoSection({
|
|
|
153
153
|
return (
|
|
154
154
|
<div className={cn('overflow-hidden rounded-[6px] border border-ods-border', className)}>
|
|
155
155
|
{/* Header row */}
|
|
156
|
-
<div className="grid grid-cols-2 items-center gap-4 border-b border-ods-border bg-ods-card px-4 py-3 lg:grid-cols-[1fr_1fr_1fr_auto]">
|
|
156
|
+
<div className="grid grid-cols-2 items-center gap-4 border-b border-ods-border bg-ods-card px-4 py-3 content-lg:grid-cols-[1fr_1fr_1fr_auto]">
|
|
157
157
|
{/* Organization with image */}
|
|
158
158
|
<div className="flex min-w-0 items-center gap-2">
|
|
159
159
|
<SquareAvatar
|
|
@@ -62,7 +62,7 @@ export function TicketNotesSection({
|
|
|
62
62
|
onClick={handleSend}
|
|
63
63
|
disabled={!noteText.trim() || isAddingNote}
|
|
64
64
|
className={cn(
|
|
65
|
-
'flex h-11 w-11 shrink-0 items-center justify-center rounded-[6px] md:h-12 md:w-12',
|
|
65
|
+
'flex h-11 w-11 shrink-0 items-center justify-center rounded-[6px] content-md:h-12 content-md:w-12',
|
|
66
66
|
'border border-ods-border bg-ods-card',
|
|
67
67
|
'transition-colors hover:bg-ods-bg-hover',
|
|
68
68
|
'disabled:cursor-not-allowed disabled:opacity-50',
|
|
@@ -93,7 +93,7 @@ export function TicketStatusConfigRow({
|
|
|
93
93
|
<div
|
|
94
94
|
className={cn(
|
|
95
95
|
// Transparent background — only the border outlines the row.
|
|
96
|
-
'flex w-full items-start gap-3 rounded-md border border-ods-border md:gap-[var(--spacing-system-m)]',
|
|
96
|
+
'flex w-full items-start gap-3 rounded-md border border-ods-border content-md:gap-[var(--spacing-system-m)]',
|
|
97
97
|
'p-[var(--spacing-system-m)]',
|
|
98
98
|
// The dragged row travels over its siblings, so it needs an opaque back.
|
|
99
99
|
isDragging && 'bg-ods-bg opacity-70 shadow-lg',
|
|
@@ -102,7 +102,7 @@ export function TicketStatusConfigRow({
|
|
|
102
102
|
{dragAndDropEnabled && (
|
|
103
103
|
<div
|
|
104
104
|
className={cn(
|
|
105
|
-
'flex h-11 w-8 shrink-0 items-center justify-center text-ods-text-secondary md:h-12',
|
|
105
|
+
'flex h-11 w-8 shrink-0 items-center justify-center text-ods-text-secondary content-md:h-12',
|
|
106
106
|
fieldRowOffset,
|
|
107
107
|
)}
|
|
108
108
|
>
|
|
@@ -131,14 +131,14 @@ export function TicketStatusConfigRow({
|
|
|
131
131
|
and the chip pins to the card's right edge on tablet/mobile. */}
|
|
132
132
|
<div
|
|
133
133
|
className={cn(
|
|
134
|
-
'min-w-0 flex-1 items-start gap-x-3 gap-y-[var(--spacing-system-m)] md:gap-x-[var(--spacing-system-m)]',
|
|
134
|
+
'min-w-0 flex-1 items-start gap-x-3 gap-y-[var(--spacing-system-m)] content-md:gap-x-[var(--spacing-system-m)]',
|
|
135
135
|
isSystem
|
|
136
136
|
? 'flex flex-wrap'
|
|
137
137
|
: // Mobile custom rows are a strict two-column grid, per the mock:
|
|
138
138
|
// fields (name / color / hex, all one width) on the left, the
|
|
139
139
|
// controls and the chip stacked in the right column. From md up
|
|
140
140
|
// the same children flow as a wrapping flex row.
|
|
141
|
-
'grid grid-cols-[minmax(0,1fr)_auto] md:flex md:flex-wrap',
|
|
141
|
+
'grid grid-cols-[minmax(0,1fr)_auto] content-md:flex content-md:flex-wrap',
|
|
142
142
|
)}
|
|
143
143
|
>
|
|
144
144
|
{/* System rows keep the chip beside the name on every width, so the name
|
|
@@ -158,7 +158,7 @@ export function TicketStatusConfigRow({
|
|
|
158
158
|
</div>
|
|
159
159
|
|
|
160
160
|
{showColorPicker ? (
|
|
161
|
-
<div className="order-3 flex min-w-0 grow basis-full flex-col gap-[var(--spacing-system-xxs)] md:order-2 md:basis-0">
|
|
161
|
+
<div className="order-3 flex min-w-0 grow basis-full flex-col gap-[var(--spacing-system-xxs)] content-md:order-2 content-md:basis-0">
|
|
162
162
|
<Label variant="large">Color</Label>
|
|
163
163
|
<ColorPresetSelect value={color} presetKey={presetKey} onChange={onColorChange} />
|
|
164
164
|
{/* Custom hex: a second field row inside the Color column, directly
|
|
@@ -170,16 +170,16 @@ export function TicketStatusConfigRow({
|
|
|
170
170
|
)}
|
|
171
171
|
</div>
|
|
172
172
|
) : (
|
|
173
|
-
<div aria-hidden className="hidden min-w-0 grow basis-0 lg:order-2 lg:block" />
|
|
173
|
+
<div aria-hidden className="hidden min-w-0 grow basis-0 content-lg:order-2 content-lg:block" />
|
|
174
174
|
)}
|
|
175
175
|
|
|
176
176
|
{/* Reserved desktop column slot (the mock's "No activity Indicator" zone). */}
|
|
177
|
-
<div aria-hidden className="hidden min-w-0 grow basis-0 lg:order-3 lg:block" />
|
|
177
|
+
<div aria-hidden className="hidden min-w-0 grow basis-0 content-lg:order-3 content-lg:block" />
|
|
178
178
|
|
|
179
179
|
{isSystem ? (
|
|
180
180
|
<div
|
|
181
181
|
className={cn(
|
|
182
|
-
'order-2 flex h-11 min-w-0 grow basis-0 items-center justify-end md:h-12 lg:order-4',
|
|
182
|
+
'order-2 flex h-11 min-w-0 grow basis-0 items-center justify-end content-md:h-12 content-lg:order-4',
|
|
183
183
|
fieldRowOffset,
|
|
184
184
|
)}
|
|
185
185
|
>
|
|
@@ -191,7 +191,7 @@ export function TicketStatusConfigRow({
|
|
|
191
191
|
before the controls. */}
|
|
192
192
|
<div
|
|
193
193
|
className={cn(
|
|
194
|
-
'hidden h-12 min-w-0 grow basis-0 items-center justify-end lg:order-4 lg:flex',
|
|
194
|
+
'hidden h-12 min-w-0 grow basis-0 items-center justify-end content-lg:order-4 content-lg:flex',
|
|
195
195
|
fieldRowOffset,
|
|
196
196
|
)}
|
|
197
197
|
>
|
|
@@ -199,25 +199,25 @@ export function TicketStatusConfigRow({
|
|
|
199
199
|
</div>
|
|
200
200
|
{/* Tablet: the chip takes a full row of its own, pinned to the
|
|
201
201
|
card's right edge (the controls above no longer narrow it). */}
|
|
202
|
-
<div className="hidden min-w-0 basis-full items-center justify-end md:order-4 md:flex lg:hidden">
|
|
202
|
+
<div className="hidden min-w-0 basis-full items-center justify-end content-md:order-4 content-md:flex content-lg:hidden">
|
|
203
203
|
{chip}
|
|
204
204
|
</div>
|
|
205
205
|
{/* Mobile: the chip fills the second grid column beside the color
|
|
206
206
|
field, left-aligned with the controls above it. */}
|
|
207
|
-
<div className={cn('order-4 flex h-11 min-w-0 items-center md:hidden', fieldRowOffset)}>{chip}</div>
|
|
207
|
+
<div className={cn('order-4 flex h-11 min-w-0 items-center content-md:hidden', fieldRowOffset)}>{chip}</div>
|
|
208
208
|
</>
|
|
209
209
|
)}
|
|
210
210
|
|
|
211
211
|
<div
|
|
212
212
|
className={cn(
|
|
213
|
-
'flex h-11 shrink-0 items-center justify-end gap-[var(--spacing-system-s)] md:h-12 lg:order-5',
|
|
214
|
-
isSystem ? 'order-3' : 'order-2 md:order-3',
|
|
213
|
+
'flex h-11 shrink-0 items-center justify-end gap-[var(--spacing-system-s)] content-md:h-12 content-lg:order-5',
|
|
214
|
+
isSystem ? 'order-3' : 'order-2 content-md:order-3',
|
|
215
215
|
fieldRowOffset,
|
|
216
216
|
)}
|
|
217
217
|
>
|
|
218
218
|
{!isSystem && moveButtons}
|
|
219
219
|
{isSystem ? (
|
|
220
|
-
<div className="flex w-11 justify-center md:w-12">
|
|
220
|
+
<div className="flex w-11 justify-center content-md:w-12">
|
|
221
221
|
<TouchFriendlyTooltip content={systemTooltip}>
|
|
222
222
|
<button
|
|
223
223
|
type="button"
|
|
@@ -238,7 +238,7 @@ export function TicketStatusConfigRow({
|
|
|
238
238
|
aria-label="Delete status"
|
|
239
239
|
disabled={deleteDisabled}
|
|
240
240
|
onClick={deleteDisabled ? undefined : onDelete}
|
|
241
|
-
className={cn('size-11 md:size-12', deleteDisabled && 'pointer-events-none')}
|
|
241
|
+
className={cn('size-11 content-md:size-12', deleteDisabled && 'pointer-events-none')}
|
|
242
242
|
>
|
|
243
243
|
<TrashIcon className="text-ods-error" />
|
|
244
244
|
</Button>
|
package/src/hooks/ui/index.ts
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { createContext, createElement, type ReactNode, useContext } from 'react';
|
|
4
|
+
import { LAYOUT_STEPS } from '../../styles/layout-steps';
|
|
5
|
+
import { useLgUp, useMdUp } from './use-media-query';
|
|
6
|
+
|
|
7
|
+
export type ContentBreakpoint = 'mobile' | 'tablet' | 'desktop';
|
|
8
|
+
|
|
9
|
+
/** Content-area steps, in px of the area's own width. */
|
|
10
|
+
export const CONTENT_BREAKPOINTS = { md: LAYOUT_STEPS.md.content, lg: LAYOUT_STEPS.lg.content } as const;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Width of the enclosing content area (`AppLayout` with a side panel provides
|
|
14
|
+
* it), or `null` outside one.
|
|
15
|
+
*/
|
|
16
|
+
export const ContentAreaWidthContext = createContext<number | null>(null);
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* For window chrome opened from a content area (a modal, a drawer): its subtree
|
|
20
|
+
* is back on the viewport's steps. Context crosses a portal, so without this
|
|
21
|
+
* the hooks below would still answer with the content area's width.
|
|
22
|
+
*/
|
|
23
|
+
export function ViewportBreakpoints({ children }: { children: ReactNode }) {
|
|
24
|
+
return createElement(ContentAreaWidthContext.Provider, { value: null }, children);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function contentBreakpointFor(width: number): ContentBreakpoint {
|
|
28
|
+
if (width >= CONTENT_BREAKPOINTS.lg) return 'desktop';
|
|
29
|
+
if (width >= CONTENT_BREAKPOINTS.md) return 'tablet';
|
|
30
|
+
return 'mobile';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The breakpoint a component should lay out for: the content area's when it
|
|
35
|
+
* renders inside one, the viewport's otherwise. `undefined` until the viewport
|
|
36
|
+
* is known (first client render), like `useMdUp`.
|
|
37
|
+
*/
|
|
38
|
+
export function useContentBreakpoint(): ContentBreakpoint | undefined {
|
|
39
|
+
const width = useContext(ContentAreaWidthContext);
|
|
40
|
+
const mdUp = useMdUp();
|
|
41
|
+
const lgUp = useLgUp();
|
|
42
|
+
if (width !== null) return contentBreakpointFor(width);
|
|
43
|
+
if (mdUp === undefined) return undefined;
|
|
44
|
+
if (lgUp) return 'desktop';
|
|
45
|
+
return mdUp ? 'tablet' : 'mobile';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Content-area counterpart of `useMdUp`. */
|
|
49
|
+
export function useContentMdUp(): boolean | undefined {
|
|
50
|
+
const breakpoint = useContentBreakpoint();
|
|
51
|
+
return breakpoint === undefined ? undefined : breakpoint !== 'mobile';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Content-area counterpart of `useLgUp`. */
|
|
55
|
+
export function useContentLgUp(): boolean | undefined {
|
|
56
|
+
const breakpoint = useContentBreakpoint();
|
|
57
|
+
return breakpoint === undefined ? undefined : breakpoint === 'desktop';
|
|
58
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useState } from 'react';
|
|
4
|
+
import { LAYOUT_STEPS } from '../../styles/layout-steps';
|
|
4
5
|
import { useIsomorphicLayoutEffect } from './use-isomorphic-layout-effect';
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -35,8 +36,8 @@ export function useMediaQuery(query: string): boolean | undefined {
|
|
|
35
36
|
* Predefined breakpoints for common screen sizes
|
|
36
37
|
*/
|
|
37
38
|
export const breakpoints = {
|
|
38
|
-
md:
|
|
39
|
-
lg:
|
|
39
|
+
md: `(min-width: ${LAYOUT_STEPS.md.viewport}px)`, // Tablet
|
|
40
|
+
lg: `(min-width: ${LAYOUT_STEPS.lg.viewport}px)`, // Desktop
|
|
40
41
|
};
|
|
41
42
|
|
|
42
43
|
/** @deprecated Use useMdUp instead */
|
|
@@ -154,6 +154,19 @@ body[data-scroll-locked][data-scroll-locked] {
|
|
|
154
154
|
transform-origin: left top;
|
|
155
155
|
transform: scale(1);
|
|
156
156
|
}
|
|
157
|
+
|
|
158
|
+
/* The chat composer (chat-input.tsx) is a contenteditable div, not a
|
|
159
|
+
textarea, and WebKit's focus auto-zoom keys off its font size the same
|
|
160
|
+
way. Keyed on its own data-editor rather than [contenteditable]: a global
|
|
161
|
+
match would also resize consumers' editors (CodeMirror's .cm-content) and
|
|
162
|
+
drop the composer back to 14px while disabled. Its placeholder and hover
|
|
163
|
+
preview overlay it as siblings, so they are pinned with it or the text
|
|
164
|
+
would change size on the first keystroke. Mention chips stay small only
|
|
165
|
+
because Tag sets its own text-h5. */
|
|
166
|
+
[data-editor],
|
|
167
|
+
[data-editor-ghost] {
|
|
168
|
+
font-size: 16px !important;
|
|
169
|
+
}
|
|
157
170
|
}
|
|
158
171
|
|
|
159
172
|
/* Shadcn/ui HSL CSS variables for Tailwind compatibility */
|
package/src/styles/index.css
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
@import './ods-interaction-states.css';
|
|
6
6
|
@import './ods-effects.css';
|
|
7
7
|
@import './ods-responsive-tokens.css';
|
|
8
|
+
@import './ods-content-area.css';
|
|
9
|
+
@import './ods-content-area-tokens.css';
|
|
8
10
|
@import './app-globals.css';
|
|
9
11
|
@import './chat-animations.css';
|
|
10
12
|
@import './ods-page-shell.css';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout steps in px, the one place they are written. `viewport` is the window
|
|
3
|
+
* step (`md:`, `useMdUp`), `content` its content-area counterpart
|
|
4
|
+
* (`content-md:`, `useContentMdUp`): the viewport step less the navigation.
|
|
5
|
+
*
|
|
6
|
+
* Imported by tailwind.config.ts, so it must stay free of imports and aliases.
|
|
7
|
+
*/
|
|
8
|
+
export const LAYOUT_STEPS = {
|
|
9
|
+
sm: { viewport: 640, content: 640 },
|
|
10
|
+
md: { viewport: 800, content: 720 },
|
|
11
|
+
lg: { viewport: 1280, content: 1024 },
|
|
12
|
+
xl: { viewport: 1440, content: 1216 },
|
|
13
|
+
'2xl': { viewport: 1536, content: 1312 },
|
|
14
|
+
} as const;
|
|
@@ -417,6 +417,21 @@
|
|
|
417
417
|
--color-bg: color-mix(in srgb, var(--color-accent-primary) 2%, var(--ods-system-greys-background));
|
|
418
418
|
}
|
|
419
419
|
|
|
420
|
+
/* Mingo's own surface (Figma backgrounds/mingo-background): 2% of its cyan
|
|
421
|
+
* over the page background, whatever the tenant accent. */
|
|
422
|
+
[data-surface='mingo'] {
|
|
423
|
+
--color-bg: color-mix(in srgb, var(--ods-flamingo-cyan-base) 2%, var(--ods-system-greys-background));
|
|
424
|
+
--glow-color: var(--ods-flamingo-cyan-base);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/* Mingo-branded controls (its chat list): the cyan as the accent, and the
|
|
428
|
+
* selection fill (Figma flamingo-colors/cyan-sec) as its secondary. Scoped to
|
|
429
|
+
* those controls, not the whole panel: an approval's Approve stays yellow. */
|
|
430
|
+
[data-accent='mingo'] {
|
|
431
|
+
--color-accent-primary: var(--ods-flamingo-cyan-base);
|
|
432
|
+
--color-accent-secondary: color-mix(in srgb, var(--ods-flamingo-cyan-base) 31%, var(--color-bg));
|
|
433
|
+
}
|
|
434
|
+
|
|
420
435
|
/* ===================================================================== */
|
|
421
436
|
/* PLATFORM OVERRIDES — brand/accent ONLY. */
|
|
422
437
|
/* Reference `--ods-*` so they follow the active theme; never touch */
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* GENERATED from ods-responsive-tokens.css. Do not edit: `npm run generate:content-area`. */
|
|
2
|
+
|
|
3
|
+
@container ods-content not (min-width: 720px) {
|
|
4
|
+
.ods-content-scope {
|
|
5
|
+
--device-type: mobile;
|
|
6
|
+
--device-screen-width: 26.875rem;
|
|
7
|
+
--spacing-system-xs: 0.25rem;
|
|
8
|
+
--spacing-system-s: 0.5rem;
|
|
9
|
+
--spacing-system-m: 0.75rem;
|
|
10
|
+
--spacing-system-l: 1rem;
|
|
11
|
+
--spacing-system-xl: 1.5rem;
|
|
12
|
+
--spacing-system-xxl: 2.5rem;
|
|
13
|
+
--font-size-h1-title: 2.5rem;
|
|
14
|
+
--font-size-h2-sub-title: 1.5rem;
|
|
15
|
+
--font-size-h3-body: 0.875rem;
|
|
16
|
+
--font-size-h4-body: 0.875rem;
|
|
17
|
+
--font-size-h5-caption: 0.75rem;
|
|
18
|
+
--font-size-h6-caption: 0.75rem;
|
|
19
|
+
--font-line-space-h1-main-title: 2.5rem;
|
|
20
|
+
--font-line-space-h2-sub-title: 2rem;
|
|
21
|
+
--font-line-space-h3-body: 1.25rem;
|
|
22
|
+
--font-line-space-h4-body: 1.25rem;
|
|
23
|
+
--font-line-space-h5-caption: 1rem;
|
|
24
|
+
--font-line-space-h6-caption: 1rem;
|
|
25
|
+
--icon-size-icon-size: 1rem;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/* Open Design System – Content Area Tokens */
|
|
2
|
+
/*
|
|
3
|
+
* The responsive tokens in ods-responsive-tokens.css follow the VIEWPORT. A
|
|
4
|
+
* layout with a docked side panel narrows the content area without the
|
|
5
|
+
* viewport changing, so content inside `.ods-content-area` follows its OWN
|
|
6
|
+
* width instead:
|
|
7
|
+
*
|
|
8
|
+
* - `.ods-content-area` is a named inline-size container (`ods-content`).
|
|
9
|
+
* - `.ods-content-scope` sits inside it and re-declares the mobile tokens
|
|
10
|
+
* while the area is narrower than the content `md` step
|
|
11
|
+
* (ods-content-area-tokens.css, generated). The variables cascade, so
|
|
12
|
+
* every `text-h*` and `var(--spacing-system-*)` below the scope picks
|
|
13
|
+
* them up with no change to the components.
|
|
14
|
+
* - From that step up the scope declares nothing and inherits the viewport
|
|
15
|
+
* tokens from :root, so a wide content area renders exactly as before.
|
|
16
|
+
*
|
|
17
|
+
* A container query cannot style the container itself, hence two elements.
|
|
18
|
+
* The scope is `display: contents`: it carries the variables without adding a
|
|
19
|
+
* box, so pages keep `<main>` as their layout parent.
|
|
20
|
+
*
|
|
21
|
+
* Layout switches inside the area use the `content-md:` / `content-lg:`
|
|
22
|
+
* Tailwind variants. The steps themselves live in layout-steps.ts.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
.ods-content-area {
|
|
26
|
+
container: ods-content / inline-size;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.ods-content-scope {
|
|
30
|
+
display: contents;
|
|
31
|
+
}
|
|
@@ -57,10 +57,12 @@
|
|
|
57
57
|
the corner, radii 100% × 103% as in the design). Written
|
|
58
58
|
on the class, not as a :root variable, so the accent resolves on the element
|
|
59
59
|
and follows a platform or runtime (tenant) accent set below the root. */
|
|
60
|
+
/* The color is `--glow-color` when a surface sets one (Mingo's cyan), the
|
|
61
|
+
accent otherwise. */
|
|
60
62
|
.ods-glow-accent-corner {
|
|
61
63
|
background-image: radial-gradient(
|
|
62
64
|
100% 103% at 100% 100%,
|
|
63
|
-
color-mix(in srgb, var(--color-accent-primary) 4%, transparent) 0%,
|
|
64
|
-
color-mix(in srgb, var(--color-accent-primary) 0%, transparent) 100%
|
|
65
|
+
color-mix(in srgb, var(--glow-color, var(--color-accent-primary)) 4%, transparent) 0%,
|
|
66
|
+
color-mix(in srgb, var(--glow-color, var(--color-accent-primary)) 0%, transparent) 100%
|
|
65
67
|
);
|
|
66
68
|
}
|
|
@@ -1,7 +1,15 @@
|
|
|
1
1
|
/* Open Design System – Responsive Design Tokens */
|
|
2
2
|
/* Mobile-first approach: base = mobile, then scale up with min-width */
|
|
3
|
-
|
|
4
|
-
:
|
|
3
|
+
/*
|
|
4
|
+
* `.ods-viewport-layer` restates the same values on an element: chrome that
|
|
5
|
+
* follows the WINDOW (a modal, a drawer) but renders inside a narrow content
|
|
6
|
+
* area, whose scope re-declares the mobile values
|
|
7
|
+
* (ods-content-area-tokens.css), gets the viewport's tokens back for its own
|
|
8
|
+
* subtree.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
:root,
|
|
12
|
+
.ods-viewport-layer {
|
|
5
13
|
/* =================================================== */
|
|
6
14
|
/* DEVICE CONTEXT */
|
|
7
15
|
/* =================================================== */
|
|
@@ -77,7 +85,8 @@
|
|
|
77
85
|
/* =================================================== */
|
|
78
86
|
|
|
79
87
|
@media (min-width: 800px) {
|
|
80
|
-
:root
|
|
88
|
+
:root,
|
|
89
|
+
.ods-viewport-layer {
|
|
81
90
|
/* Device Context */
|
|
82
91
|
--device-type: tablet;
|
|
83
92
|
--device-screen-width: 50rem;
|
|
@@ -122,7 +131,8 @@
|
|
|
122
131
|
/* =================================================== */
|
|
123
132
|
|
|
124
133
|
@media (min-width: 1280px) {
|
|
125
|
-
:root
|
|
134
|
+
:root,
|
|
135
|
+
.ods-viewport-layer {
|
|
126
136
|
/* Device Context */
|
|
127
137
|
--device-type: desktop;
|
|
128
138
|
--device-screen-width: 80rem;
|