{"id":9456,"date":"2025-04-30T09:51:37","date_gmt":"2025-04-30T09:51:37","guid":{"rendered":"https:\/\/youzum.net\/?page_id=9456"},"modified":"2025-05-09T10:36:56","modified_gmt":"2025-05-09T10:36:56","slug":"bookmark","status":"publish","type":"page","link":"https:\/\/youzum.net\/zh\/bookmark\/","title":{"rendered":"\u4e66\u7b7e"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"9456\" class=\"elementor elementor-9456\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-51be7e7 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"51be7e7\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-83a5035 elementor-widget elementor-widget-spacer\" data-id=\"83a5035\" data-element_type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d4462e6 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"d4462e6\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7b2621e7 elementor-widget elementor-widget-text-editor\" data-id=\"7b2621e7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\n<p>\n<div class=\"my-bookmarks-dashboard\">\n    <!-- Header with user welcome and stats -->\n    <div class=\"bookmarks-header\">\n        <div class=\"user-welcome\">\n            <div class=\"user-avatar\">\n                <img alt='' src='https:\/\/youzum.net\/wp-content\/plugins\/ultimate-member\/assets\/img\/default_avatar.jpg' srcset='https:\/\/youzum.net\/wp-content\/plugins\/ultimate-member\/assets\/img\/default_avatar.jpg 2x' class='avatar avatar-64 photo avatar-default' height='64' width='64' \/>            <\/div>\n            <div class=\"user-info\">\n                <h2>Hello, <\/h2>\n                <p class=\"bookmark-stats\">\n                    <span class=\"bookmark-count\">0<\/span> total bookmarks\n                <\/p>\n            <\/div>\n        <\/div>\n        \n        <!-- Add New Bookmark Button (if you have this functionality) -->\n        <div class=\"add-bookmark-area\">\n            <button class=\"share-to-bp-btn add-bookmark-btn\">\n                <span class=\"dashicons dashicons-plus-alt\"><\/span> \u65b0\u589e\u8cbc\u6587\n            <\/button>\n        <\/div>\n    <\/div>\n    \n    <!-- Modal for posting bookmarks to BuddyPress activity -->\n    <div class=\"bp-share-modal\" id=\"bp-share-modal\" style=\"display: none;\">\n        <div class=\"bp-share-modal-content\">\n            <div class=\"bp-share-modal-header\">\n                <h3>Share Bookmark to Activity<\/h3>\n                <span class=\"bp-share-modal-close\">&times;<\/span>\n            <\/div>\n            <div class=\"bp-share-modal-body\">\n                <div class=\"bp-share-input-wrapper\">\n                    <textarea id=\"bp-share-content\" placeholder=\"Write a message to share...\"><\/textarea>\n                <\/div>\n                \n                <h4>Select a bookmark to share<\/h4>\n                <div class=\"bp-share-bookmark-list\">\n                                            <p>No bookmarks available to share<\/p>\n                                    <\/div>\n            <\/div>\n            <div class=\"bp-share-modal-footer\">\n                <button class=\"bp-share-cancel-btn\">Cancel<\/button>\n                <button class=\"bp-share-submit-btn\" disabled>\n                    <span class=\"dashicons dashicons-share\"><\/span> Share to Activity\n                <\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n    \n            <!-- User not logged in message -->\n        <div class=\"login-required\">\n            <div class=\"login-icon\">\n                <span class=\"dashicons dashicons-privacy\"><\/span>\n            <\/div>\n            <h3>Please log in to view your bookmarks<\/h3>\n            <p>Sign in to access and manage all your bookmarks<\/p>\n            <a href=\"https:\/\/yousum.gpucore.co\/login\/\" class=\"login-button\">\n                Login\n            <\/a>\n        <\/div>\n    <\/div>\n\n<script>\njQuery(document).ready(function($) {\n    \/\/ View switching (Grid\/List)\n    $('.view-button').on('click', function() {\n        const viewType = $(this).data('view');\n        \n        \/\/ Update active button\n        $('.view-button').removeClass('active');\n        $(this).addClass('active');\n        \n        \/\/ Show selected view\n        if (viewType === 'grid') {\n            $('.bookmarks-grid').addClass('view-active');\n            $('.bookmarks-list').removeClass('view-active');\n        } else {\n            $('.bookmarks-grid').removeClass('view-active');\n            $('.bookmarks-list').addClass('view-active');\n        }\n    });\n    \n    \/\/ Share to BuddyPress modal functionality\n    $('.share-to-bp-btn').on('click', function() {\n        $('#bp-share-modal').fadeIn(300);\n    });\n    \n    $('.bp-share-modal-close, .bp-share-cancel-btn').on('click', function() {\n        $('#bp-share-modal').fadeOut(300);\n    });\n    \n    \/\/ Close modal when clicking outside the content\n    $('.bp-share-modal').on('click', function(e) {\n        if ($(e.target).hasClass('bp-share-modal')) {\n            $(this).fadeOut(300);\n        }\n    });\n    \n    \/\/ Handle bookmark selection\n    $('.bp-share-bookmark-item').on('click', function() {\n        const radioBtn = $(this).find('input[type=\"radio\"]');\n        radioBtn.prop('checked', true);\n        \n        \/\/ Add selected class to the item\n        $('.bp-share-bookmark-item').removeClass('selected');\n        $(this).addClass('selected');\n    });\n    \n    \/\/ Share to BuddyPress activity \n    $('.bp-share-submit-btn').on('click', function() {\n        const btn = $(this);\n        const selectedBookmarkId = $('input[name=\"share_bookmark\"]:checked').val();\n        const userContent = $('#bp-share-content').val();\n        \n        if (!selectedBookmarkId) {\n            alert('Please select a bookmark to share');\n            return;\n        }\n        \n        \/\/ Add loading state\n        btn.prop('disabled', true).html('<span class=\"spinner-border spinner-border-sm\"><\/span> Posting...');\n        \n        \/\/ AJAX request to post to BP activity\n        $.ajax({\n            url: publicBookmarks.ajax_url,\n            type: 'POST',\n            data: {\n                action: 'share_bookmark_to_activity',\n                bookmark_id: selectedBookmarkId,\n                user_content: userContent,\n                nonce: publicBookmarks.nonce\n            },\n            success: function(response) {\n                if (response.success) {\n                    \/\/ Show success message\n                    const successMsg = $('<div class=\"bp-share-success-message\">Bookmark posted successfully<\/div>');\n                    $('.bp-share-modal-body').html(successMsg);\n                    \n                    \/\/ Close modal after delay\n                    setTimeout(function() {\n                        $('#bp-share-modal').fadeOut(300);\n                        \n                        \/\/ Reset form for next use\n                        setTimeout(function() {\n                            $('#bp-share-content').val('');\n                            $('input[name=\"share_bookmark\"]').prop('checked', false);\n                            $('.bp-share-bookmark-item').removeClass('selected');\n                            $('.bp-share-modal-body').html($('.bp-share-modal-body').data('original-content'));\n                        }, 300);\n                        \n                        \/\/ Redirect to activity page if URL is provided\n                        if (response.data && response.data.activity_url) {\n                            window.location.href = response.data.activity_url;\n                        }\n                    }, 2000);\n                } else {\n                    alert(response.data.message || 'An error occurred while posting the bookmark');\n                }\n            },\n            error: function() {\n                alert('An error occurred while connecting to the server');\n            },\n            complete: function() {\n                btn.prop('disabled', false).html('<span class=\"dashicons dashicons-share\"><\/span> Share to Activity');\n            }\n        });\n    });\n    \n    \/\/ Save original content for resetting form\n    $('.bp-share-modal-body').data('original-content', $('.bp-share-modal-body').html());\n    \n    \/\/ Search functionality\n    $('#bookmark-search').on('input', function() {\n        const searchTerm = $(this).val().toLowerCase();\n        \n        $('.bookmark-card, .bookmark-list-item').each(function() {\n            const title = $(this).data('title');\n            const shouldShow = title.includes(searchTerm);\n            $(this).toggle(shouldShow);\n        });\n        \n        \/\/ Show empty state if no results\n        checkForEmptyResults();\n    });\n    \n    \/\/ Filter dropdown toggle\n    $('.filter-toggle').on('click', function() {\n        $('.filter-options').toggleClass('show');\n        \/\/ Hide other dropdowns\n        $('.sort-options').removeClass('show');\n    });\n    \n    \/\/ Sort dropdown toggle\n    $('.sort-toggle').on('click', function() {\n        $('.sort-options').toggleClass('show');\n        \/\/ Hide other dropdowns\n        $('.filter-options').removeClass('show');\n    });\n    \n    \/\/ Close dropdowns when clicking elsewhere\n    $(document).on('click', function(e) {\n        if (!$(e.target).closest('.filter-dropdown').length) {\n            $('.filter-options').removeClass('show');\n        }\n        \n        if (!$(e.target).closest('.sort-dropdown').length) {\n            $('.sort-options').removeClass('show');\n        }\n    });\n    \n    \/\/ Filter functionality\n    $('.filter-option').on('click', function() {\n        const filterType = $(this).data('type');\n        \n        \/\/ Update active filter\n        $('.filter-option').removeClass('active');\n        $(this).addClass('active');\n        \n        \/\/ Update filter label\n        $('.filter-label').text(filterType === 'all' ? 'Filter' : $(this).text());\n        \n        \/\/ Filter items\n        if (filterType === 'all') {\n            $('.bookmark-card, .bookmark-list-item').show();\n        } else {\n            $('.bookmark-card, .bookmark-list-item').each(function() {\n                const type = $(this).data('type');\n                $(this).toggle(type === filterType);\n            });\n        }\n        \n        \/\/ Hide dropdown\n        $('.filter-options').removeClass('show');\n        \n        \/\/ Check for empty results\n        checkForEmptyResults();\n    });\n    \n    \/\/ Sort functionality\n    $('.sort-option').on('click', function() {\n        const sortType = $(this).data('sort');\n        \n        \/\/ Update active sort\n        $('.sort-option').removeClass('active');\n        $(this).addClass('active');\n        \n        \/\/ Update sort label\n        $('.sort-label').text($(this).text());\n        \n        \/\/ Sort grid items\n        sortBookmarks('.bookmarks-grid', '.bookmark-card', sortType);\n        \n        \/\/ Sort list items\n        sortBookmarks('.bookmarks-list', '.bookmark-list-item', sortType);\n        \n        \/\/ Hide dropdown\n        $('.sort-options').removeClass('show');\n    });\n    \n    \/\/ Function to sort bookmarks\n    function sortBookmarks(container, itemSelector, sortType) {\n        const $container = $(container);\n        const $items = $container.find(itemSelector).toArray();\n        \n        $items.sort(function(a, b) {\n            const $a = $(a);\n            const $b = $(b);\n            \n            if (sortType === 'newest') {\n                return $b.data('date').localeCompare($a.data('date'));\n            } else if (sortType === 'oldest') {\n                return $a.data('date').localeCompare($b.data('date'));\n            } else if (sortType === 'title-az') {\n                return $a.data('title').localeCompare($b.data('title'));\n            } else if (sortType === 'title-za') {\n                return $b.data('title').localeCompare($a.data('title'));\n            }\n        });\n        \n        \/\/ Reappend in new order\n        $.each($items, function(i, item) {\n            $container.append(item);\n        });\n    }\n    \n    \/\/ Check for empty results after filtering\/searching\n    function checkForEmptyResults() {\n        const gridHasVisibleItems = $('.bookmarks-grid .bookmark-card:visible').length > 0;\n        const listHasVisibleItems = $('.bookmarks-list .bookmark-list-item:visible').length > 0;\n        \n        \/\/ Show\/hide no results message\n        if (!gridHasVisibleItems && !listHasVisibleItems) {\n            \/\/ If no results exists yet, create it\n            if ($('.no-search-results').length === 0) {\n                const noResults = $('<div class=\"no-search-results\">' +\n                                   '<span class=\"dashicons dashicons-search\"><\/span>' +\n                                   '<h3>No bookmarks match your search<\/h3>' +\n                                   '<p>Try different search terms or clear the filters<\/p>' +\n                                   '<button class=\"clear-search-btn\">Clear Search<\/button>' +\n                                   '<\/div>');\n                \n                $('.bookmarks-content').append(noResults);\n                \n                \/\/ Add click handler for clear button\n                $('.clear-search-btn').on('click', function() {\n                    $('#bookmark-search').val('');\n                    $('.filter-option[data-type=\"all\"]').click();\n                    $('.sort-option[data-sort=\"newest\"]').click();\n                    $('.bookmark-card, .bookmark-list-item').show();\n                    $('.no-search-results').remove();\n                });\n            }\n        } else {\n            $('.no-search-results').remove();\n        }\n    }\n    \n    \/\/ Edit bookmark functionality\n    $('.edit-bookmark-btn').on('click', function() {\n        const bookmarkId = $(this).data('bookmark-id');\n        const bookmarkCard = $(`.bookmark-card[data-id=\"${bookmarkId}\"]`);\n        \n        \/\/ Show edit panel within the card\n        bookmarkCard.find('.bookmark-card-inner').hide();\n        bookmarkCard.find('.bookmark-edit-panel').fadeIn(300);\n        \n        \/\/ Scroll to card if needed\n        $('html, body').animate({\n            scrollTop: bookmarkCard.offset().top - 20\n        }, 300);\n    });\n    \n    \/\/ Cancel edit button\n    $('.cancel-edit-btn').on('click', function() {\n        const bookmarkCard = $(this).closest('.bookmark-card');\n        \n        \/\/ Hide edit panel and show the card again\n        bookmarkCard.find('.bookmark-edit-panel').hide();\n        bookmarkCard.find('.bookmark-card-inner').fadeIn(300);\n    });\n    \n    \/\/ Save content button\n    $('.save-content-btn').on('click', function() {\n        const btn = $(this);\n        const bookmarkId = btn.data('bookmark-id');\n        const bookmarkCard = $(this).closest('.bookmark-card');\n        const editPanel = bookmarkCard.find('.bookmark-edit-panel');\n        const title = editPanel.find('.bookmark-title-editor').val();\n        const content = editPanel.find('.bookmark-content-editor').val();\n        const isPublic = editPanel.find('.bookmark-visibility-toggle').is(':checked') ? 1 : 0;\n        const messageArea = editPanel.find('.bookmark-message');\n        \n        \/\/ Save button loading state\n        btn.prop('disabled', true).html('<span class=\"spinner-border spinner-border-sm\"><\/span> Saving...');\n        \n        \/\/ AJAX save\n        $.ajax({\n            url: ajaxurl,\n            type: 'POST',\n            data: {\n                action: 'update_bookmark_content',\n                bookmark_id: bookmarkId,\n                title: title,\n                content: content,\n                is_public: isPublic,\n                nonce: public_bookmarks_params.nonce\n            },\n            success: function(response) {\n                if (response.success) {\n                    \/\/ Show success message\n                    messageArea.removeClass('error').addClass('success')\n                        .text('Changes saved successfully').fadeIn();\n                    \n                    \/\/ Update card content\n                    const excerpt = content.length > 100 ? content.substring(0, 100) + '...' : content;\n                    \n                    \/\/ Update title and content in both views\n                    $(`.bookmark-card[data-id=\"${bookmarkId}\"] .bookmark-title a, \n                      .bookmark-list-item[data-id=\"${bookmarkId}\"] .bookmark-title a`).text(title);\n                    \n                    $(`.bookmark-card[data-id=\"${bookmarkId}\"] .bookmark-display-content, \n                      .bookmark-list-item[data-id=\"${bookmarkId}\"] .bookmark-excerpt`).text(excerpt);\n                    \n                    \/\/ Update visibility status\n                    const visibilityText = isPublic ? 'Public' : 'Private';\n                    const visibilityIcon = isPublic ? 'dashicons-visibility' : 'dashicons-hidden';\n                    const visibilityClass = isPublic ? 'public' : 'private';\n                    \n                    $(`.bookmark-card[data-id=\"${bookmarkId}\"] .bookmark-status-badge, \n                      .bookmark-list-item[data-id=\"${bookmarkId}\"] .bookmark-visibility-status`)\n                        .removeClass('public private')\n                        .addClass(visibilityClass)\n                        .html(`<span class=\"dashicons ${visibilityIcon}\"><\/span> ${visibilityText}`);\n                    \n                    \/\/ Update data attribute for search\/filter\n                    $(`.bookmark-card[data-id=\"${bookmarkId}\"], .bookmark-list-item[data-id=\"${bookmarkId}\"]`)\n                        .data('title', title.toLowerCase());\n                    \n                    \/\/ Hide edit panel after delay\n                    setTimeout(function() {\n                        editPanel.hide();\n                        bookmarkCard.find('.bookmark-card-inner').fadeIn(300);\n                        messageArea.hide();\n                    }, 1500);\n                } else {\n                    \/\/ Show error message\n                    messageArea.removeClass('success').addClass('error')\n                        .text('An error occurred while saving changes').fadeIn();\n                }\n            },\n            error: function() {\n                \/\/ Show error message\n                messageArea.removeClass('success').addClass('error')\n                    .text('An error occurred while connecting to the server').fadeIn();\n            },\n            complete: function() {\n                \/\/ Reset button\n                btn.prop('disabled', false).html('<span class=\"dashicons dashicons-saved\"><\/span> Save Changes');\n            }\n        });\n    });\n\n    \/\/ Toggle visibility functionality\n    $('.toggle-visibility-btn').on('click', function() {\n        const btn = $(this);\n        const bookmarkId = btn.data('bookmark-id');\n        const isCurrentlyPublic = btn.data('is-public') === 1;\n        const newIsPublic = isCurrentlyPublic ? 0 : 1;\n        \n        \/\/ Add loading indicator\n        btn.addClass('loading');\n        \n        $.ajax({\n            url: ajaxurl,\n            type: 'POST',\n            data: {\n                action: 'toggle_bookmark_visibility',\n                bookmark_id: bookmarkId,\n                is_public: newIsPublic,\n                nonce: public_bookmarks_params.nonce\n            },\n            success: function(response) {\n                if (response.success) {\n                    \/\/ Update data attribute\n                    btn.data('is-public', newIsPublic);\n                    \n                    \/\/ Update button appearance\n                    const newIcon = newIsPublic ? 'dashicons-visibility' : 'dashicons-hidden';\n                    const newTitle = newIsPublic ? 'Set to Private' : 'Set to Public';\n                    \n                    btn.attr('title', newTitle)\n                       .find('.dashicons')\n                       .removeClass('dashicons-visibility dashicons-hidden')\n                       .addClass(newIcon);\n                    \n                    \/\/ Update status badges in both views\n                    const visibilityText = newIsPublic ? 'Public' : 'Private';\n                    const visibilityClass = newIsPublic ? 'public' : 'private';\n                    \n                    $(`.bookmark-card[data-id=\"${bookmarkId}\"] .bookmark-status-badge, \n                      .bookmark-list-item[data-id=\"${bookmarkId}\"] .bookmark-visibility-status`)\n                        .removeClass('public private')\n                        .addClass(visibilityClass)\n                        .html(`<span class=\"dashicons ${newIcon}\"><\/span> ${visibilityText}`);\n                    \n                    \/\/ Show success indicator briefly\n                    btn.addClass('action-success');\n                    setTimeout(function() {\n                        btn.removeClass('action-success');\n                    }, 1500);\n                } else {\n                    \/\/ Show error indicator\n                    btn.addClass('action-error');\n                    setTimeout(function() {\n                        btn.removeClass('action-error');\n                    }, 1500);\n                }\n            },\n            error: function() {\n                \/\/ Show error indicator\n                btn.addClass('action-error');\n                setTimeout(function() {\n                    btn.removeClass('action-error');\n                }, 1500);\n            },\n            complete: function() {\n                \/\/ Remove loading state\n                btn.removeClass('loading');\n            }\n        });\n    });\n});\n<\/script>\n\n<style>\n\/* Modern Redesign for My Bookmarks Dashboard *\/\n:root {\n    --primary: #4e73df;\n    --primary-light: #7796F0;\n    --primary-dark: #375cdd;\n    --success: #1cc88a;\n    --danger: #e74a3b;\n    --warning: #f6c23e;\n    --dark: #343a40;\n    --light: #f8f9fc;\n    --border: #e3e6f0;\n    --text: #5a5c69;\n    --text-light: #858796;\n    --shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n    --shadow-lg: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n    --radius: 0.35rem;\n    --transition: all 0.2s ease-in-out;\n    --black: #000000\n}\n\n\/* Main Dashboard Container *\/\n.my-bookmarks-dashboard {\n    max-width: 1200px;\n    margin: 0 auto 3rem;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n    color: var(--text);\n    line-height: 1.5;\n}\n\n\/* Header Section *\/\n.bookmarks-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 1.5rem;\n    padding-bottom: 1.5rem;\n    border-bottom: 1px solid var(--border);\n}\n\n.user-welcome {\n    display: flex;\n    align-items: center;\n    gap: 1rem;\n}\n\n.user-avatar img {\n    border-radius: 50%;\n    border: 3px solid white;\n    box-shadow: var(--shadow);\n    width: 64px;\n    height: 64px;\n}\n\n.user-info h2 {\n    margin: 0 0 0.5rem;\n    font-size: 1.5rem;\n    color: var(--dark);\n}\n\n.bookmark-stats {\n    margin: 0;\n    color: var(--text-light);\n    font-size: 0.95rem;\n}\n\n.bookmark-count {\n    font-weight: 600;\n    color: var (--primary);\n}\n\n.add-bookmark-btn {\n    padding: 0.5rem 1rem;\n    background: var(--primary);\n    color: white;\n    border: none;\n    border-radius: var(--radius);\n    font-weight: 500;\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n    cursor: pointer;\n    transition: var(--transition);\n}\n\n.add-bookmark-btn:hover {\n    background: var(--primary-dark);\n    transform: translateY(-2px);\n}\n\n\/* Toolbar (Search & Filters) *\/\n.bookmarks-toolbar {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 1.5rem;\n    flex-wrap: wrap;\n    gap: 1rem;\n}\n\n.search-bookmarks {\n    position: relative;\n    flex: 1;\n    min-width: 250px;\n}\n\n.search-icon {\n    position: absolute;\n    left: 1rem;\n    top: 50%;\n    transform: translateY(-50%);\n    color: var(--text-light);\n}\n\n#bookmark-search {\n    width: 100%;\n    padding: 0.75rem 1rem 0.75rem 2.5rem;\n    border: 1px solid var(--border);\n    border-radius: var(--radius);\n    transition: var(--transition);\n}\n\n#bookmark-search:focus {\n    outline: none;\n    border-color: var(--primary-light);\n    box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25);\n}\n\n.bookmarks-filters {\n    display: flex;\n    align-items: center;\n    gap: 0.75rem;\n}\n\n.view-switcher {\n    display: flex;\n    border: 1px solid var(--border);\n    border-radius: var(--radius);\n    overflow: hidden;\n}\n\n.view-button {\n    background: white;\n    border: none;\n    padding: 0.5rem;\n    cursor: pointer;\n    color: var(--text-light);\n    transition: var(--transition);\n}\n\n.view-button.active {\n    background: var(--primary);\n    color: white;\n}\n\n.filter-dropdown,\n.sort-dropdown {\n    position: relative;\n}\n\n.filter-toggle,\n.sort-toggle {\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n    padding: 0.5rem 1rem;\n    background: white;\n    border: 1px solid var(--border);\n    border-radius: var(--radius);\n    cursor: pointer;\n    transition: var(--transition);\n}\n\n.filter-toggle:hover,\n.sort-toggle:hover {\n    background: var(--light);\n}\n\n.filter-options,\n.sort-options {\n    position: absolute;\n    top: calc(100% + 5px);\n    right: 0;\n    background: white;\n    border-radius: var(--radius);\n    box-shadow: var(--shadow-lg);\n    min-width: 150px;\n    z-index: 100;\n    display: none;\n}\n\n.filter-options.show,\n.sort-options.show {\n    display: block;\n    animation: fadeInDown 0.3s ease forwards;\n}\n\n@keyframes fadeInDown {\n    from {\n        opacity: 0;\n        transform: translateY(-10px);\n    }\n    to {\n        opacity: 1;\n        transform: translateY(0);\n    }\n}\n\n.filter-option,\n.sort-option {\n    padding: 0.75rem 1rem;\n    cursor: pointer;\n    transition: var(--transition);\n}\n\n.filter-option:hover,\n.sort-option:hover {\n    background: var(--light);\n}\n\n.filter-option.active,\n.sort-option.active {\n    background: var(--primary);\n    color: white;\n}\n\n\/* Grid View *\/\n.bookmarks-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n    gap: 1.25rem;\n    display: none;\n}\n\n.bookmarks-grid.view-active {\n    display: grid;\n}\n\n.bookmark-card {\n    background: white;\n    border-radius: var(--radius);\n    box-shadow: var(--shadow);\n    overflow: hidden;\n    transition: var(--transition);\n    border: 1px solid var(--border);\n    position: relative;\n}\n\n.bookmark-card:hover {\n    transform: translateY(-5px);\n    box-shadow: var(--shadow-lg);\n}\n\n.bookmark-card-inner {\n    padding: 1.5rem;\n    display: flex;\n    flex-direction: column;\n    height: 100%;\n}\n\n.bookmark-type-badge {\n    position: absolute;\n    top: 1.25rem;\n    left: 1.25rem;\n    padding: 0.25rem 0.75rem;\n    background: var(--primary-light);\n    color: white;\n    border-radius: 20px;\n    font-size: 0.75rem;\n    font-weight: 500;\n    z-index: 1;\n}\n\n.category-type-badge {\n    position: absolute;\n    top: 1.25rem;\n    right: 1.25rem;\n    padding: 0.25rem 0.75rem;\n    background: var(--success);\n    color: white;\n    border-radius: 20px;\n    font-size: 0.75rem;\n    font-weight: 500;\n    z-index: 1;\n    max-width: 50%;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n}\n\n.bookmark-status-badge {\n    position: absolute;\n    top: 1.25rem;\n    right: 1.25rem;\n    display: flex;\n    align-items: center;\n    gap: 0.35rem;\n    font-size: 0.75rem;\n    font-weight: 500;\n    padding: 0.25rem 0.5rem;\n    border-radius: 20px;\n}\n\n.bookmark-actions {\n    position: absolute;\n    top: 3.5rem;\n    right: 1.25rem;\n    display: flex;\n    flex-direction: column;\n    gap: 0.75rem;\n    opacity: 0;\n    transform: translateX(10px);\n    transition: var(--transition);\n}\n\n.bookmark-card:hover .bookmark-actions {\n    opacity: 1;\n    transform: translateX(0);\n}\n\n.bookmark-action-btn {\n    width: 32px;\n    height: 32px;\n    border-radius: 50%;\n    background: white;\n    border: none;\n    box-shadow: var(--shadow);\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: var(--text);\n    cursor: pointer;\n    transition: var(--transition);\n}\n\n.bookmark-action-btn:hover {\n    background: var(--primary);\n    color: white;\n    transform: scale(1.1);\n}\n\n.bookmark-action-btn.action-success {\n    background: var(--success);\n    color: white;\n}\n\n.bookmark-action-btn.action-error {\n    background: var(--danger);\n    color: white;\n}\n\n.bookmark-action-btn.loading {\n    pointer-events: none;\n    opacity: 0.7;\n}\n\n.bookmark-title {\n    margin: 1.5rem 0 0.75rem;\n    line-height: 1.4;\n}\n\n.bookmark-title a {\n    color: var(--dark);\n    text-decoration: none;\n    font-size: 1.15rem;\n    font-weight: 600;\n}\n\n.bookmark-title a:hover {\n    color: var(--primary);\n}\n\n.bookmark-meta {\n    display: flex;\n    gap: 1rem;\n    margin-bottom: 1rem;\n    font-size: 0.85rem;\n    color: var(--text-light);\n    flex-wrap: wrap;\n}\n\n.bookmark-date {\n    display: flex;\n    align-items: center;\n    gap: 0.35rem;\n}\n\n.bookmark-content {\n    color: var(--text);\n    line-height: 1.6;\n    margin-bottom: 1.5rem;\n    flex-grow: 1;\n}\n\n.bookmark-footer {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    padding-top: 1rem;\n    margin-top: auto;\n    border-top: 1px solid var(--border);\n}\n\n.bookmark-source-link,\n.bookmark-view-link {\n    display: flex;\n    align-items: center;\n    gap: 0.35rem;\n    text-decoration: none;\n    font-size: 0.9rem;\n    transition: var(--transition);\n}\n\n.bookmark-source-link {\n    color: var (--text-light);\n}\n\n.bookmark-view-link {\n    color: var(--primary);\n    font-weight: 500;\n}\n\n.bookmark-source-link:hover,\n.bookmark-view-link:hover {\n    opacity: 0.8;\n}\n\n\/* List View *\/\n.bookmarks-list {\n    display: none;\n}\n\n.bookmarks-list.view-active {\n    display: block;\n}\n\n.bookmark-list-item {\n    background: white;\n    border: 1px solid var (--border);\n    border-radius: var(--radius);\n    box-shadow: var(--shadow);\n    margin-bottom: 1rem;\n    transition: var(--transition);\n}\n\n.bookmark-list-item:hover {\n    transform: translateY(-2px);\n    box-shadow: var(--shadow-lg);\n}\n\n.bookmark-list-inner {\n    padding: 1.25rem;\n    display: flex;\n    justify-content: space-between;\n    gap: 1rem;\n}\n\n.bookmark-list-main {\n    flex: 1;\n}\n\n.bookmark-list-item .bookmark-title {\n    margin: 0 0 0.75rem;\n}\n\n.bookmark-list-item .bookmark-title a {\n    font-size: 1.1rem;\n}\n\n.bookmark-type-pill {\n    background: var(--primary-light);\n    color: white;\n    padding: 0.15rem 0.5rem;\n    border-radius: 20px;\n    font-size: 0.75rem;\n    font-weight: 500;\n}\n\n.bookmark-list-item .bookmark-visibility-status {\n    display: inline-flex;\n    align-items: center;\n    gap: 0.25rem;\n    padding: 0.15rem 0.5rem;\n    border-radius: 20px;\n    font-size: 0.75rem;\n}\n\n.bookmark-list-item .bookmark-visibility-status.public {\n    background-color: rgba(28, 200, 138, 0.15);\n    color: var(--success);\n}\n\n.bookmark-list-item .bookmark-visibility-status.private {\n    background-color: rgba(246, 194, 62, 0.15);\n    color: var(--warning);\n}\n\n.bookmark-excerpt {\n    color: var(--text);\n    line-height: 1.5;\n    margin-top: 0.75rem;\n    display: -webkit-box;\n    -webkit-line-clamp: 2;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n}\n\n.bookmark-list-actions {\n    display: flex;\n    gap: 0.75rem;\n    align-items: flex-start;\n}\n\n.bookmark-view-btn,\n.bookmark-source-btn {\n    width: 32px;\n    height: 32px;\n    border-radius: 50%;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    color: var(--text-light);\n    background: var(--light);\n    text-decoration: none;\n    transition: var(--transition);\n}\n\n.bookmark-view-btn:hover {\n    background: var(--primary);\n    color: white;\n}\n\n.bookmark-source-btn:hover {\n    background: var(--success);\n    color: white;\n}\n\n\/* Editing Interface *\/\n.bookmark-edit-panel {\n    padding: 1.25rem;\n}\n\n.edit-panel-title {\n    margin-top: 0;\n    margin-bottom: 1.25rem;\n    color: var(--dark);\n    padding-bottom: 0.75rem;\n    border-bottom: 1px solid var(--border);\n}\n\n.edit-field {\n    margin-bottom: 1rem;\n}\n\n.edit-field label {\n    display: block;\n    margin-bottom: 0.5rem;\n    font-weight: 500;\n    color: var(--dark);\n}\n\n.bookmark-title-editor,\n.bookmark-content-editor {\n    width: 100%;\n    padding: 0.75rem;\n    border: 1px solid var(--border);\n    border-radius: var(--radius);\n    transition: var(--transition);\n}\n\n.bookmark-title-editor:focus,\n.bookmark-content-editor:focus {\n    outline: none;\n    border-color: var(--primary-light);\n    box-shadow: 0 0 0 0.2rem rgba(78, 115, 223, 0.25);\n}\n\n.bookmark-content-editor {\n    min-height: 120px;\n    font-family: inherit;\n    resize: vertical;\n}\n\n.visibility-field {\n    margin-top: 1.5rem;\n}\n\n.visibility-toggle {\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n    cursor: pointer;\n}\n.filter-label{\n    color: var(--black);\n}\n\n.dashicons dashicons-filter{\n\n}\n\n.toggle-slider {\n    position: relative;\n    width: 38px;\n    height: 20px;\n    background: var(--text-light);\n    border-radius: 20px;\n    transition: var(--transition);\n}\n\n.toggle-slider:before {\n    content: '';\n    position: absolute;\n    height: 16px;\n    width: 16px;\n    left: 2px;\n    bottom: 2px;\n    background: white;\n    border-radius: 50%;\n    transition: var(--transition);\n}\n\n.bookmark-visibility-toggle {\n    position: absolute;\n    opacity: 0;\n    width: 0;\n    height: 0;\n}\n\n.bookmark-visibility-toggle:checked + .toggle-slider {\n    background: var(--primary);\n}\n\n.bookmark-visibility-toggle:checked + .toggle-slider:before {\n    transform: translateX(18px);\n}\n\n.toggle-label {\n    font-weight: 500;\n}\n\n.field-note {\n    margin-top: 0.35rem;\n    font-size: 0.85rem;\n    color: var(--text-light);\n}\n\n.edit-actions {\n    display: flex;\n    justify-content: flex-end;\n    gap: 1rem;\n    margin-top: 2rem;\n}\n\n.cancel-edit-btn,\n.save-content-btn {\n    padding: 0.6rem 1.2rem;\n    border-radius: var(--radius);\n    border: none;\n    font-weight: 500;\n    cursor: pointer;\n    transition: var(--transition);\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n}\n\n.cancel-edit-btn {\n    background: var(--light);\n    color: var(--text);\n}\n\n.save-content-btn {\n    background: var(--primary);\n    color: white;\n}\n\n.cancel-edit-btn:hover {\n    background: #e9ebf3;\n}\n\n.save-content-btn:hover {\n    background: var(--primary-dark);\n}\n\n.bookmark-message {\n    padding: 0.75rem;\n    margin-top: 1rem;\n    border-radius: var(--radius);\n    text-align: center;\n}\n\n.bookmark-message.success {\n    background-color: rgba(28, 200, 138, 0.15);\n    color: var(--success);\n}\n\n.bookmark-message.error {\n    background-color: rgba(231, 74, 59, 0.15);\n    color: var(--danger);\n}\n\n\/* Empty States *\/\n.no-bookmarks-state,\n.no-search-results,\n.login-required {\n    text-align: center;\n    padding: 4rem 2rem;\n    background: white;\n    border-radius: var (--radius);\n    box-shadow: var(--shadow);\n}\n\n.no-bookmarks-icon,\n.no-search-results .dashicons,\n.login-icon {\n    font-size: 3rem;\n    margin-bottom: 1rem;\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    width: 5rem;\n    height: 5rem;\n    margin: 0 auto 1.5rem;\n    border-radius: 50%;\n    color: var(--primary);\n    background: rgba(78, 115, 223, 0.1);\n}\n\n.no-bookmarks-state h3,\n.no-search-results h3,\n.login-required h3 {\n    margin-top: 0;\n    margin-bottom: 0.75rem;\n    color: var(--dark);\n}\n\n.no-bookmarks-state p,\n.no-search-results p,\n.login-required p {\n    color: var(--text-light);\n    margin-bottom: 1.5rem;\n    max-width: 25rem;\n    margin-left: auto;\n    margin-right: auto;\n}\n\n.add-first-bookmark-btn,\n.clear-search-btn,\n.login-button {\n    display: inline-flex;\n    align-items: center;\n    gap: 0.5rem;\n    padding: 0.75rem 1.5rem;\n    background: var(--primary);\n    color: white;\n    border: none;\n    border-radius: var(--radius);\n    font-weight: 500;\n    cursor: pointer;\n    text-decoration: none;\n    transition: var(--transition);\n}\n\n.add-first-bookmark-btn:hover,\n.clear-search-btn:hover,\n.login-button:hover {\n    background: var(--primary-dark);\n    transform: translateY(-2px);\n}\n\n\/* Responsive Adjustments *\/\n@media (max-width: 768px) {\n    .bookmarks-header {\n        flex-direction: column;\n        align-items: flex-start;\n        gap: 1rem;\n    }\n    \n    .add-bookmark-area {\n        width: 100%;\n    }\n    \n    .add-bookmark-btn {\n        width: 100%;\n        justify-content: center;\n    }\n    \n    .bookmarks-toolbar {\n        flex-direction: column;\n        align-items: stretch;\n    }\n    \n    .bookmarks-filters {\n        justify-content: space-between;\n    }\n    \n    .bookmarks-grid {\n        grid-template-columns: 1fr;\n    }\n    \n    .bookmark-list-inner {\n        flex-direction: column;\n    }\n    \n    .bookmark-list-actions {\n        flex-direction: row;\n        justify-content: flex-end;\n        width: 100%;\n    }\n}\n\n\/* Dark Mode Support (if your site has dark mode) *\/\n@media (prefers-color-scheme: dark) {\n    body.wp-dark-mode-active .my-bookmarks-dashboard {\n        --text: #e0e0e0;\n        --text-light: #adb5bd;\n        --dark: #f8f9fa;\n        --light: #212529;\n        --border: #495057;\n    }\n    \n    body.wp-dark-mode-active .bookmark-card,\n    body.wp-dark-mode-active .bookmark-list-item,\n    body.wp-dark-mode-active .no-bookmarks-state,\n    body.wp-dark-mode-active .no-search-results,\n    body.wp-dark-mode-active .login-required {\n        background: #2b3035;\n    }\n    \n    body.wp-dark-mode-active #bookmark-search,\n    body.wp-dark-mode-active .view-button,\n    body.wp-dark-mode-active .filter-toggle,\n    body.wp-dark-mode-active .sort-toggle {\n        background: #212529;\n        color: #e0e0e0;\n    }\n    \n    body.wp-dark-mode-active .filter-options,\n    body.wp-dark-mode-active .sort-options {\n        background: #2b3035;\n    }\n}\n<\/style>\n\n<!-- You might need to include CSS for spinner animation if your WordPress theme doesn't already have it -->\n<style>\n.spinner-border {\n    display: inline-block;\n    width: 1rem;\n    height: 1rem;\n    border: 0.15em solid currentColor;\n    border-right-color: transparent;\n    border-radius: 50%;\n    animation: spinner-border 0.75s linear infinite;\n}\n\n@keyframes spinner-border {\n    to { transform: rotate(360deg); }\n}\n<\/style><\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"pmpro_default_level":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"_pvb_checkbox_block_on_post":false,"footnotes":""},"class_list":["post-9456","page","type-page","status-publish","hentry","pmpro-has-access"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Bookmark - YouZum<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/youzum.net\/zh\/bookmark\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bookmark - YouZum\" \/>\n<meta property=\"og:url\" content=\"https:\/\/youzum.net\/zh\/bookmark\/\" \/>\n<meta property=\"og:site_name\" content=\"YouZum\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/DroneAssociationTH\/\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-09T10:36:56+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/youzum.net\/bookmark\/\",\"url\":\"https:\/\/youzum.net\/bookmark\/\",\"name\":\"Bookmark - YouZum\",\"isPartOf\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#website\"},\"datePublished\":\"2025-04-30T09:51:37+00:00\",\"dateModified\":\"2025-05-09T10:36:56+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/youzum.net\/bookmark\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/youzum.net\/bookmark\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/youzum.net\/bookmark\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/youzum.net\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bookmark\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/yousum.gpucore.co\/#website\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"name\":\"YouSum\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/yousum.gpucore.co\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/yousum.gpucore.co\/#organization\",\"name\":\"Drone Association Thailand\",\"url\":\"https:\/\/yousum.gpucore.co\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"contentUrl\":\"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png\",\"width\":300,\"height\":300,\"caption\":\"Drone Association Thailand\"},\"image\":{\"@id\":\"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/DroneAssociationTH\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bookmark - YouZum","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/youzum.net\/zh\/bookmark\/","og_locale":"zh_CN","og_type":"article","og_title":"Bookmark - YouZum","og_url":"https:\/\/youzum.net\/zh\/bookmark\/","og_site_name":"YouZum","article_publisher":"https:\/\/www.facebook.com\/DroneAssociationTH\/","article_modified_time":"2025-05-09T10:36:56+00:00","twitter_card":"summary_large_image","twitter_misc":{"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"1 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/youzum.net\/bookmark\/","url":"https:\/\/youzum.net\/bookmark\/","name":"Bookmark - YouZum","isPartOf":{"@id":"https:\/\/yousum.gpucore.co\/#website"},"datePublished":"2025-04-30T09:51:37+00:00","dateModified":"2025-05-09T10:36:56+00:00","breadcrumb":{"@id":"https:\/\/youzum.net\/bookmark\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/youzum.net\/bookmark\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/youzum.net\/bookmark\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/youzum.net\/"},{"@type":"ListItem","position":2,"name":"Bookmark"}]},{"@type":"WebSite","@id":"https:\/\/yousum.gpucore.co\/#website","url":"https:\/\/yousum.gpucore.co\/","name":"YouSum","description":"","publisher":{"@id":"https:\/\/yousum.gpucore.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/yousum.gpucore.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":"Organization","@id":"https:\/\/yousum.gpucore.co\/#organization","name":"Drone Association Thailand","url":"https:\/\/yousum.gpucore.co\/","logo":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/","url":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","contentUrl":"https:\/\/youzum.net\/wp-content\/uploads\/2024\/11\/tranparent-logo.png","width":300,"height":300,"caption":"Drone Association Thailand"},"image":{"@id":"https:\/\/yousum.gpucore.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/DroneAssociationTH\/"]}]}},"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"admin NU","author_link":"https:\/\/youzum.net\/zh\/members\/adminnu\/"},"rttpg_comment":0,"rttpg_category":null,"rttpg_excerpt":null,"_links":{"self":[{"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/pages\/9456","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/comments?post=9456"}],"version-history":[{"count":0,"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/pages\/9456\/revisions"}],"wp:attachment":[{"href":"https:\/\/youzum.net\/zh\/wp-json\/wp\/v2\/media?parent=9456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}